Развертывание кластера Kubernetes

Введение

До установки R-Vision SIEM необходимо развернуть кластер Kubernetes. Это руководство описывает процесс офлайн установки кластера Kubernetes с использованием автономного установщика на базе Kubespray.

Требования

Для работы установщика

Ресурс Требование

Свободное место на диске

от 10 ГБ

Для узлов кластера Kubernetes

Ресурс Один сервер Распределенная (управляющий узел) Распределенная (рабочий узел)

CPU (ядер)

12

4

12

RAM (ГБ)

16

4

12

Storage (ГБ)

100

100

100

При распределенной установке необходимо обеспечить сетевое взаимодействие между узлами кластера с пропускной способностью не менее 10 Мбит/сек.

Программные требования

  • Минимальная версия Kubernetes: 1.24

  • Поддерживаемая среда выполнения контейнеров (CRI): containerd, CRI-O

Подготовка зависимостей

Необходимые архивы

Для установки потребуется архив kubespray-installer-redos.tar.gz для RedOS.

Архив с установочным файлом kubespray-installer-redos.tar.gz необходимо загрузить во временную директорию /tmp.

Распаковка архива

Выполните следующие шаги на управляющем узле или машине администратора:

  1. Загрузите файл kubespray-installer-redos.tar.gz во временную директорию /tmp на сервер, на котором должен быть развернут кластер:

    Example 1. Для Windows
    pscp "путь\к\файлу\kubespray-installer-redos.tar.gz" user@server:/tmp
    Example 2. Для Linux или macOS
    scp путь\к\файлу\kubespray-installer-redos.tar.gz user@server:/tmp
  2. Распакуйте архив с установочными файлами. Используйте следующие команды:

    cd /tmp
    tar xvfz kubespray-installer-redos.tar.gz

Установка кластера Kubernetes

Настройка SSH-доступа

Проверьте возможность подключения по SSH-ключу к каждому узлу кластера:

ssh <FQDN-адрес узла>
Чтобы узнать FQDN-адрес текущего узла, выполните команду: hostname -f.

Если подключение по SSH-ключу не настроено, сгенерируйте ключи и добавьте открытый ключ на каждый узел:

ssh-keygen
ssh-copy-id <user>@<FQDN-адрес узла>

Запуск скрипта установки

Скрипт принимает следующие переменные окружения:

Переменная Описание

ASK_PASS

Запрос пароля для подключения к узлам по SSH.

ANSIBLE_USER

Пользователь для подключения к узлам по SSH.

ANSIBLE_PASSWORD

Пароль для подключения к узлам по SSH.

ASK_BECOME_PASS

Запрос пароля для повышения до sudo.

VERBOSE

Уровень детализации логирования (0-4). По умолчанию установлен минимальный уровень детализации (0).

Пример запуска с переменными окружения:

ANSIBLE_USER=username ANSIBLE_PASSWORD=password ./install.sh

По умолчанию скрипт установки запускается в интерактивном режиме, при котором отдельно запрашиваются FQDN-адреса для каждого узла кластера и путь до директории с данными containerd. Чтобы отключить интерактивность скрипта установки, необходимо сразу передать эти данные при его запуске с помощью следующих переменных окружения:

Переменная Описание

MASTER_NODES

Список FQDN-адресов управляющих узлов через пробел.

WORKER_NODES

Список FQDN-адресов рабочих узлов через пробел.

CONTAINERD_ROOT

Путь к директории с данными containerd (по умолчанию /var/lib/containerd).

Пример запуска в неинтерактивном режиме:

MASTER_NODES="m01.example.com" WORKER_NODES="w01.example.com w02.example.com" CONTAINERD_ROOT="/var/lib/containerd" ./install.sh

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

sudo MASTER_NODES="m01.example.com" WORKER_NODES="w01.example.com w02.example.com" CONTAINERD_ROOT="/var/lib/containerd" ./install.sh

Проверка работоспособности

После завершения установки проверьте статус узлов кластера:

kubectl get nodes

Если все узлы кластера имеют статус Ready, значит кластер успешно развернут.

Работа с узлами

Требования к узлам etcd

etcd — это распределенное ключ-значение хранилище, используемое для хранения конфигурационных данных и управления кластером Kubernetes. Оно обеспечивает хранение данных состояния кластера и используется для координации компонентов кластера.

Для нормальной работы etcd сервис должен быть развернут на нечетном количестве узлов.

После добавления или удаления узлов необходимо убедиться, что их количество соответствует требованиям.

При работе с чётным количеством узлов etcd возможны проблемы при выборе нового лидера кластера. Это может привести к недоступности системы, если произойдёт выбор нового лидера до приведения количества узлов к нечётному числу. Несмотря на это, работающие приложения должны оставаться доступными.

Если необходимо добавить несколько узлов etcd за один запуск, добавьте --extra-vars etcd_retries=10, чтобы увеличить количество повторов между каждым соединением узла etcd. В противном случае кластер etcd может все еще обрабатывать первое соединение, и произойдет сбой на последующих узлах.

После развертывания новых узлов убедитесь, что они присутствуют в конфигурации kube-apiserver:

cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd-servers
- --etcd-servers=https://192.168.0.1:2300,https://192.168.0.2:2300,https://192.168.0.3:2300

Добавление узла

Для добавления нового узла выполните следующие шаги:

  1. Распакуйте архив kubespray из архива с установщиком:

    cd /tmp
    tar xvfz kubespray-installer-redos.tar.gz
    tar xvfz kubespray-offline.tar.gz

    На этом шаге потребуется файл инвентаризации, с которым был развернут существующий кластер.

  2. Обновите файл инвентаризации, с которым был развернут существующий кластер. Добавьте в него новый узел в группу all с указанием IP-адреса и группы kube_node, etcd или kube_control_plane в зависимости от роли нового узла.

    Группа Описание

    all

    Группа со всеми узлами.

    kube_node

    Группа для рабочих узлов.

    kube_control_plane

    Группа для управляющих узлов.

    etcd

    Группа для узлов etcd.

    Пример файла инвентаризации:

    cd /tmp/kubespray
    vi inventory/offline-cluster/inventory.ini
    cat inventory/offline-cluster/inventory.ini
    [all]
    ...
    worker02.example.local ansible_host=192.168.0.0
    ...
    [kube_node]
    ...
    worker02.example.local
    ...

    Через переменную ansible_host указывается имя узла и его IP-адрес, по которому Ansible будет выполнять подключение.

  3. Запустите плейбук sysprep. В параметре --extra-vars sysprep_name=sys-prep-redos передайте название архива sysprep без расширения (по умолчанию sys-prep-redos).

    Если был изменен путь к данным containerd, передайте переменную --extra-vars "containerd_root=/opt/lib/containerd" при запуске sysprep и проверьте, что переменной containerd_storage_dir в файле inventory/offline-cluster/group_vars/all/containerd.yml назначен правильный путь.
    ansible-playbook --ask-pass -uuser -i inventory/offline-cluster/inventory.ini sysprep.yml --extra-vars archive_directory=../../.. --extra-vars sysprep_name=sys-prep-redos
  4. Запустите развертывание кластера:

    ansible-playbook --ask-pass -uuser -b -i inventory/offline-cluster/inventory.ini cluster.yml
  5. Проверьте, что узел добавился:

    kubectl get nodes

Удаление узла

Для удаления узла выполните следующие шаги:

  1. Обновите файл инвентаризации, удалив из него узел:

    cd /tmp/kubespray
    vi inventory/offline-cluster/inventory.ini
    cat inventory/offline-cluster/inventory.ini
  2. Переведите узел в режим обслуживания, чтобы освободить ресурсы на нем:

    kubectl drain --ignore-daemonsets worker02.example.local
  3. После того как ресурсы будут перераспределены, запустите плейбук на удаление узлов:

    Так как плейбуку требуется доступ к файлу /etc/kubernetes/admin.conf и привилегированный доступ, эти шаги необходимо производить под учетной записью root при подключении к узлам кластера через ansible-playbook.
    ansible-playbook --ask-pass -uroot -i inventory/offline-cluster/inventory.ini remove-node.yml --extra-vars "node=worker02.example.local"

    Плейбук запросит подтверждение операции.

  4. После завершения работы плейбука запросите список узлов и проверьте, что узел удален:

    kubectl get nodes
  5. Обновите файл инвентаризации, если необходимо.

Удаление первого узла в инвентарном файле

Так как плейбуку требуется доступ к файлу /etc/kubernetes/admin.conf и привилегированный доступ, эти шаги необходимо производить под учетной записью root при подключении к узлам кластера через ansible-playbook.

Плейбук kubespray не имеет возможности удалить первый узел кластера, указанный в инвентарном файле в группах kube_control_plane и etcd. Чтобы удалить его, необходимо выполнить следующие шаги:

  1. Откройте инвентарный файл и измените порядок узлов:

    cd /tmp/kubespray
    vi inventory/offline-cluster/inventory.ini

    Пример исходного файла:

    children:
      kube_control_plane:
        hosts:
          node-1:
          node-2:
          node-3
      kube_node:
        hosts:
          node-1:
          node-2:
          node-3
      etcd:
        hosts:
          node-1:
          node-2:
          node-3

    Перенесите первый узел, который необходимо удалить, в конец каждой группы:

    children:
      kube_control_plane:
        hosts:
          node-1:
          node-2:
          node-3
      kube_node:
        hosts:
          node-1:
          node-2:
          node-3
      etcd:
        hosts:
          node-1:
          node-2:
          node-3
  2. Запустите плейбук на обновление кластера:

    ansible-playbook --ask-pass -uroot -i inventory/offline-cluster/inventory.ini upgrade-cluster.yml
  3. После завершения работы плейбука удалите необходимый узел.