Установка KeyStack LCM в режиме высокой доступности¶
Данная инструкция описывает установку LCM (Lifecycle Manager) в режиме высокой доступности. В этом режиме LCM развёртывается на трёх Control-узлах, образующих Kubernetes-кластер на базе k0s. Такая архитектура обеспечивает отказоустойчивость самой системы управления жизненным циклом платформы.
Описание базовой установки LCM на одном узле приведено в разделе Установка KeyStack LCM.
Настройка компонента VMHA для обеспечения отказоустойчивости виртуальных машин описана в разделе VMHA — Высокая доступность ВМ.
Примечание
На текущий момент поддерживаются два варианта инсталлятора:
Новый инсталлятор k0s (описан в данной инструкции) — рекомендуется для новых установок
Классический инсталлятор — поддерживается для обеспечения совместимости с существующими установками
Оба варианта будут поддерживаться в переходный период. Выбор инсталлятора зависит от требований вашей инфраструктуры и планов миграции.
Требования к инфраструктуре¶
Аппаратные требования для HA LCM¶
Для развёртывания LCM в режиме высокой доступности предъявляются специальные требования к LCM-узлам:
Количество узлов: ровно 3 (для обеспечения кворума)
Оперативная память: минимум 32 ГБ на узел
Процессор: минимум 16 ядер x86-64/AMD64 на узел
Дисковая подсистема:
Системные диски: 2×500 ГБ SSD в конфигурации RAID 1 для операционной системы и системных компонентов
Диск для Ceph: минимум 1×500 ГБ SSD без RAID для распределённого хранилища Ceph
Предупреждение
Важно использовать отдельные физические диски для системы и Ceph. Размещение системы и Ceph на одном диске существенно снижает производительность и надёжность кластера.
Сетевые интерфейсы: 2×10 ГБ NIC для обеспечения резервирования сетевых подключений
Аппаратные требования для остальных узлов¶
Требования к остальным типам узлов платформы:
Требование / Тип узла |
Controller |
Compute |
Network |
Storage |
|---|---|---|---|---|
Обязательность |
Да |
Да |
Да |
Нет |
Минимальное количество узлов |
3 |
2 |
1 |
— |
Оперативная память |
256 ГБ |
— |
— |
— |
Процессор (ядер) |
2×8 |
2×12 |
2×8 |
— |
Архитектура процессора |
x86-64 / AMD64 |
x86-64 / AMD64 |
x86-64 / AMD64 |
— |
Место для хранения |
2×512 ГБ SSD (RAID 1) |
— |
— |
— |
Сетевая карта |
2×10 ГБ NIC |
2×10 ГБ NIC |
2× (2×10 ГБ NIC) |
— |
Программные требования¶
На всех узлах должна быть установлена ОС SberLinux. Требуется наличие непривилегированного пользователя с правами sudo для выполнения команд от имени root.
Примечание
Установщик автоматически применяет необходимые настройки ядра ОС и устанавливает требуемые системные пакеты в процессе развёртывания. Все необходимые оптимизации и зависимости включены в дистрибутив и применяются на этапе выполнения installer.sh.
Сетевые требования¶
Для работы LCM требуется настроенная DNS-зона со следующими записями:
gitlab.<доменная зона>— для управления жизненным циклом платформы (CI),nexus.<доменная зона>— для хранения артефактов платформы,vault.<доменная зона>— для хранения паролей и сертификатов,netbox.<доменная зона>— для настроек Baremetal-узлов,minio.<доменная зона>— для работы GitLab,docker.<доменная зона>— для хранения контейнеров,grafana.<доменная зона>— для мониторинга платформы,k0s.<доменная зона>— для API Kubernetes.
Также для всех Baremetal-узлов инфраструктуры требуется создать DNS-записи вида <IP-адрес> <имя узла>-rmi.<доменная зона>.
Подготовительные шаги¶
Перед началом установки выполните следующие действия:
Настройка узлов¶
Создайте узлы необходимых типов согласно аппаратным и программным требованиям.
Убедитесь, что на всех узлах время в BIOS настроено в зоне UTC.
На LCM-узлах под управлением ОС SberLinux выполните команду:
$ timedatectl set-local-rtc 0
Убедитесь, что у непривилегированного пользователя есть права
sudoна выполнение команд отroot.Убедитесь, что на всех узлах включена аппаратная виртуализация:
$ egrep '(vmx|svm)' /proc/cpuinfo
Вывод должен содержать параметр
vmxилиsvm. Если он отсутствует, включите аппаратную виртуализацию в настройках BIOS.Получите дистрибутив KeyStack одним из вариантов поставки.
Создайте SSH-ключ и разместите его на LCM-узлы, чтобы обеспечить беспарольный вход с первого узла на другие узлы.
На всех LCM-узлах отключите фаервол и SELinux.
На всех LCM-узлах настройте синхронизацию времени.
Убедитесь, что на свободных дисках (особенно на дисках, предназначенных для Ceph) нет никакой информации, разделов и других данных. Диски должны быть полностью очищены.
Настройка сетевой связности¶
На LCM-узле проверьте сетевую связность:
Для всех Baremetal-узлов создайте пользователя с правами
administrator.
Установка инсталлятора¶
Установка выполняется на первом LCM-узле.
Подключитесь по SSH к первому LCM-узлу.
Скачайте архив с инсталлятором и распакуйте его:
$ curl -O https://repo.itkey.com/repository/k-install/installer-k0s-ks2025.2.2-sberlinux-offline.tgz $ tar -xf installer-k0s-ks2025.2.2-sberlinux-offline.tgz $ cd installer $ tar -xf mutiple-node-k0s-ks2025.2.2.tar.gz
Откройте файл конфигурации:
$ vi mutiple-node/lcm-config.yaml
Настройте параметры установки. Основные параметры:
ssh_username— имя непривилегированного пользователя, от которого выполняется установка.fqdn_cp1,fqdn_cp2,fqdn_cp3— DNS-имена LCM-узлов.domain_name— доменная зона для региона. В этой зоне должны быть зарегистрированы все сервисы LCM.mgt_vip_address— VIP-адрес управления Kubernetes (K0s).ext_vip_address— VIP-адрес доступа к сервисам LCM (GitLab, NetBox, Vault, Nexus). Должен быть зарегистрирован в DNS в зонеdomain_name.keepalived_passwd— пароль для keepalived (максимум 8 символов).ironic_enable— управление сервисом Ironic для работы с Baremetal-узлами. При первичной установке укажите"false". Ironic можно будет включить позже через настройки мониторинга после развёртывания основных компонентов.
Пример конфигурации:
ssh_username: "cloud-user" fqdn_cp1: "cp-1.testdomain.local" fqdn_cp2: "cp-2.testdomain.local" fqdn_cp3: "cp-3.testdomain.local" domain_name: "testdomain.local" mgt_vip_address: "172.16.130.10" ext_vip_address: "10.120.120.240" keepalived_passwd: "8LJw251u" ironic_enable: "false"
Остальные параметры (размеры томов, настройки мониторинга) можно оставить по умолчанию или настроить согласно требованиям.
Примечание
В файле
lcm-config.yamlдоступны дополнительные параметры для настройки мониторинга и сервиса Ironic:Мониторинг: параметры для настройки Grafana, Prometheus и алертинга можно найти в секции мониторинга файла конфигурации. По умолчанию включён базовый мониторинг компонентов LCM.
Ironic: после первичной установки платформы сервис Ironic можно активировать, изменив параметр
ironic_enableна"true"и выполнив обновление конфигурации. Ironic необходим для управления Baremetal-узлами через IPMI/Redfish.
Сохраните и закройте файл.
Запустите установку:
$ ./installer.sh mutiple-node/lcm-config.yaml
Скрипт установит необходимые пакеты в систему и выполнит настройку ОС. На этом этапе применяются все необходимые настройки ядра и устанавливаются системные зависимости.
Этап установки order 1¶
На первом этапе устанавливается Kubernetes-кластер и система хранения данных Ceph.
Для первичной установки или переустановки этапа выполните:
$ cd mutiple-node/ $ ./offline-bundle/installer.sh --order 1
Проверка успешного завершения¶
Проверьте состояние узлов кластера. Должны отобразиться три узла в статусе
Ready:$ kubectl get nodes NAME STATUS ROLES AGE VERSION <имя>-lcm-01.vm.lab.itkey.com Ready control-plane 7m14s v1.31.5+k0s <имя>-lcm-02.vm.lab.itkey.com Ready control-plane 6m41s v1.31.5+k0s <имя>-lcm-03.vm.lab.itkey.com Ready control-plane 6m41s v1.31.5+k0s
Проверьте состояние OSD-дисков Ceph. Должны отобразиться три пода в статусе
Running:$ kubectl get pod -l app.kubernetes.io/name=ceph-osd -n ceph-cluster NAME READY STATUS RESTARTS AGE rook-ceph-osd-0-6cb69b89b6-2n5fc 2/2 Running 0 60s rook-ceph-osd-1-cf7476bcf-vnlj6 2/2 Running 0 60s rook-ceph-osd-2-54884b7c48-2s746 2/2 Running 0 59s
Проверьте состояние кластера Ceph. Должен отобразиться кластер в фазе
Readyсо статусом здоровьяHEALTH_WARN:$ kubectl get -n ceph-cluster cephclusters.ceph.rook.io NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH ceph-cluster /var/lib/rook 3 8m43s Ready Cluster created successfully HEALTH_WARN
Подключение к Active Directory¶
Для интеграции ролевой модели KeyStack с централизованным каталогом организации выполните настройку подключения к Active Directory или LDAP-серверу. Подробные сведения о ролевой модели и принципах её работы описаны в разделе Ролевая модель KeyStack.
Требования к LDAP-серверу¶
Для корректной работы интеграции требуется:
LDAP-сервер с поддержкой TLS (LDAPS).
Доступ к серверу исключительно по DNS-имени (для корректной проверки TLS-сертификатов).
Корневой сертификат центра сертификации в формате PEM.
Учётная запись для привязки (bind) с правами чтения каталога.
Настройка параметров¶
Откройте файл конфигурации:
$ vi mutiple-node/lcm-config.yaml
Настройте блок Active Directory:
# Active Directory ldap_enable: "true" ldap_host: "dc-01.domain.loc" ldap_ca_cert_file: "ldap-root-cert.crt" ldap_bind_dn: "CN=test,CN=Users,DC=domain,DC=loc" ldap_user_search_basedn: "CN=Users,DC=domain,DC=loc" ldap_group_search_basedn: "CN=Users,DC=domain,DC=loc" ldap_reader_group_dn: "CN=KeyStack-Readers,CN=Users,DC=domain,DC=loc" ldap_auditor_group_dn: "CN=KeyStack-Auditors,CN=Users,DC=domain,DC=loc" ldap_admin_group_dn: "CN=KeyStack-Admins,CN=Users,DC=domain,DC=loc"
Где:
ldap_enable— включение интеграции с LDAP ("true"или"false").ldap_host— FQDN-имя сервера Active Directory. В SAN сертификата должно быть указано это имя.ldap_ca_cert_file— имя файла с корневым сертификатом ЦА в формате PEM.ldap_bind_dn— DN учётной записи для привязки к LDAP.ldap_user_search_basedn— базовый DN для поиска пользователей.ldap_group_search_basedn— базовый DN для поиска групп.ldap_reader_group_dn,ldap_auditor_group_dn,ldap_admin_group_dn— DN групп AD, соответствующих ролям KeyStack.
Создайте файл с корневым сертификатом CA:
$ cat > mutiple-node/ca-cert.pem << EOF -----BEGIN CERTIFICATE----- <содержимое сертификата> -----END CERTIFICATE----- EOF
Сохраните корневой сертификат центра сертификации в формате PEM в файл с именем, указанным в параметре
ldap_ca_cert_file:$ vi mutiple-node/ldap-root-cert.crt
Вставьте содержимое сертификата и сохраните файл.
Создание секретов для NetBox¶
Создайте Kubernetes-секрет с паролем для учётной записи привязки к LDAP:
$ export config_file='charts-config.yaml' $ export netbox_namespace=$(yq '.charts[] | select(.name == "netbox") | .namespace' "$config_file") $ kubectl create namespace "${netbox_namespace}" $ kubectl create -n "${netbox_namespace}" secret generic netbox-ldap \ --from-literal=email_password='' \ --from-literal=secret_key=$(python3 -c "import secrets; print(secrets.token_urlsafe(50))") \ --from-literal=ldap_bind_password='<пароль учётной записи ldap bind dn>'
Создание секретов для GitLab¶
Создайте Kubernetes-секрет с паролем для учётной записи привязки к LDAP:
$ export config_file='charts-config.yaml' $ export gitlab_namespace=$(yq '.charts[] | select(.name == "gitlab") | .namespace' "$config_file") $ kubectl create namespace "${gitlab_namespace}" $ kubectl create -n "${gitlab_namespace}" secret generic gitlab-ldap \ --from-literal=ldap_bind_password='<пароль учётной записи ldap bind dn>'
Подробная информация о ролях KeyStack и их привилегиях описана в разделах Настройка интеграции с LDAP/AD и Описание ролевой модели.
Этап установки order 2¶
На втором этапе устанавливаются сервисы LCM: GitLab, NetBox, Nexus, Vault, мониторинг и другие компоненты.
Перед запуском команды убедитесь, что все поды из предыдущего этапа подняты и нет ошибок:
$ kubectl get pod -A
Запустите установку:
$ ./offline-bundle/installer.sh --order 2
Примечание
При использовании медленных дисков рекомендуется использовать опцию --helm-wait. Она обеспечивает последовательную установку компонентов:
$ ./offline-bundle/installer.sh --order 2 --helm-wait
Проверка успешного завершения¶
Проверьте список установленных Helm-чартов:
$ helm list -aA Должны отобразиться все компоненты LCM в статусе ``deployed``: * ``gitlab`` * ``netbox`` * ``nexus3`` * ``vault`` * ``metallb`` * ``nginx-ingress-controller`` * ``postgres-operator`` * ``redis-ha`` (для GitLab и NetBox) * ``rook-ceph`` * ``rook-ceph-cluster``
Проверьте состояние всех подов:
$ kubectl get all -A
Все поды должны быть в статусе
RunningилиCompleted.
Наполнение LCM данными¶
После успешной установки всех компонентов выполните наполнение LCM начальными данными:
$ bash upload.sh mutiple-node/charts-config.yaml
На каждый запуск скрипта создаётся лог-файл в формате upload_<дата>_<время>.log.
Обновление LCM¶
Для обновления LCM на новую версию выполните следующие действия:
Перед обновлением создайте резервную копию конфигурации кластера:
$ k0sctl backup
Эта операция может занять продолжительное время. Для тестовых окружений этот шаг можно пропустить.
Скачайте новую версию инсталлятора:
$ curl -O https://repo.itkey.com/repository/k-install/mutiple-node-${RELEASE_TAG}.tar.gz
Например:
$ curl -O https://repo.itkey.com/repository/k-install/mutiple-node-k0s-ks2025.2.3-rc5.tar.gz
Распакуйте архив:
$ tar -xzvf mutiple-node-${RELEASE_TAG}.tar.gz $ cd mutiple-node
Скопируйте значения переменных из текущей инсталляции в новый файл конфигурации:
$ vi charts-config.yaml
Убедитесь, что все параметры (
domain_name,mgt_vip_address,ext_vip_address, настройки LDAP и другие) соответствуют текущей установке.Перед запуском команды обновления убедитесь, что все поды подняты и нет ошибок:
$ kubectl get pod -A
Запустите процесс обновления:
$ ./offline-bundle/installer.sh --upgrade
Примечание
При использовании медленных дисков рекомендуется использовать опцию
--helm-wait:$ ./offline-bundle/installer.sh --upgrade --helm-wait
Резервное копирование LCM¶
Для хранения резервных копий LCM используется система Velero, которая сохраняет копии в объектном хранилище S3. Предполагается, что S3-совместимое хранилище предоставляется заказчиком.
Ниже описан процесс настройки резервного копирования на примере тестового развёртывания с использованием Minio.
Настройка Minio для тестирования¶
Для тестирования работы Velero можно развернуть Minio в Docker на отдельном узле.
Создайте файл
minio.ymlдля Docker Compose:services: minio: image: quay.io/minio/minio container_name: minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minio MINIO_ROOT_PASSWORD: passw0rd volumes: - "${PWD}/data:/data" command: server /data --console-address ":9001"
Создайте директорию для данных:
$ mkdir data
Запустите контейнер с Minio:
$ docker compose -f minio.yml up -d
Откройте веб-интерфейс Minio по адресу
http://<IP-адрес>:9001и создайте бакет с именемlcm.
Настройка Velero¶
Создайте конфигурационный файл авторизации для доступа к Minio:
$ cat << EOF > ./credentials-velero [default] aws_access_key_id=minio aws_secret_access_key=passw0rd EOF
Установите Velero в Kubernetes:
$ velero install \ --features=EnableCSI \ --provider aws \ --plugins docker.io/velero/velero-plugin-for-aws:v1.12.1 \ --bucket lcm \ --secret-file ./credentials-velero \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://172.16.130.156:9000
Где:
--plugins— образ плагина для работы с AWS S3 (указан вcustom-images-list.txt).--bucket— имя бакета для хранения резервных копий.--backup-location-config— параметры подключения к S3:region— регион S3 (можно посмотреть в GUI Minio).s3Url— URL API Minio.
Удалите файл с учётными данными:
$ rm -f ./credentials-velero
Настройки доступа хранятся в Kubernetes-секрете.
Проверьте установку Velero. Должен отобразиться под в статусе
Running:$ kubectl get pod -n velero NAME READY STATUS RESTARTS AGE velero-75b867769d-gxh5s 1/1 Running 0 4h29m
Создание резервной копии¶
Velero поддерживает различные варианты создания резервных копий: по расписанию, с ротацией, с выбором компонентов для включения в копию.
Создайте резервную копию компонента LCM GitLab:
$ velero backup create gitlab --include-namespaces lcm-gitlab
В случае успешного завершения вы увидите:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR gitlab Completed 0 0 2025-02-11 14:40:54 +0000 UTC 29d default <none>
Для получения подробной информации о резервной копии выполните:
$ velero backup describe gitlab --details
Восстановление из резервной копии¶
В качестве примера удалите namespace компонента LCM GitLab:
$ kubectl delete namespaces lcm-gitlab
Примечание
Удаление namespace занимает продолжительное время. Дождитесь завершения операции перед переходом к следующему шагу.
Восстановите namespace из резервной копии:
$ velero restore create --from-backup gitlab
Должно отобразиться состояние:
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR gitlab-20250211151000 gitlab Completed 2025-02-11 15:10:00 +0000 UTC 2025-02-11 15:12:21 +0000 UTC 0 6 2025-02-11 15:10:00 +0000 UTC <none>
Если восстановление завершилось с ошибками, изучите логи пода Velero:
$ kubectl logs -n velero <имя пода velero>
Для получения имени пода выполните команду:
$ kubectl get pod -n velero