Jupyterhub SwarmSpawner выберите рабочий узел

#docker #jupyter-notebook #docker-swarm #jupyterhub

Вопрос:

Я установил рой докеров с несколькими рабочими узлами.
Моя текущая настройка Jupyterhub с SwarmSpawner работает нормально, я могу развернуть один-пользователей Docker изображений на основе выбранного пользователем изображения перед нерестом образ, используя _options_form_default в своей jupyterhub_config.py .
То, что я хотел бы сейчас, чтобы дать пользователям возможность выбора Рой работником имя узла (хоста), на котором он хотел бы, чтобы породить его однопользовательском JupyterHub изображения, потому что наши рабочие узлы имеют различные типы аппаратных (графических процессоров, оперативной памяти, процессоров и т. д.) и пользователи заранее знают имя хоста, он хотел бы использовать.
Можно ли определить узел, на котором будет создаваться изображение ?

Мой текущий рой имеет, например, 1 главный узел: «главный» и 3 рабочих узла: «node1», «node2», «node3» (это их имена хостов, как указано в столбце HOSTNAME в выводе команды docker node ls на главном узле).

Поэтому я хотел бы, чтобы, как показано на рисунке ниже, у пользователей был выпадающий список имен хостов рабочих узлов swarm, на которых они хотели бы создать свое изображение jupyterhub, с таким вопросом, как: «Выберите имя сервера».

введите описание изображения здесь

Ответ №1:

Итак, я действительно понял, как это сделать.
Вот соответствующая часть моего 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