首页 > 解决方案 > Jupyterhub SwarmSpawner 选择工作节点

问题描述

我已经设置了一个带有多个工作节点的 docker swarm。
我当前使用 SwarmSpawner 的 Jupyterhub 设置工作正常,我能够在生成图像之前基于用户选择的图像部署单用户 docker 图像,_options_form_default在我的jupyterhub_config.py.
我现在想要的是让用户能够选择他想在其上生成他的单用户 JupyterHub 映像的 swarm 工作节点名称(主机名),因为我们的工作节点具有不同类型的硬件规格(GPU、RAM、处理器等)并且用户提前知道他想使用的主机的名称。
是否可以确定生成图像的节点?

例如,我当前的 swarm 有 1 个主节点:“master”和 3 个工作节点:“node1”、“node2”、“node3”(这些是它们的主机名,因为它出现在主节点命令输出的列HOSTNAMEdocker node ls节点)。

所以我想要的是,如下图所示,用户可以在下拉列表中选择他们想要在其上生成 jupyterhub 图像的 swarm 工作节点主机名,并提出如下问题:“选择服务器名称”。

在此处输入图像描述

标签: dockerjupyter-notebookdocker-swarmjupyterhub

解决方案


好的,所以我实际上想出了如何做到这一点。
这是我的相关部分jupyterhub_config.py

class CustomFormSpawner(SwarmSpawner):

    # Shows frontend form to user for host selection
    # The option values should correspond to the hostnames
    # that appear in the `docker node ls` command output
    def _options_form_default(self):
        return """
        <label for="hostname">Select your desired host</label>
        <select name="hostname" size="1">
            <option value="node1">node1 - GPU: RTX 2070 / CPU: 40</option>
            <option value="node2">node2 - GPU: GTX 1080 / CPU: 32</option>
        </select>
        """

    # Retrieve the selected choice and set the swarm placement constraints
    def options_from_form(self, formdata):
        options = {}
        options['hostname'] = formdata['hostname']
        hostname = ''.join(formdata['hostname'])
        self.extra_placement_spec = { 'constraints' : ['node.hostname==' + hostname] }
        return options

c.JupyterHub.spawner_class = CustomFormSpawner

推荐阅读