Commit 49f41fdf authored by Will JALLET's avatar Will JALLET 💸

Revert "rollback Jupyterhub to 0.7 stable"

This reverts commit ddf64a09.
parent ddf64a09
Pipeline #4519 passed with stage
in 9 seconds
appVersion: 0.9.2
appVersion: 0.9.3
description: Multi-user Jupyter installation
home: https://z2jh.jupyter.org
icon: https://jupyter.org/assets/hublogo.svg
......@@ -7,4 +7,4 @@ name: jupyterhub
sources:
- https://github.com/jupyterhub/zero-to-jupyterhub-k8s
tillerVersion: '>=2.9.1-0'
version: 0.7.0
version: 0.8-c0b4dcf
......@@ -367,6 +367,14 @@ properties:
guide](http://docs.heptio.com/content/private-registries/pr-gcr.html)
and read the notes about the password.
properties:
enabled:
type: boolean
description: |
Enable the creation of a Kubernetes Secret containing credentials
to access a image registry. By enabling this, user pods and image
puller pods will also be configured to use these credentials when
they pull their container images.
registry:
type: string
description: |
......@@ -452,3 +460,200 @@ properties:
description: |
Deprecated and no longer does anything. Use the user-scheduler instead
in order to accomplish a good packing of the user pods.
extraTolerations:
type: list
description: |
Tolerations allow a pod to be scheduled on nodes with taints. These
are additional tolerations other than the user pods and core pods
default ones `hub.jupyter.org/dedicated=user:NoSchedule` or
`hub.jupyter.org/dedicated=core:NoSchedule`. Note that a duplicate set
of tolerations exist where `/` is replaced with `_` as the Google
cloud does not support the character `/` yet in the toleration.
See the [Kubernetes docs](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/)
for more info.
Pass this field an array of
[`Toleration`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#toleration-v1-core)
objects.
extraNodeAffinity:
type: object
description: |
Affinities describe where pods prefer or require to be scheduled, they
may prefer or require a node where they are to be scheduled to have a
certain label (node affinity). They may also require to be scheduled
in proximity or with a lack of proximity to another pod (pod affinity
and anti pod affinity).
See the [Kubernetes
docs](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/)
for more info.
properties:
required:
type: list
description: |
Pass this field an array of
[`NodeSelectorTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#nodeselectorterm-v1-core)
objects.
preferred:
type: list
description: |
Pass this field an array of
[`PreferredSchedulingTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#preferredschedulingterm-v1-core)
objects.
extraPodAffinity:
type: object
description: |
See the description of `singleuser.extraNodeAffinity`.
properties:
required:
type: list
description: |
Pass this field an array of
[`PodAffinityTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#podaffinityterm-v1-core)
objects.
preferred:
type: list
description: |
Pass this field an array of
[`WeightedPodAffinityTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#weightedpodaffinityterm-v1-core)
objects.
extraPodAntiAffinity:
type: object
description: |
See the description of `singleuser.extraNodeAffinity`.
properties:
required:
type: list
description: |
Pass this field an array of
[`PodAffinityTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#podaffinityterm-v1-core)
objects.
preferred:
type: list
description: |
Pass this field an array of
[`WeightedPodAffinityTerm`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#weightedpodaffinityterm-v1-core)
objects.
scheduling:
type: object
description: |
Objects for customizing the scheduling of various pods on the nodes and
related labels.
properties:
userScheduler:
type: object
description: |
The user scheduler is making sure that user pods are scheduled
tight on nodes, this is useful for autoscaling of user node pools.
properties:
enabled:
type: boolean
description: |
Enables the user scheduler.
replicas:
type: integer
description: |
You can have multiple schedulers to share the workload or improve
availability on node failure.
image:
type: object
description: |
The image containing the [kube-scheduler
binary](https://console.cloud.google.com/gcr/images/google-containers/GLOBAL/kube-scheduler-amd64).
properties:
name:
type: string
tag:
type:
- string
- "null"
podPriority:
type: object
description: |
Generally available since Kubernetes 1.11, Pod Priority is used to
allow real users evict placeholder pods.
properties:
enabled:
type: bool
description: |
Generally available since Kubernetes 1.11, Pod Priority is used to
allow real users evict placeholder pods.
userPlaceholder:
type: object
description: |
User placeholders simulate users but will thanks to PodPriority be
evicted by the cluster autoscaler if a real user shows up. In this way
placeholders allow you to create a headroom for the real users and
reduce the risk of a user having to wait for a node to be added. Be
sure to use the the continuous image puller as well along with
placeholders, so the images are also available when real users arrive.
To test your setup efficiently, you can adjust the amount of user
placeholders with the following command:
```sh
# Configure to have 3 user placeholders
kubectl scale sts/user-placeholder --replicas=3
```
properties:
enabled:
type: bool
replicas:
type: int
description: |
How many placeholder pods would you like to have?
resources:
type: object
description: |
Unless specified here, the placeholder pods will request the same
resources specified for the real singleuser pods.
corePods:
type: object
description: |
These settings influence the core pods like the hub, proxy and
user-scheduler pods.
properties:
nodeAffinity:
type: object
description: |
Where should pods be scheduled? Perhaps on nodes with a certain
label is preferred or even required?
properties:
matchNodePurpose:
type: string
enum:
- ignore
- prefer
- require
description: |
Decide if core pods *ignore*, *prefer* or *require* to
schedule on nodes with this label:
```
hub.jupyter.org/node-purpose=core
```
userPods:
type: object
description: |
These settings influence the user pods like the user-placeholder,
user-dummy and actual user pods named like jupyter-someusername.
properties:
nodeAffinity:
type: object
description: |
Where should pods be scheduled? Perhaps on nodes with a certain
label is preferred or even required?
properties:
matchNodePurpose:
type: string
enum:
- ignore
- prefer
- require
description: |
Decide if user pods *ignore*, *prefer* or *require* to
schedule on nodes with this label:
```
hub.jupyter.org/node-purpose=user
```
......@@ -55,7 +55,7 @@
## Example usage
```yaml
# Excerpt from proxy/autohttps/deployment.yaml
apiVersion: apps/v1beta2
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "jupyterhub.nameField" . }}
......@@ -162,18 +162,6 @@ component: {{ include "jupyterhub.componentLabel" . }}
{{- end }}
{{- /*
jupyterhub.podCullerSelector:
Used to by the pod-culler to select singleuser-server pods. It simply
reformats "jupyterhub.matchLabels" and sets the componentLabel value so
`component=singleuser-server` is output.
*/}}
{{- define "jupyterhub.podCullerSelector" -}}
{{- $_ := merge (dict "componentLabel" "singleuser-server") . -}}
{{ include "jupyterhub.matchLabels" $_ | replace ": " "=" | replace "\n" "," | quote }}
{{- end }}
{{- /*
jupyterhub.dockerconfigjson:
Creates a base64 encoded docker registry json blob for use in a image pull
......@@ -204,3 +192,48 @@ component: {{ include "jupyterhub.componentLabel" . }}
}
{{- end }}
{{- end }}
{{- /*
jupyterhub.resources:
The resource request of a singleuser.
*/}}
{{- define "jupyterhub.resources" -}}
{{- $r1 := .Values.singleuser.cpu.guarantee -}}
{{- $r2 := .Values.singleuser.memory.guarantee -}}
{{- $r3 := .Values.singleuser.extraResource.guarantees -}}
{{- $r := or $r1 $r2 $r3 -}}
{{- $l1 := .Values.singleuser.cpu.limit -}}
{{- $l2 := .Values.singleuser.memory.limit -}}
{{- $l3 := .Values.singleuser.extraResource.limits -}}
{{- $l := or $l1 $l2 $l3 -}}
{{- if $r -}}
requests:
{{- if $r1 }}
cpu: {{ .Values.singleuser.cpu.guarantee }}
{{- end }}
{{- if $r2 }}
memory: {{ .Values.singleuser.memory.guarantee }}
{{- end }}
{{- if $r3 }}
{{- range $key, $value := .Values.singleuser.extraResource.guarantees }}
{{ $key | quote }}: {{ $value | quote }}
{{- end }}
{{- end }}
{{- end }}
{{- if $l }}
limits:
{{- if $l1 }}
cpu: {{ .Values.singleuser.cpu.limit }}
{{- end }}
{{- if $l2 }}
memory: {{ .Values.singleuser.memory.limit }}
{{- end }}
{{- if $l3 }}
{{- range $key, $value := .Values.singleuser.extraResource.limits }}
{{ $key | quote }}: {{ $value | quote }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
......@@ -72,6 +72,7 @@ data:
{{- if eq .Values.auth.type "mediawiki" }}
auth.mediawiki.client-id: {{ .Values.auth.mediawiki.clientId | quote }}
auth.mediawiki.client-secret: {{ .Values.auth.mediawiki.clientSecret | quote }}
auth.mediawiki.callback-url: {{ .Values.auth.mediawiki.callbackUrl | quote }}
auth.mediawiki.index-url: {{ .Values.auth.mediawiki.indexUrl | quote }}
{{- end }}
......@@ -128,11 +129,15 @@ data:
{{- if .Values.singleuser.initContainers }}
singleuser.init-containers: {{ toJson .Values.singleuser.initContainers | quote }}
{{- end }}
{{- if .Values.singleuser.extraContainers }}
singleuser.extra-containers: {{ toJson .Values.singleuser.extraContainers | quote }}
{{- end }}
singleuser.network-tools.image.name: {{ .Values.singleuser.networkTools.image.name | quote }}
singleuser.network-tools.image.tag: {{ .Values.singleuser.networkTools.image.tag | quote }}
singleuser.cloud-metadata: |
{{- .Values.singleuser.cloudMetadata | toYaml | trimSuffix "\n" | nindent 4 }}
singleuser.start-timeout: {{ .Values.singleuser.startTimeout | quote }}
singleuser.image-spec: {{ .Values.singleuser.image.name }}:{{ .Values.singleuser.image.tag }}
singleuser.image-pull-policy: {{ .Values.singleuser.image.pullPolicy | quote }}
{{- if .Values.singleuser.imagePullSecret.enabled }}
singleuser.image-pull-secret-name: singleuser-image-credentials
......@@ -150,9 +155,6 @@ data:
singleuser.service-account-name: {{ .Values.singleuser.serviceAccountName | quote }}
{{- end }}
singleuser.node-selector: {{ toJson .Values.singleuser.nodeSelector | quote }}
{{- if .Values.singleuser.schedulerStrategy }}
singleuser.scheduler-strategy: {{ .Values.singleuser.schedulerStrategy | quote }}
{{- end }}
singleuser.storage.type: {{ .Values.singleuser.storage.type | quote }}
singleuser.storage.home_mount_path: {{ .Values.singleuser.storage.homeMountPath | quote }}
singleuser.storage.extra-volumes: {{ toJson .Values.singleuser.storage.extraVolumes | quote }}
......@@ -206,6 +208,12 @@ data:
{{- range $key, $value := .Values.singleuser.extraLabels }}
{{ $key | quote }}: {{ $value | quote }}
{{- end }}
{{- if .Values.singleuser.storage.extraLabels }}
singleuser.storage-extra-labels: |
{{- range $key, $value := .Values.singleuser.storage.extraLabels }}
{{ $key | quote }}: {{ $value | quote }}
{{- end }}
{{- end }}
{{- if .Values.singleuser.extraEnv }}
singleuser.extra-env: |
{{- range $key, $value := .Values.singleuser.extraEnv }}
......@@ -213,6 +221,40 @@ data:
{{- end }}
{{- end }}
singleuser.tolerations: |
{{- include "jupyterhub.userTolerations" . | nindent 4 }}
{{- if include "jupyterhub.userNodeAffinityRequired" . }}
singleuser.node-affinity-required: |
{{- include "jupyterhub.userNodeAffinityRequired" . | nindent 4 }}
{{- end }}
{{- if include "jupyterhub.userNodeAffinityPreferred" . }}
singleuser.node-affinity-preferred: |
{{- include "jupyterhub.userNodeAffinityPreferred" . | nindent 4 }}
{{- end }}
{{- if include "jupyterhub.userPodAffinityRequired" . }}
singleuser.pod-affinity-required: |
{{- include "jupyterhub.userPodAffinityRequired" . | nindent 4 }}
{{- end }}
{{- if include "jupyterhub.userPodAffinityPreferred" . }}
singleuser.pod-affinity-preferred: |
{{- include "jupyterhub.userPodAffinityPreferred" . | nindent 4 }}
{{- end }}
{{- if include "jupyterhub.userPodAntiAffinityRequired" . }}
singleuser.pod-anti-affinity-required: |
{{- include "jupyterhub.userPodAntiAffinityRequired" . | nindent 4 }}
{{- end }}
{{- if include "jupyterhub.userPodAntiAffinityPreferred" . }}
singleuser.pod-anti-affinity-preferred: |
{{- include "jupyterhub.userPodAntiAffinityPreferred" . | nindent 4 }}
{{- end }}
{{- if .Values.scheduling.userScheduler.enabled }}
singleuser.scheduler-name: "{{ .Release.Name }}-user-scheduler"
{{- end }}
{{- if .Values.scheduling.podPriority.enabled }}
singleuser.priority_class_name: "{{ .Release.Name }}-default-priority"
{{- end }}
{{- /* KubeSpawner */}}
kubespawner.common-labels: |
......
apiVersion: apps/v1beta2
apiVersion: apps/v1
kind: Deployment
metadata:
name: hub
......@@ -30,21 +30,11 @@ spec:
{{- .Values.hub.annotations | toYaml | trimSuffix "\n" | nindent 8 }}
{{- end }}
spec:
{{- if .Values.scheduling.podPriority.enabled }}
priorityClassName: {{ .Release.Name }}-default-priority
{{- end }}
nodeSelector: {{ toJson .Values.hub.nodeSelector }}
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: component
operator: In
values: ['proxy']
- key: release
operator: In
values: [{{ .Release.Name | quote }}]
{{- include "jupyterhub.coreAffinity" . | nindent 6 }}
volumes:
- name: config
configMap:
......@@ -118,9 +108,6 @@ spec:
{{- .Values.hub.resources | toYaml | trimSuffix "\n" | nindent 12 }}
imagePullPolicy: {{ .Values.hub.imagePullPolicy }}
env:
{{- /* Put this here directly so hub will restart when we change this */}}
- name: SINGLEUSER_IMAGE
value: "{{ .Values.singleuser.image.name }}:{{ .Values.singleuser.image.tag }}"
{{- if .Values.hub.cookieSecret }}
- name: JPY_COOKIE_SECRET
valueFrom:
......
......@@ -6,7 +6,7 @@ metadata:
labels:
{{- include "jupyterhub.labels" . | nindent 4 }}
spec:
minAvailable: 1
minAvailable: {{ .Values.hub.pdb.minAvailable }}
selector:
matchLabels:
{{- include "jupyterhub.matchLabels" . | nindent 6 }}
......
......@@ -7,7 +7,7 @@ metadata:
{{- include "jupyterhub.labels" . | nindent 4 }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: hub
labels:
......@@ -21,7 +21,7 @@ rules:
verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: hub
labels:
......
......@@ -4,7 +4,7 @@ Returns an image-puller daemonset. Two daemonsets will be created like this.
- continuous-image-puller: for newly added nodes image pulling
*/}}
{{- define "jupyterhub.imagePuller.daemonset" -}}
apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: {{ print .componentPrefix "image-puller" }}
......@@ -36,6 +36,16 @@ spec:
{{- /* Changes here will cause the DaemonSet to restart the pods. */}}
{{- include "jupyterhub.matchLabels" . | nindent 8 }}
spec:
tolerations:
{{- include "jupyterhub.userTolerations" . | nindent 8 }}
nodeSelector: {{ toJson .Values.singleuser.nodeSelector }}
{{- if include "jupyterhub.userNodeAffinityRequired" . }}
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
{{- include "jupyterhub.userNodeAffinityRequired" . | nindent 14 }}
{{- end }}
terminationGracePeriodSeconds: 0
automountServiceAccountToken: false
{{- if .Values.singleuser.imagePullSecret.enabled }}
......@@ -68,7 +78,15 @@ spec:
- -c
- echo "Pulling complete"
{{- end }}
nodeSelector: {{ toJson .Values.singleuser.nodeSelector }}
{{- range $k, $container := .Values.singleuser.extraContainers }}
- name: image-pull-singleuser-extra-container-{{ $k }}
image: {{ $container.image }}
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- echo "Pulling complete"
{{- end }}
containers:
- name: pause
image: {{ .Values.prePuller.pause.image.name }}:{{ .Values.prePuller.pause.image.tag }}
......
......@@ -22,7 +22,7 @@ metadata:
... will be used by this role...
*/}}
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: hook-image-awaiter
labels:
......@@ -41,7 +41,7 @@ rules:
... as declared by this binding.
*/}}
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: hook-image-awaiter
labels:
......
{{- $HTTPS := (and .Values.proxy.https.hosts .Values.proxy.https.enabled) }}
{{- $autoHTTPS := (and $HTTPS (eq .Values.proxy.https.type "letsencrypt")) }}
{{- if $autoHTTPS -}}
apiVersion: apps/v1beta2
apiVersion: apps/v1
kind: Deployment
metadata:
name: autohttps
......@@ -35,22 +35,12 @@ spec:
{{- if .Values.rbac.enabled }}
serviceAccountName: autohttps
{{- end }}
nodeSelector: {{ toJson .Values.proxy.nodeSelector }}
{{- if .Values.scheduling.podPriority.enabled }}
priorityClassName: {{ .Release.Name }}-default-priority
{{- end }}
terminationGracePeriodSeconds: 60
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: component
operator: In
values: ['hub']
- key: release
operator: In
values: [{{ .Release.Name | quote }}]
nodeSelector: {{ toJson .Values.proxy.nodeSelector }}
{{- include "jupyterhub.coreAffinity" . | nindent 6 }}
containers:
- name: nginx
image: "{{ .Values.proxy.nginx.image.name }}:{{ .Values.proxy.nginx.image.tag }}"
......
......@@ -11,7 +11,7 @@ metadata:
labels:
{{- include "jupyterhub.labels" . | nindent 4 }}
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nginx-{{ .Release.Name }}
......@@ -74,7 +74,7 @@ rules:
verbs:
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: nginx-{{ .Release.Name }}
......@@ -89,7 +89,7 @@ subjects:
name: autohttps
namespace: {{ .Release.Namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: nginx
......@@ -129,7 +129,7 @@ rules:
- get
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: kube-lego
......@@ -166,7 +166,7 @@ rules:
- create
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: nginx
......@@ -181,7 +181,7 @@ subjects:
name: autohttps
namespace: {{ .Release.Namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kube-lego
......
{{- $manualHTTPS := (and .Values.proxy.https.enabled (eq .Values.proxy.https.type "manual")) -}}
{{- $manualHTTPSwithsecret := (and .Values.proxy.https.enabled (eq .Values.proxy.https.type "secret")) -}}
apiVersion: apps/v1beta2
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy
......@@ -29,22 +29,12 @@ spec:
{{- .Values.proxy.annotations | toYaml | trimSuffix "\n" | nindent 8 }}
{{- end }}
spec:
nodeSelector: {{ toJson .Values.proxy.nodeSelector }}
terminationGracePeriodSeconds: 60
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: component
operator: In
values: ['hub']
- key: release
operator: In
values: [{{ .Release.Name | quote }}]
{{- if .Values.scheduling.podPriority.enabled }}
priorityClassName: {{ .Release.Name }}-default-priority
{{- end }}
nodeSelector: {{ toJson .Values.proxy.nodeSelector }}
{{- include "jupyterhub.coreAffinity" . | nindent 6 }}
{{- if $manualHTTPSwithsecret }}
volumes:
- name: tls-secret
......
......@@ -6,7 +6,7 @@ metadata:
labels:
{{- include "jupyterhub.labels" . | nindent 4 }}
spec:
minAvailable: 1
minAvailable: {{ .Values.proxy.pdb.minAvailable }}
selector:
matchLabels:
{{- include "jupyterhub.matchLabels" . | nindent 6 }}
......
......@@ -41,7 +41,7 @@ hub:
extraVolumeMounts: []
image:
name: jupyterhub/k8s-hub
tag: '0.7.0'
tag: 'e774b7d'
resources:
requests:
cpu: 200m
......@@ -50,6 +50,7 @@ hub:
imagePullPolicy: IfNotPresent
pdb:
enabled: true
minAvailable: 1
networkPolicy:
enabled: false
egress:
......@@ -98,6 +99,7 @@ proxy:
nodeSelector: {}
pdb:
enabled: true
minAvailable: 1
https:
enabled: true
type: letsencrypt
......@@ -140,10 +142,21 @@ auth:
singleuser:
extraTolerations: []
nodeSelector: {}
extraNodeAffinity:
required: []
preferred: []
extraPodAffinity:
required: []
preferred: []
extraPodAntiAffinity:
required: []
preferred: []
networkTools:
image:
name: jupyterhub/k8s-network-tools
tag: '0.7.0'
tag: '8fc0199'
cloudMetadata:
enabled: false
ip: 169.254.169.254
......@@ -161,14 +174,14 @@ singleuser:
extraLabels: {}
extraEnv: {}
lifecycleHooks:
initContainers:
nodeSelector: {}
initContainers: []
extraContainers: []
uid: 1000
fsGid: 100
serviceAccountName:
schedulerStrategy:
storage:
type: dynamic
extraLabels: {}
extraVolumes: []
extraVolumeMounts: []
static:
......@@ -183,7 +196,7 @@ singleuser:
storageAccessModes: [ReadWriteOnce]
image:
name: jupyterhub/k8s-singleuser-sample
tag: '0.7.0'
tag: '8fc0199'
pullPolicy: IfNotPresent
imagePullSecret:
enabled: false
......@@ -205,13 +218,42 @@ singleuser:
defaultUrl:
scheduling:
userScheduler:
enabled: false
replicas: 1
logLevel: 4
image:
name: gcr.io/google_containers/kube-scheduler-amd64