logo

Урок 3 из 7

Управление узлами

Осталось выполнить последний шаг установки.

После запуска нашего тестового кластера в нём есть только один узел — master. Сейчас он не позволяет платформе полностью развернуться из-за taint’ов. Они предполагают, что в кластер будут добавляться узлы и пока не нужно разворачивать в нём служебные компоненты. Можно действовать двумя способами:

  • Снять taint с master-узла и тем самым разрешить scheduler’у релизить узлы.
  • Добавить узел, который возьмёт на себя нагрузку от служебных компонентов.

В нашей практике встречаются два вида инсталляций:

  • Когда есть системные узлы, на которые выносят Ingress-контроллер. Это экономный вариант, так как позволяет совместить на узлах роли Ingress-контроллера и служебных компонентов.
  • Если кластеры более нагруженные, для размещения Ingress-контроллеров используются выделенные узлы. Таким образом нагрузка, вызванная, например, на компонент мониторинга, не повлияет на входящий трафик.

Мы пойдём по первому пути и добавим в кластер один системный узел.

Прежде всего необходимо создать NodeGroup (группу узлов) — сущность, которая задаёт шаблон добавления узлов в кластер. В нашем случае это будет системная NodeGroup с определёнными label’ами и taint’ами. Эти taint’ы позволят кластеру Kubernetes и платформе Deckhouse разместить необходимые служебные компоненты.

Ниже представлен пример описания статичной NodeGroup для системных узлов:

apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: system
spec:
  nodeTemplate:
    labels:
      node-role.deckhouse.io/system: ""
    taints:
      - effect: NoExecute
        key: dedicated.deckhouse.io
        value: system
  nodeType: Static
icon

Чтобы посмотреть, остались ли после установки платформы незавершённые процессы, нужно выполнить в поде Deckhouse команду kubectl -n d8-system exec deploy/deckhouse -- deckhouse controller queue main.
Задачи в очереди могут нагружать API server и, как следствие, etcd. Из-за этого, например, команда kubectl может выполняться с задержкой или вовсе падать.
Пустая очередь означает, что все процессы, связанные с установкой, завершены.

Чтобы создать NodeGroup для системных нужд, создадим конфигурационный файл командой

vim system-ng.yml

и скопируем в него приведённый выше манифест. Далее выполним команду:

kubectl create -f system-ng.yml

Посмотреть содержимое NodeGroup можно командой

kubectl get ng

Как видно, в кластере есть две группы узлов: master — создаётся по умолчанию при сетапе кластера, system — созданная нами группа, в которой пока нет узлов.

Добавление узлов в bare-metal-инсталляцию происходит в полуавтоматическом режиме. Для каждой группы узлов Deckhouse подготавливает специальный скрипт, с помощью которого можно добавлять узлы этой группы в кластер. Скрипт хранится в специальном Kubernetes Secret, расположенном в пространстве имён d8-cloud-instace-manager. Чтобы получить этот скрипт, необходимо выполнить команду:

NODE_GROUP=system
kubectl -n d8-cloud-instance-manager get secret manual-bootstrap-for-${NODE_GROUP} -o json | jq '.data."bootstrap.sh"' -r

В результате будет выведен длинный скрипт, закодированный в Base64:

Его необходимо скопировать, перенести на узел, передать в команду echo и декодировать:

echo <Base64-КОД-СКРИПТА> | base64 -d | bash

После добавления узла можно снова просмотреть содержимое группы узлов:

Как видим, узел добавлен и находится в статусе «Ready».