1: 2021-09-12 (Sun) 04:10:11 iseki  |
Cur: 2021-09-12 (Sun) 04:28:01 iseki  |
| | *** ユーザ設定 [#t64dea8f] | | *** ユーザ設定 [#t64dea8f] |
| | + | **** 動いた設定 [#l33691b1] |
| | singleuser: | | singleuser: |
| | image: | | image: |
| | tag: latest | | tag: latest |
| | defaultUrl: "/lab" | | defaultUrl: "/lab" |
| | + | |
| | hub: | | hub: |
| | db: | | db: |
| | type: sqlite-memory | | type: sqlite-memory |
| | + | #br |
| | + | |
| | + | **** 動かなかった設定(環境によるのかもしれない) [#wc37a185] |
| | + | # |
| | + | proxy: |
| | + | secretToken: "xxxxxxxxxxxxxx" |
| | + | |
| | + | #singleuser: |
| | + | ## storage: |
| | + | # dynamic: |
| | + | # storageClass: local-storage |
| | + | # persistentVolumeClaim: |
| | + | # claimName: standard |
| | + | |
| | + | hub: |
| | + | config: |
| | + | Authenticator: |
| | + | auto_login: "true" |
| | + | # extraVolumes: |
| | + | # - name: hub-db-dir |
| | + | # persistentVolumeClaim: |
| | + | # claimName: local-pvc |
| | + | |
| | + | singleuser: |
| | + | image: |
| | + | # You should replace the "latest" tag with a fixed version from: |
| | + | # https://hub.docker.com/r/jupyter/datascience-notebook/tags/ |
| | + | # Inspect the Dockerfile at: |
| | + | # https://github.com/jupyter/docker-stacks/tree/HEAD/datascience-notebook/Dockerfile |
| | + | name: jupyter/datascience-notebook |
| | + | tag: latest |
| | + | defaultUrl: "/lab" |
| | + | storage: |
| | + | # type: none |
| | + | dynamic: |
| | + | storageClass: local-storage |
| | + | |
| | + | # dynamic: |
| | + | # storageClass: local-storage |
| | + | |
| | + | *** Full Setting [#o1803dfe] |
| | + | - helm inspect values jupyterhub/jupyterhub > config2.yaml |
| | + | |
| | + | - 動いたやつ |
| | + | |
| | + | # fullnameOverride and nameOverride distinguishes blank strings, null values, |
| | + | # and non-blank strings. For more details, see the configuration reference. |
| | + | fullnameOverride: \\"\\" |
| | + | nameOverride: |
| | + | |
| | + | # custom can contain anything you want to pass to the hub pod, as all passed |
| | + | # Helm template values will be made available there. |
| | + | custom: {} |
| | + | |
| | + | # imagePullSecret is configuration to create a k8s Secret that Helm chart\\\'s pods |
| | + | # can get credentials from to pull their images. |
| | + | imagePullSecret: |
| | + | create: false |
| | + | automaticReferenceInjection: true |
| | + | registry: |
| | + | username: |
| | + | password: |
| | + | email: |
| | + | # imagePullSecrets is configuration to reference the k8s Secret resources the |
| | + | # Helm chart\\\'s pods can get credentials from to pull their images. |
| | + | imagePullSecrets: [] |
| | + | |
| | + | # hub relates to the hub pod, responsible for running JupyterHub, its configured |
| | + | # Authenticator class KubeSpawner, and its configured Proxy class |
| | + | # ConfigurableHTTPProxy. KubeSpawner creates the user pods, and |
| | + | # ConfigurableHTTPProxy speaks with the actual ConfigurableHTTPProxy server in |
| | + | # the proxy pod. |
| | + | hub: |
| | + | config: |
| | + | JupyterHub: |
| | + | admin_access: true |
| | + | authenticator_class: dummy |
| | + | service: |
| | + | type: ClusterIP |
| | + | annotations: {} |
| | + | ports: |
| | + | nodePort: |
| | + | extraPorts: [] |
| | + | loadBalancerIP: |
| | + | baseUrl: / |
| | + | cookieSecret: |
| | + | initContainers: [] |
| | + | fsGid: 1000 |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | concurrentSpawnLimit: 64 |
| | + | consecutiveFailureLimit: 5 |
| | + | activeServerLimit: |
| | + | deploymentStrategy: |
| | + | ## type: Recreate |
| | + | ## - sqlite-pvc backed hubs require the Recreate deployment strategy as a |
| | + | ## typical PVC storage can only be bound to one pod at the time. |
| | + | ## - JupyterHub isn\\\'t designed to support being run in parallell. More work |
| | + | ## needs to be done in JupyterHub itself for a fully highly available (HA) |
| | + | ## deployment of JupyterHub on k8s is to be possible. |
| | + | type: Recreate |
| | + | db: |
| | + | type: sqlite-pvc |
| | + | upgrade: |
| | + | pvc: |
| | + | annotations: {} |
| | + | selector: {} |
| | + | accessModes: |
| | + | - ReadWriteOnce |
| | + | storage: 1Gi |
| | + | subPath: |
| | + | storageClassName: |
| | + | url: |
| | + | password: |
| | + | labels: {} |
| | + | annotations: {} |
| | + | command: [] |
| | + | args: [] |
| | + | extraConfig: {} |
| | + | extraFiles: {} |
| | + | extraEnv: {} |
| | + | extraContainers: [] |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | image: |
| | + | name: jupyterhub/k8s-hub |
| | + | tag: \\"1.1.3\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | resources: {} |
| | + | containerSecurityContext: |
| | + | runAsUser: 1000 |
| | + | runAsGroup: 1000 |
| | + | allowPrivilegeEscalation: false |
| | + | lifecycle: {} |
| | + | services: {} |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | ## egress for JupyterHub already includes Kubernetes internal DNS and |
| | + | ## access to the proxy, but can be restricted further, but ensure to allow |
| | + | ## access to the Kubernetes API server that couldn\\\'t be pinned ahead of |
| | + | ## time. |
| | + | ## |
| | + | ## ref: https://stackoverflow.com/a/59016417/2220152 |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [] |
| | + | allowNamedServers: false |
| | + | namedServerLimitPerUser: |
| | + | authenticatePrometheus: |
| | + | redirectToServer: |
| | + | shutdownOnLogout: |
| | + | templatePaths: [] |
| | + | templateVars: {} |
| | + | livenessProbe: |
| | + | # The livenessProbe\\\'s aim to give JupyterHub sufficient time to startup but |
| | + | # be able to restart if it becomes unresponsive for ~5 min. |
| | + | enabled: true |
| | + | initialDelaySeconds: 300 |
| | + | periodSeconds: 10 |
| | + | failureThreshold: 30 |
| | + | timeoutSeconds: 3 |
| | + | readinessProbe: |
| | + | # The readinessProbe\\\'s aim is to provide a successful startup indication, |
| | + | # but following that never become unready before its livenessProbe fail and |
| | + | # restarts it if needed. To become unready following startup serves no |
| | + | # purpose as there are no other pod to fallback to in our non-HA deployment. |
| | + | enabled: true |
| | + | initialDelaySeconds: 0 |
| | + | periodSeconds: 2 |
| | + | failureThreshold: 1000 |
| | + | timeoutSeconds: 1 |
| | + | existingSecret: |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | |
| | + | rbac: |
| | + | enabled: true |
| | + | |
| | + | # proxy relates to the proxy pod, the proxy-public service, and the autohttps |
| | + | # pod and proxy-http service. |
| | + | proxy: |
| | + | secretToken: |
| | + | annotations: {} |
| | + | deploymentStrategy: |
| | + | ## type: Recreate |
| | + | ## - JupyterHub\\\'s interaction with the CHP proxy becomes a lot more robust |
| | + | ## with this configuration. To understand this, consider that JupyterHub |
| | + | ## during startup will interact a lot with the k8s service to reach a |
| | + | ## ready proxy pod. If the hub pod during a helm upgrade is restarting |
| | + | ## directly while the proxy pod is making a rolling upgrade, the hub pod |
| | + | ## could end up running a sequence of interactions with the old proxy pod |
| | + | ## and finishing up the sequence of interactions with the new proxy pod. |
| | + | ## As CHP proxy pods carry individual state this is very error prone. One |
| | + | ## outcome when not using Recreate as a strategy has been that user pods |
| | + | ## have been deleted by the hub pod because it considered them unreachable |
| | + | ## as it only configured the old proxy pod but not the new before trying |
| | + | ## to reach them. |
| | + | type: Recreate |
| | + | ## rollingUpdate: |
| | + | ## - WARNING: |
| | + | ## This is required to be set explicitly blank! Without it being |
| | + | ## explicitly blank, k8s will let eventual old values under rollingUpdate |
| | + | ## remain and then the Deployment becomes invalid and a helm upgrade would |
| | + | ## fail with an error like this: |
| | + | ## |
| | + | ## UPGRADE FAILED |
| | + | ## Error: Deployment.apps \\"proxy\\" is invalid: spec.strategy.rollingUpdate: Forbidden: may not be specified when strategy `type` is \\\'Recreate\\\' |
| | + | ## Error: UPGRADE FAILED: Deployment.apps \\"proxy\\" is invalid: spec.strategy.rollingUpdate: Forbidden: may not be specified when strategy `type` is \\\'Recreate\\\' |
| | + | rollingUpdate: |
| | + | # service relates to the proxy-public service |
| | + | service: |
| | + | type: LoadBalancer |
| | + | labels: {} |
| | + | annotations: {} |
| | + | nodePorts: |
| | + | http: |
| | + | https: |
| | + | disableHttpPort: false |
| | + | extraPorts: [] |
| | + | loadBalancerIP: |
| | + | loadBalancerSourceRanges: [] |
| | + | # chp relates to the proxy pod, which is responsible for routing traffic based |
| | + | # on dynamic configuration sent from JupyterHub to CHP\\\'s REST API. |
| | + | chp: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: jupyterhub/configurable-http-proxy |
| | + | tag: 4.5.0 # https://github.com/jupyterhub/configurable-http-proxy/releases |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | extraCommandLineFlags: [] |
| | + | livenessProbe: |
| | + | enabled: true |
| | + | initialDelaySeconds: 60 |
| | + | periodSeconds: 10 |
| | + | readinessProbe: |
| | + | enabled: true |
| | + | initialDelaySeconds: 0 |
| | + | periodSeconds: 2 |
| | + | failureThreshold: 1000 |
| | + | resources: {} |
| | + | defaultTarget: |
| | + | errorTarget: |
| | + | extraEnv: {} |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [http, https] |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | extraPodSpec: {} |
| | + | # traefik relates to the autohttps pod, which is responsible for TLS |
| | + | # termination when proxy.https.type=letsencrypt. |
| | + | traefik: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: traefik |
| | + | tag: v2.4.11 # ref: https://hub.docker.com/_/traefik?tab=tags |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | hsts: |
| | + | includeSubdomains: false |
| | + | preload: false |
| | + | maxAge: 15724800 # About 6 months |
| | + | resources: {} |
| | + | labels: {} |
| | + | extraEnv: {} |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | extraStaticConfig: {} |
| | + | extraDynamicConfig: {} |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | extraPorts: [] |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [http, https] |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | secretSync: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: jupyterhub/k8s-secret-sync |
| | + | tag: \\"1.1.3\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | resources: {} |
| | + | labels: {} |
| | + | https: |
| | + | enabled: false |
| | + | type: letsencrypt |
| | + | #type: letsencrypt, manual, offload, secret |
| | + | letsencrypt: |
| | + | contactEmail: |
| | + | # Specify custom server here (https://acme-staging-v02.api.letsencrypt.org/directory) to hit staging LE |
| | + | acmeServer: https://acme-v02.api.letsencrypt.org/directory |
| | + | manual: |
| | + | key: |
| | + | cert: |
| | + | secret: |
| | + | name: |
| | + | key: tls.key |
| | + | crt: tls.crt |
| | + | hosts: [] |
| | + | |
| | + | # singleuser relates to the configuration of KubeSpawner which runs in the hub |
| | + | # pod, and its spawning of user pods such as jupyter-myusername. |
| | + | singleuser: |
| | + | podNameTemplate: |
| | + | extraTolerations: [] |
| | + | nodeSelector: {} |
| | + | extraNodeAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | extraPodAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | extraPodAntiAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | networkTools: |
| | + | image: |
| | + | name: jupyterhub/k8s-network-tools |
| | + | tag: \\"1.1.3\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | cloudMetadata: |
| | + | # block set to true will append a privileged initContainer using the |
| | + | # iptables to block the sensitive metadata server at the provided ip. |
| | + | blockWithIptables: true |
| | + | ip: 169.254.169.254 |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | # Required egress to communicate with the hub and DNS servers will be |
| | + | # augmented to these egress rules. |
| | + | # |
| | + | # This default rule explicitly allows all outbound traffic from singleuser |
| | + | # pods, except to a typical IP used to return metadata that can be used by |
| | + | # someone with malicious intent. |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | except: |
| | + | - 169.254.169.254/32 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [] |
| | + | events: true |
| | + | extraAnnotations: {} |
| | + | extraLabels: |
| | + | hub.jupyter.org/network-access-hub: \\"true\\" |
| | + | extraFiles: {} |
| | + | extraEnv: {} |
| | + | lifecycleHooks: {} |
| | + | initContainers: [] |
| | + | extraContainers: [] |
| | + | uid: 1000 |
| | + | fsGid: 100 |
| | + | serviceAccountName: |
| | + | storage: |
| | + | type: dynamic |
| | + | extraLabels: {} |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | static: |
| | + | pvcName: |
| | + | subPath: \\"{username}\\" |
| | + | capacity: 10Gi |
| | + | homeMountPath: /home/jovyan |
| | + | dynamic: |
| | + | storageClass: |
| | + | pvcNameTemplate: claim-{username}{servername} |
| | + | volumeNameTemplate: volume-{username}{servername} |
| | + | storageAccessModes: [ReadWriteOnce] |
| | + | image: |
| | + | name: jupyterhub/k8s-singleuser-sample |
| | + | tag: \\"1.1.3\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | startTimeout: 300 |
| | + | cpu: |
| | + | limit: |
| | + | guarantee: |
| | + | memory: |
| | + | limit: |
| | + | guarantee: 1G |
| | + | extraResource: |
| | + | limits: {} |
| | + | guarantees: {} |
| | + | cmd: jupyterhub-singleuser |
| | + | defaultUrl: |
| | + | extraPodConfig: {} |
| | + | profileList: [] |
| | + | |
| | + | # scheduling relates to the user-scheduler pods and user-placeholder pods. |
| | + | scheduling: |
| | + | userScheduler: |
| | + | enabled: true |
| | + | replicas: 2 |
| | + | logLevel: 4 |
| | + | # plugins ref: https://kubernetes.io/docs/reference/scheduling/config/#scheduling-plugins-1 |
| | + | plugins: |
| | + | score: |
| | + | disabled: |
| | + | - name: SelectorSpread |
| | + | - name: TaintToleration |
| | + | - name: PodTopologySpread |
| | + | - name: NodeResourcesBalancedAllocation |
| | + | - name: NodeResourcesLeastAllocated |
| | + | # Disable plugins to be allowed to enable them again with a different |
| | + | # weight and avoid an error. |
| | + | - name: NodePreferAvoidPods |
| | + | - name: NodeAffinity |
| | + | - name: InterPodAffinity |
| | + | - name: ImageLocality |
| | + | enabled: |
| | + | - name: NodePreferAvoidPods |
| | + | weight: 161051 |
| | + | - name: NodeAffinity |
| | + | weight: 14631 |
| | + | - name: InterPodAffinity |
| | + | weight: 1331 |
| | + | - name: NodeResourcesMostAllocated |
| | + | weight: 121 |
| | + | - name: ImageLocality |
| | + | weight: 11 |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | # IMPORTANT: Bumping the minor version of this binary should go hand in |
| | + | # hand with an inspection of the user-scheduelrs RBAC resources |
| | + | # that we have forked. |
| | + | name: k8s.gcr.io/kube-scheduler |
| | + | tag: v1.19.13 # ref: https://github.com/kubernetes/website/blob/main/content/en/releases/patch-releases.md |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | pdb: |
| | + | enabled: true |
| | + | maxUnavailable: 1 |
| | + | minAvailable: |
| | + | resources: {} |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | podPriority: |
| | + | enabled: false |
| | + | globalDefault: false |
| | + | defaultPriority: 0 |
| | + | userPlaceholderPriority: -10 |
| | + | userPlaceholder: |
| | + | enabled: true |
| | + | image: |
| | + | name: k8s.gcr.io/pause |
| | + | # tag\\\'s can be updated by inspecting the output of the command: |
| | + | # gcloud container images list-tags k8s.gcr.io/pause --sort-by=~tags |
| | + | # |
| | + | # If you update this, also update prePuller.pause.image.tag |
| | + | tag: \\"3.5\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | replicas: 0 |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | resources: {} |
| | + | corePods: |
| | + | tolerations: |
| | + | - key: hub.jupyter.org/dedicated |
| | + | operator: Equal |
| | + | value: core |
| | + | effect: NoSchedule |
| | + | - key: hub.jupyter.org_dedicated |
| | + | operator: Equal |
| | + | value: core |
| | + | effect: NoSchedule |
| | + | nodeAffinity: |
| | + | matchNodePurpose: prefer |
| | + | userPods: |
| | + | tolerations: |
| | + | - key: hub.jupyter.org/dedicated |
| | + | operator: Equal |
| | + | value: user |
| | + | effect: NoSchedule |
| | + | - key: hub.jupyter.org_dedicated |
| | + | operator: Equal |
| | + | value: user |
| | + | effect: NoSchedule |
| | + | nodeAffinity: |
| | + | matchNodePurpose: prefer |
| | + | |
| | + | # prePuller relates to the hook|continuous-image-puller DaemonsSets |
| | + | prePuller: |
| | + | annotations: {} |
| | + | resources: {} |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | extraTolerations: [] |
| | + | # hook relates to the hook-image-awaiter Job and hook-image-puller DaemonSet |
| | + | hook: |
| | + | enabled: true |
| | + | pullOnlyOnChanges: true |
| | + | # image and the configuration below relates to the hook-image-awaiter Job |
| | + | image: |
| | + | name: jupyterhub/k8s-image-awaiter |
| | + | tag: \\"1.1.3\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | podSchedulingWaitDuration: 10 |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | resources: {} |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | continuous: |
| | + | enabled: true |
| | + | pullProfileListImages: true |
| | + | extraImages: {} |
| | + | pause: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: k8s.gcr.io/pause |
| | + | # tag\\\'s can be updated by inspecting the output of the command: |
| | + | # gcloud container images list-tags k8s.gcr.io/pause --sort-by=~tags |
| | + | # |
| | + | # If you update this, also update scheduling.userPlaceholder.image.tag |
| | + | tag: \\"3.5\\" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | |
| | + | ingress: |
| | + | enabled: false |
| | + | annotations: {} |
| | + | hosts: [] |
| | + | pathSuffix: |
| | + | pathType: Prefix |
| | + | tls: [] |
| | + | |
| | + | # cull relates to the jupyterhub-idle-culler service, responsible for evicting |
| | + | # inactive singleuser pods. |
| | + | # |
| | + | # The configuration below, except for enabled, corresponds to command-line flags |
| | + | # for jupyterhub-idle-culler as documented here: |
| | + | # https://github.com/jupyterhub/jupyterhub-idle-culler#as-a-standalone-script |
| | + | # |
| | + | cull: |
| | + | enabled: true |
| | + | users: false # --cull-users |
| | + | removeNamedServers: false # --remove-named-servers |
| | + | timeout: 3600 # --timeout |
| | + | every: 600 # --cull-every |
| | + | concurrency: 10 # --concurrency |
| | + | maxAge: 0 # --max-age |
| | + | |
| | + | debug: |
| | + | enabled: false |
| | + | |
| | + | global: |
| | + | safeToShowValues: false |
| | + | |
| | + | - 動かなたっかやつ [#yc0bffa5] |
| | + | |
| | + | # fullnameOverride and nameOverride distinguishes blank strings, null values, |
| | + | # and non-blank strings. For more details, see the configuration reference. |
| | + | fullnameOverride: "" |
| | + | nameOverride: |
| | + | |
| | + | # custom can contain anything you want to pass to the hub pod, as all passed |
| | + | # Helm template values will be made available there. |
| | + | custom: {} |
| | + | |
| | + | # imagePullSecret is configuration to create a k8s Secret that Helm chart's pods |
| | + | # can get credentials from to pull their images. |
| | + | imagePullSecret: |
| | + | create: false |
| | + | automaticReferenceInjection: true |
| | + | registry: |
| | + | username: |
| | + | password: |
| | + | email: |
| | + | # imagePullSecrets is configuration to reference the k8s Secret resources the |
| | + | # Helm chart's pods can get credentials from to pull their images. |
| | + | imagePullSecrets: [] |
| | + | |
| | + | # hub relates to the hub pod, responsible for running JupyterHub, its configured |
| | + | # Authenticator class KubeSpawner, and its configured Proxy class |
| | + | # ConfigurableHTTPProxy. KubeSpawner creates the user pods, and |
| | + | # ConfigurableHTTPProxy speaks with the actual ConfigurableHTTPProxy server in |
| | + | # the proxy pod. |
| | + | hub: |
| | + | config: |
| | + | JupyterHub: |
| | + | admin_access: true |
| | + | authenticator_class: dummy |
| | + | service: |
| | + | type: ClusterIP |
| | + | annotations: {} |
| | + | ports: |
| | + | nodePort: |
| | + | extraPorts: [] |
| | + | loadBalancerIP: |
| | + | baseUrl: / |
| | + | cookieSecret: |
| | + | initContainers: [] |
| | + | fsGid: 1000 |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | concurrentSpawnLimit: 64 |
| | + | consecutiveFailureLimit: 5 |
| | + | activeServerLimit: |
| | + | deploymentStrategy: |
| | + | ## type: Recreate |
| | + | ## - sqlite-pvc backed hubs require the Recreate deployment strategy as a |
| | + | ## typical PVC storage can only be bound to one pod at the time. |
| | + | ## - JupyterHub isn't designed to support being run in parallell. More work |
| | + | ## needs to be done in JupyterHub itself for a fully highly available (HA) |
| | + | ## deployment of JupyterHub on k8s is to be possible. |
| | + | type: Recreate |
| | + | db: |
| | + | type: sqlite-pvc |
| | + | upgrade: |
| | + | pvc: |
| | + | annotations: {} |
| | + | selector: {} |
| | + | accessModes: |
| | + | - ReadWriteOnce |
| | + | storage: 1Gi |
| | + | subPath: |
| | + | storageClassName: |
| | + | url: |
| | + | password: |
| | + | labels: {} |
| | + | annotations: {} |
| | + | command: [] |
| | + | args: [] |
| | + | extraConfig: {} |
| | + | extraFiles: {} |
| | + | extraEnv: {} |
| | + | extraContainers: [] |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | image: |
| | + | name: jupyterhub/k8s-hub |
| | + | tag: "1.1.3" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | resources: {} |
| | + | containerSecurityContext: |
| | + | runAsUser: 1000 |
| | + | runAsGroup: 1000 |
| | + | allowPrivilegeEscalation: false |
| | + | lifecycle: {} |
| | + | services: {} |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | ## egress for JupyterHub already includes Kubernetes internal DNS and |
| | + | ## access to the proxy, but can be restricted further, but ensure to allow |
| | + | ## access to the Kubernetes API server that couldn't be pinned ahead of |
| | + | ## time. |
| | + | ## |
| | + | ## ref: https://stackoverflow.com/a/59016417/2220152 |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [] |
| | + | allowNamedServers: false |
| | + | namedServerLimitPerUser: |
| | + | authenticatePrometheus: |
| | + | redirectToServer: |
| | + | shutdownOnLogout: |
| | + | templatePaths: [] |
| | + | templateVars: {} |
| | + | livenessProbe: |
| | + | # The livenessProbe's aim to give JupyterHub sufficient time to startup but |
| | + | # be able to restart if it becomes unresponsive for ~5 min. |
| | + | enabled: true |
| | + | initialDelaySeconds: 300 |
| | + | periodSeconds: 10 |
| | + | failureThreshold: 30 |
| | + | timeoutSeconds: 3 |
| | + | readinessProbe: |
| | + | # The readinessProbe's aim is to provide a successful startup indication, |
| | + | # but following that never become unready before its livenessProbe fail and |
| | + | # restarts it if needed. To become unready following startup serves no |
| | + | # purpose as there are no other pod to fallback to in our non-HA deployment. |
| | + | enabled: true |
| | + | initialDelaySeconds: 0 |
| | + | periodSeconds: 2 |
| | + | failureThreshold: 1000 |
| | + | timeoutSeconds: 1 |
| | + | existingSecret: |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | |
| | + | rbac: |
| | + | enabled: true |
| | + | |
| | + | # proxy relates to the proxy pod, the proxy-public service, and the autohttps |
| | + | # pod and proxy-http service. |
| | + | proxy: |
| | + | secretToken: |
| | + | annotations: {} |
| | + | deploymentStrategy: |
| | + | ## type: Recreate |
| | + | ## - JupyterHub's interaction with the CHP proxy becomes a lot more robust |
| | + | ## with this configuration. To understand this, consider that JupyterHub |
| | + | ## during startup will interact a lot with the k8s service to reach a |
| | + | ## ready proxy pod. If the hub pod during a helm upgrade is restarting |
| | + | ## directly while the proxy pod is making a rolling upgrade, the hub pod |
| | + | ## could end up running a sequence of interactions with the old proxy pod |
| | + | ## and finishing up the sequence of interactions with the new proxy pod. |
| | + | ## As CHP proxy pods carry individual state this is very error prone. One |
| | + | ## outcome when not using Recreate as a strategy has been that user pods |
| | + | ## have been deleted by the hub pod because it considered them unreachable |
| | + | ## as it only configured the old proxy pod but not the new before trying |
| | + | ## to reach them. |
| | + | type: Recreate |
| | + | ## rollingUpdate: |
| | + | ## - WARNING: |
| | + | ## This is required to be set explicitly blank! Without it being |
| | + | ## explicitly blank, k8s will let eventual old values under rollingUpdate |
| | + | ## remain and then the Deployment becomes invalid and a helm upgrade would |
| | + | ## fail with an error like this: |
| | + | ## |
| | + | ## UPGRADE FAILED |
| | + | ## Error: Deployment.apps "proxy" is invalid: spec.strategy.rollingUpdate: Forbidden: may not be specified when strategy `type` is 'Recreate' |
| | + | ## Error: UPGRADE FAILED: Deployment.apps "proxy" is invalid: spec.strategy.rollingUpdate: Forbidden: may not be specified when strategy `type` is 'Recreate' |
| | + | rollingUpdate: |
| | + | # service relates to the proxy-public service |
| | + | service: |
| | + | type: LoadBalancer |
| | + | labels: {} |
| | + | annotations: {} |
| | + | nodePorts: |
| | + | http: |
| | + | https: |
| | + | disableHttpPort: false |
| | + | extraPorts: [] |
| | + | loadBalancerIP: |
| | + | loadBalancerSourceRanges: [] |
| | + | # chp relates to the proxy pod, which is responsible for routing traffic based |
| | + | # on dynamic configuration sent from JupyterHub to CHP's REST API. |
| | + | chp: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: jupyterhub/configurable-http-proxy |
| | + | tag: 4.5.0 # https://github.com/jupyterhub/configurable-http-proxy/releases |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | extraCommandLineFlags: [] |
| | + | livenessProbe: |
| | + | enabled: true |
| | + | initialDelaySeconds: 60 |
| | + | periodSeconds: 10 |
| | + | readinessProbe: |
| | + | enabled: true |
| | + | initialDelaySeconds: 0 |
| | + | periodSeconds: 2 |
| | + | failureThreshold: 1000 |
| | + | resources: {} |
| | + | defaultTarget: |
| | + | errorTarget: |
| | + | extraEnv: {} |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [http, https] |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | extraPodSpec: {} |
| | + | # traefik relates to the autohttps pod, which is responsible for TLS |
| | + | # termination when proxy.https.type=letsencrypt. |
| | + | traefik: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: traefik |
| | + | tag: v2.4.11 # ref: https://hub.docker.com/_/traefik?tab=tags |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | hsts: |
| | + | includeSubdomains: false |
| | + | preload: false |
| | + | maxAge: 15724800 # About 6 months |
| | + | resources: {} |
| | + | labels: {} |
| | + | extraEnv: {} |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | extraStaticConfig: {} |
| | + | extraDynamicConfig: {} |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | extraPorts: [] |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [http, https] |
| | + | pdb: |
| | + | enabled: false |
| | + | maxUnavailable: |
| | + | minAvailable: 1 |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | secretSync: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: jupyterhub/k8s-secret-sync |
| | + | tag: "1.1.3" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | resources: {} |
| | + | labels: {} |
| | + | https: |
| | + | enabled: false |
| | + | type: letsencrypt |
| | + | #type: letsencrypt, manual, offload, secret |
| | + | letsencrypt: |
| | + | contactEmail: |
| | + | # Specify custom server here (https://acme-staging-v02.api.letsencrypt.org/directory) to hit staging LE |
| | + | acmeServer: https://acme-v02.api.letsencrypt.org/directory |
| | + | manual: |
| | + | key: |
| | + | cert: |
| | + | secret: |
| | + | name: |
| | + | key: tls.key |
| | + | crt: tls.crt |
| | + | hosts: [] |
| | + | |
| | + | # singleuser relates to the configuration of KubeSpawner which runs in the hub |
| | + | # pod, and its spawning of user pods such as jupyter-myusername. |
| | + | singleuser: |
| | + | podNameTemplate: |
| | + | extraTolerations: [] |
| | + | nodeSelector: {} |
| | + | extraNodeAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | extraPodAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | extraPodAntiAffinity: |
| | + | required: [] |
| | + | preferred: [] |
| | + | networkTools: |
| | + | image: |
| | + | name: jupyterhub/k8s-network-tools |
| | + | tag: "1.1.3" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | cloudMetadata: |
| | + | # block set to true will append a privileged initContainer using the |
| | + | # iptables to block the sensitive metadata server at the provided ip. |
| | + | blockWithIptables: true |
| | + | ip: 169.254.169.254 |
| | + | networkPolicy: |
| | + | enabled: true |
| | + | ingress: [] |
| | + | egress: |
| | + | # Required egress to communicate with the hub and DNS servers will be |
| | + | # augmented to these egress rules. |
| | + | # |
| | + | # This default rule explicitly allows all outbound traffic from singleuser |
| | + | # pods, except to a typical IP used to return metadata that can be used by |
| | + | # someone with malicious intent. |
| | + | - to: |
| | + | - ipBlock: |
| | + | cidr: 0.0.0.0/0 |
| | + | except: |
| | + | - 169.254.169.254/32 |
| | + | interNamespaceAccessLabels: ignore |
| | + | allowedIngressPorts: [] |
| | + | events: true |
| | + | extraAnnotations: {} |
| | + | extraLabels: |
| | + | hub.jupyter.org/network-access-hub: "true" |
| | + | extraFiles: {} |
| | + | extraEnv: {} |
| | + | lifecycleHooks: {} |
| | + | initContainers: [] |
| | + | extraContainers: [] |
| | + | uid: 1000 |
| | + | fsGid: 100 |
| | + | serviceAccountName: |
| | + | storage: |
| | + | type: dynamic |
| | + | extraLabels: {} |
| | + | extraVolumes: [] |
| | + | extraVolumeMounts: [] |
| | + | static: |
| | + | pvcName: |
| | + | subPath: "{username}" |
| | + | capacity: 10Gi |
| | + | homeMountPath: /home/jovyan |
| | + | dynamic: |
| | + | storageClass: |
| | + | pvcNameTemplate: claim-{username}{servername} |
| | + | volumeNameTemplate: volume-{username}{servername} |
| | + | storageAccessModes: [ReadWriteOnce] |
| | + | image: |
| | + | name: jupyterhub/k8s-singleuser-sample |
| | + | tag: "1.1.3" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | startTimeout: 300 |
| | + | cpu: |
| | + | limit: |
| | + | guarantee: |
| | + | memory: |
| | + | limit: |
| | + | guarantee: 1G |
| | + | extraResource: |
| | + | limits: {} |
| | + | guarantees: {} |
| | + | cmd: jupyterhub-singleuser |
| | + | defaultUrl: |
| | + | extraPodConfig: {} |
| | + | profileList: [] |
| | + | |
| | + | # scheduling relates to the user-scheduler pods and user-placeholder pods. |
| | + | scheduling: |
| | + | userScheduler: |
| | + | enabled: true |
| | + | replicas: 2 |
| | + | logLevel: 4 |
| | + | # plugins ref: https://kubernetes.io/docs/reference/scheduling/config/#scheduling-plugins-1 |
| | + | plugins: |
| | + | score: |
| | + | disabled: |
| | + | - name: SelectorSpread |
| | + | - name: TaintToleration |
| | + | - name: PodTopologySpread |
| | + | - name: NodeResourcesBalancedAllocation |
| | + | - name: NodeResourcesLeastAllocated |
| | + | # Disable plugins to be allowed to enable them again with a different |
| | + | # weight and avoid an error. |
| | + | - name: NodePreferAvoidPods |
| | + | - name: NodeAffinity |
| | + | - name: InterPodAffinity |
| | + | - name: ImageLocality |
| | + | enabled: |
| | + | - name: NodePreferAvoidPods |
| | + | weight: 161051 |
| | + | - name: NodeAffinity |
| | + | weight: 14631 |
| | + | - name: InterPodAffinity |
| | + | weight: 1331 |
| | + | - name: NodeResourcesMostAllocated |
| | + | weight: 121 |
| | + | - name: ImageLocality |
| | + | weight: 11 |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | # IMPORTANT: Bumping the minor version of this binary should go hand in |
| | + | # hand with an inspection of the user-scheduelrs RBAC resources |
| | + | # that we have forked. |
| | + | name: k8s.gcr.io/kube-scheduler |
| | + | tag: v1.19.13 # ref: https://github.com/kubernetes/website/blob/main/content/en/releases/patch-releases.md |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | pdb: |
| | + | enabled: true |
| | + | maxUnavailable: 1 |
| | + | minAvailable: |
| | + | resources: {} |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | extraPodSpec: {} |
| | + | podPriority: |
| | + | enabled: false |
| | + | globalDefault: false |
| | + | defaultPriority: 0 |
| | + | userPlaceholderPriority: -10 |
| | + | userPlaceholder: |
| | + | enabled: true |
| | + | image: |
| | + | name: k8s.gcr.io/pause |
| | + | # tag's can be updated by inspecting the output of the command: |
| | + | # gcloud container images list-tags k8s.gcr.io/pause --sort-by=~tags |
| | + | # |
| | + | # If you update this, also update prePuller.pause.image.tag |
| | + | tag: "3.5" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | replicas: 0 |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | resources: {} |
| | + | corePods: |
| | + | tolerations: |
| | + | - key: hub.jupyter.org/dedicated |
| | + | operator: Equal |
| | + | value: core |
| | + | effect: NoSchedule |
| | + | - key: hub.jupyter.org_dedicated |
| | + | operator: Equal |
| | + | value: core |
| | + | effect: NoSchedule |
| | + | nodeAffinity: |
| | + | matchNodePurpose: prefer |
| | + | userPods: |
| | + | tolerations: |
| | + | - key: hub.jupyter.org/dedicated |
| | + | operator: Equal |
| | + | value: user |
| | + | effect: NoSchedule |
| | + | - key: hub.jupyter.org_dedicated |
| | + | operator: Equal |
| | + | value: user |
| | + | effect: NoSchedule |
| | + | nodeAffinity: |
| | + | matchNodePurpose: prefer |
| | + | |
| | + | # prePuller relates to the hook|continuous-image-puller DaemonsSets |
| | + | prePuller: |
| | + | annotations: {} |
| | + | resources: {} |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | extraTolerations: [] |
| | + | # hook relates to the hook-image-awaiter Job and hook-image-puller DaemonSet |
| | + | hook: |
| | + | enabled: true |
| | + | pullOnlyOnChanges: true |
| | + | # image and the configuration below relates to the hook-image-awaiter Job |
| | + | image: |
| | + | name: jupyterhub/k8s-image-awaiter |
| | + | tag: "1.1.3" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | podSchedulingWaitDuration: 10 |
| | + | nodeSelector: {} |
| | + | tolerations: [] |
| | + | resources: {} |
| | + | serviceAccount: |
| | + | annotations: {} |
| | + | continuous: |
| | + | enabled: true |
| | + | pullProfileListImages: true |
| | + | extraImages: {} |
| | + | pause: |
| | + | containerSecurityContext: |
| | + | runAsUser: 65534 # nobody user |
| | + | runAsGroup: 65534 # nobody group |
| | + | allowPrivilegeEscalation: false |
| | + | image: |
| | + | name: k8s.gcr.io/pause |
| | + | # tag's can be updated by inspecting the output of the command: |
| | + | # gcloud container images list-tags k8s.gcr.io/pause --sort-by=~tags |
| | + | # |
| | + | # If you update this, also update scheduling.userPlaceholder.image.tag |
| | + | tag: "3.5" |
| | + | pullPolicy: |
| | + | pullSecrets: [] |
| | + | |
| | + | ingress: |
| | + | enabled: false |
| | + | annotations: {} |
| | + | hosts: [] |
| | + | pathSuffix: |
| | + | pathType: Prefix |
| | + | tls: [] |
| | + | |
| | + | # cull relates to the jupyterhub-idle-culler service, responsible for evicting |
| | + | # inactive singleuser pods. |
| | + | # |
| | + | # The configuration below, except for enabled, corresponds to command-line flags |
| | + | # for jupyterhub-idle-culler as documented here: |
| | + | # https://github.com/jupyterhub/jupyterhub-idle-culler#as-a-standalone-script |
| | + | # |
| | + | cull: |
| | + | enabled: true |
| | + | users: false # --cull-users |
| | + | removeNamedServers: false # --remove-named-servers |
| | + | timeout: 3600 # --timeout |
| | + | every: 600 # --cull-every |
| | + | concurrency: 10 # --concurrency |
| | + | maxAge: 0 # --max-age |
| | + | |
| | + | debug: |
| | + | enabled: false |
| | + | |
| | + | global: |
| | + | safeToShowValues: false |