在K8s部署JupyterHub:如何按用户分配CPU/GPU节点池?
实现JupyterHub在K8s上的CPU/GPU节点池按需分配
完全可以基于用户凭证、用户组或自定义规则实现这种节点池分配逻辑,以下是几种落地方案:
1. 基于用户/用户组的Profile权限控制
通过配置多环境Profile,限制仅指定用户/组能访问GPU节点池,其余用户默认使用CPU节点池:
singleuser: profileList: - display_name: "默认CPU环境" description: "通用CPU计算节点" kubespawner_override: node_selector: node-role.kubernetes.io/cpu: "true" default: true - display_name: "GPU加速环境" description: "仅限数据科学家使用的GPU节点" kubespawner_override: node_selector: node-role.kubernetes.io/gpu: "true" access: users: - zhangsan - lisi groups: - data-scientists
前置操作:先给K8s节点打标签——CPU节点打node-role.kubernetes.io/cpu: "true",GPU节点打node-role.kubernetes.io/gpu: "true"。
2. 自动分配:基于用户属性的预生成钩子
如果不需要用户手动选择环境,可通过pre_spawn_hook读取用户凭证或组信息,自动设置节点选择器:
singleuser: kubespawner_override: node_selector: node-role.kubernetes.io/cpu: "true" lifecycleHooks: preSpawn: exec: command: - python - -c - | from kubespawner import KubeSpawner def auto_assign_node(spawner: KubeSpawner): # 判断用户是否属于目标组 if 'data-scientists' in spawner.user.groups: spawner.node_selector = {"node-role.kubernetes.io/gpu": "true"} return auto_assign_node(spawner)
3. 节点污点+容忍度强化隔离
给GPU节点添加污点,阻止普通Pod调度,再给特定用户的Pod添加容忍度:
- 给GPU节点打污点:
kubectl taint nodes <gpu-node-name> dedicated=gpu:NoSchedule
- 在JupyterHub配置中设置:
singleuser: profileList: - default: true kubespawner_override: tolerations: [] node_selector: node-role.kubernetes.io/cpu: "true" - access: groups: ["data-scientists"] kubespawner_override: tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule" node_selector: node-role.kubernetes.io/gpu: "true"
4. 基于用户凭证属性的动态判断
如果用户认证系统(如OIDC、LDAP)返回的凭证中包含身份标记(如is_data_scientist: true),可在钩子中读取该属性实现自动分配:
def auto_assign_node(spawner): user_info = spawner.user.auth_state.get('userinfo', {}) if user_info.get('is_data_scientist'): spawner.node_selector = {"node-role.kubernetes.io/gpu": "true"}
内容的提问来源于stack exchange,提问作者eemamedo
相关产品推荐
相关产品推荐

