Развертывание кластера Kubernetes
Введение
До установки R-Vision SIEM необходимо развернуть кластер Kubernetes. Это руководство описывает процесс офлайн установки кластера Kubernetes с использованием автономного установщика на базе Kubespray.
Требования
Для узлов кластера Kubernetes
Ресурс | Один сервер | Распределенная (управляющий узел) | Распределенная (рабочий узел) |
---|---|---|---|
CPU (ядер) |
12 |
4 |
12 |
RAM (ГБ) |
16 |
4 |
12 |
Storage (ГБ) |
100 |
100 |
100 |
При распределенной установке необходимо обеспечить сетевое взаимодействие между узлами кластера с пропускной способностью не менее 10 Мбит/сек.
Подготовка зависимостей
Необходимые архивы
Для установки потребуется архив kubespray-installer-redos.tar.gz для RedOS.
Архив с установочным файлом kubespray-installer-redos.tar.gz необходимо загрузить во временную директорию /tmp
.
Распаковка архива
Выполните следующие шаги на управляющем узле или машине администратора:
-
Загрузите файл
kubespray-installer-redos.tar.gz
во временную директорию/tmp
на сервер, на котором должен быть развернут кластер:Example 1. Для Windowspscp "путь\к\файлу\kubespray-installer-redos.tar.gz" user@server:/tmp
Example 2. Для Linux или macOSscp путь\к\файлу\kubespray-installer-redos.tar.gz user@server:/tmp
-
Распакуйте архив с установочными файлами. Используйте следующие команды:
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-адрес узла>
Запуск скрипта установки
Скрипт принимает следующие переменные окружения:
Переменная | Описание |
---|---|
|
Запрос пароля для подключения к узлам по SSH. |
|
Пользователь для подключения к узлам по SSH. |
|
Пароль для подключения к узлам по SSH. |
|
Запрос пароля для повышения до sudo. |
|
Уровень детализации логирования (0-4). По умолчанию установлен минимальный уровень детализации (0). |
Пример запуска с переменными окружения:
ANSIBLE_USER=username ANSIBLE_PASSWORD=password ./install.sh
По умолчанию скрипт установки запускается в интерактивном режиме, при котором отдельно запрашиваются FQDN-адреса для каждого узла кластера и путь до директории с данными containerd. Чтобы отключить интерактивность скрипта установки, необходимо сразу передать эти данные при его запуске с помощью следующих переменных окружения:
Переменная | Описание |
---|---|
|
Список FQDN-адресов управляющих узлов через пробел. |
|
Список FQDN-адресов рабочих узлов через пробел. |
|
Путь к директории с данными 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
Добавление узла
Для добавления нового узла выполните следующие шаги:
-
Распакуйте архив kubespray из архива с установщиком:
cd /tmp tar xvfz kubespray-installer-redos.tar.gz tar xvfz kubespray-offline.tar.gz
На этом шаге потребуется файл инвентаризации, с которым был развернут существующий кластер.
-
Обновите файл инвентаризации, с которым был развернут существующий кластер. Добавьте в него новый узел в группу
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 будет выполнять подключение. -
Запустите плейбук 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
-
Запустите развертывание кластера:
ansible-playbook --ask-pass -uuser -b -i inventory/offline-cluster/inventory.ini cluster.yml
-
Проверьте, что узел добавился:
kubectl get nodes
Удаление узла
Для удаления узла выполните следующие шаги:
-
Обновите файл инвентаризации, удалив из него узел:
cd /tmp/kubespray vi inventory/offline-cluster/inventory.ini cat inventory/offline-cluster/inventory.ini
-
Переведите узел в режим обслуживания, чтобы освободить ресурсы на нем:
kubectl drain --ignore-daemonsets worker02.example.local
-
После того как ресурсы будут перераспределены, запустите плейбук на удаление узлов:
Так как плейбуку требуется доступ к файлу /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"
Плейбук запросит подтверждение операции.
-
После завершения работы плейбука запросите список узлов и проверьте, что узел удален:
kubectl get nodes
-
Обновите файл инвентаризации, если необходимо.
Удаление первого узла в инвентарном файле
Так как плейбуку требуется доступ к файлу /etc/kubernetes/admin.conf и привилегированный доступ, эти шаги необходимо производить под учетной записью root при подключении к узлам кластера через ansible-playbook.
|
Плейбук kubespray не имеет возможности удалить первый узел кластера, указанный в инвентарном файле в группах kube_control_plane
и etcd
. Чтобы удалить его, необходимо выполнить следующие шаги:
-
Откройте инвентарный файл и измените порядок узлов:
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
-
Запустите плейбук на обновление кластера:
ansible-playbook --ask-pass -uroot -i inventory/offline-cluster/inventory.ini upgrade-cluster.yml
-
После завершения работы плейбука удалите необходимый узел.