Jupyterhub SwarmSpawner如何支持用户选择Swarm工作节点部署单用户镜像
实现JupyterHub SwarmSpawner用户自主选择部署节点的方案
是完全可以实现的,核心逻辑是结合Docker Swarm的**节点部署约束(placement constraint)**和SwarmSpawner的自定义启动选项功能,将用户选择的主机名转换为调度规则传递给Swarm集群即可,具体配置步骤如下:
步骤1:修改jupyterhub_config.py配置
在原有镜像选择的配置基础上,新增节点选择的表单选项和参数处理逻辑,配置示例如下:
# 1. 定义允许用户选择的工作节点列表,值和docker node ls输出的HOSTNAME列完全保持一致 # 可自定义描述信息标注节点硬件配置,方便用户选择 ALLOWED_WORKER_NODES = [ ("node1", "node1 | GPU:RTX3090 * 2 | 内存:64GB"), ("node2", "node2 | GPU:A10 * 4 | 内存:128GB"), ("node3", "node3 | 无GPU | 内存:256GB") ] # 2. 自定义启动选项表单,在原有镜像选择基础上新增节点选择下拉框 c.SwarmSpawner.options_form = """ <label for="image">请选择单用户镜像</label> <select name="image" class="form-control" required> <!-- 此处替换为你原有配置的镜像选项 --> <option value="jupyter/scipy-notebook:latest">通用科学计算镜像</option> <option value="jupyter/tensorflow-notebook:latest">TensorFlow GPU镜像</option> <option value="jupyter/pytorch-notebook:latest">PyTorch GPU镜像</option> </select> <br> <label for="target_node">请选择部署节点</label> <select name="target_node" class="form-control" required> % for node_value, node_desc in allowed_nodes: <option value="{{node_value}}">{{node_desc}}</option> % endfor </select> """ # 给表单模板传递可选节点参数 c.SwarmSpawner.options_form_context = { "allowed_nodes": ALLOWED_WORKER_NODES } # 3. 预启动钩子,将用户选择的节点转换为Swarm调度约束 def set_node_constraint(spawner): selected_node = spawner.user_options.get("target_node") if selected_node: # 添加节点主机名约束,Swarm会自动将容器调度到对应节点 spawner.placement_constraints.append(f"node.hostname == {selected_node}") c.SwarmSpawner.pre_spawn_hook = set_node_constraint
步骤2:验证效果
修改配置后重启JupyterHub服务,用户启动服务器时就会出现节点选择下拉菜单,提交选项后单用户容器会自动部署到用户选中的工作节点上。
注意事项
- 如果需要针对不同用户开放不同的节点权限,可以在
pre_spawn_hook中通过spawner.user.name获取当前用户名,加逻辑校验用户选择的节点是否有权限使用 - 如果不想写死节点列表,可以调用Docker Python SDK的
nodes.list()方法实时拉取集群当前的工作节点主机名,动态生成可选列表 - 节点的描述信息可根据实际硬件配置自由调整,帮助用户快速匹配所需资源
内容的提问来源于stack exchange,提问作者Gabriel Cretin
相关产品推荐
相关产品推荐

