I found user placeholder configuration very useful, when I want to guarantee the users don’t have to wait for a new node to be prepared, when they request jupyterhub instance.
This works like a charm, when I’m using single profile for the user.
But I can’t figure out how to do the same thing when there are multiple profiles.
I have two different profiles.
- jupyter-medium: which has minimum 4G memory, and 1 CPUs, which is expandable up to 8G memory, and 2 CPUs.
- jupyter-large: which has minimum 8G memory, and 2 CPUs, which is expandable up to 16G memory, and 4 CPUs.
singleuser:
profileList:
- display_name: "IO Lab - Large"
description: "Standard environment - guaranteed 2 Cores / 8GB RAM, burstable up to 4 Cores / 16GB RAM"
kubespawner_override:
node_affinity_required:
- matchExpressions:
- key: podaffinity
operator: In
values:
- iolab-large
cpu_guarantee: 2
cpu_limit: 4
mem_guarantee: "8G"
mem_limit: "16G"
start_timeout: 1200
- display_name: "IO Lab - Medium"
description: "Standard environment - guaranteed 1 Core / 4GB RAM, burstable up to 2 Cores / 8GB RAM"
default: true
kubespawner_override:
node_affinity_required:
- matchExpressions:
- key: podaffinity
operator: In
values:
- iolab-medium
cpu_guarantee: 1
cpu_limit: 2
mem_guarantee: "4G"
mem_limit: "8G"
start_timeout: 1200
I have two different node groups defined on AWS EKS cluster.
Here is the TF configuration for those node groups.
node_groups = {
"iolab_medium" = {
name = "iolab-medium"
desired_capacity = 1
min_capacity = 1
max_capacity = 64
instance_types = ["m5.large"]
k8s_labels = {
"hub.jupyter.org/node-purpose" = "user"
"podaffinity" = "iolab-medium"
}
taints = [
{
key = "hub.jupyter.org/dedicated"
value = "user"
effect = "NO_SCHEDULE"
}
]
tags = {
"k8s.io/cluster-autoscaler/${local.name}" : "owned"
"k8s.io/cluster-autoscaler/enabled" : "true"
}
}
"iolab_large" = {
name = "iolab-large"
desired_capacity = 1
min_capacity = 1
max_capacity = 64
instance_types = ["m5.xlarge"]
k8s_labels = {
"hub.jupyter.org/node-purpose" = "user"
"podaffinity" = "iolab-large"
}
taints = [
{
key = "hub.jupyter.org/dedicated"
value = "user"
effect = "NO_SCHEDULE"
}
]
tags = {
"k8s.io/cluster-autoscaler/${local.name}" : "owned"
"k8s.io/cluster-autoscaler/enabled" : "true"
}
}
And I have enabled userPlaceholder
setting with one placeholder replicas.
scheduling:
userScheduler:
enabled: true
podPriority:
enabled: true
userPlaceholder:
enabled: true
replicas: 1
userPods:
nodeAffinity:
matchNodePurpose: require
What I want to do is to make this userPlaceholder
working properly with two different profiles. In other words, when a user requests a iolab-large
instance, K8S should assign that user pod to a placeholder pod which has iolab-large
profile, and when a user requests a iolab-medium
instance, K8S should assign that user pod to a placeholder pod which has iolab-medium
profile.
Is there a way to configure placeholder pods to be running on both iolab-large
, iolab-medium
node groups, so that we can guarantee the users don’t have to wait until a new node has spawn up?
Thanks for your help in advance.