Установка DropApp#
Шаги, приведенные в этой инструкции, описывают последовательность действий для установки DropApp на операционные системы Platform V SberLinux OS Server и/или Platform V SberLinux OS Core (далее – SberLinux) с помощью утилиты Dactl.
Порядок установки:
Установка DropApp с помощью утилиты Dactl#
Подготовка машин для кластера#
Высокодоступная конфигурация#
Высокодоступная конфигурация DropApp (HA-конфигурация) — это архитектура кластера DropApp, которая обеспечивает высокую доступность и устойчивость к сбоям, гарантируя, что кластер всегда доступен и работает даже в условиях аварий. В данной конфигурации обеспечивается дублирование критических компонентов, резервирование ресурсов и механизмы автоматического восстановления после отказа.
Для высокодоступной конфигурации потребуется:
3 control plane машины:
Минимальная конфигурация Control plane node:
Значение
Размер
ЦПУ [CPU] (в ядрах)
4 (с поддержкой VT*)
ОЗУ [RAM]
8192 Мб
Размер диска [HDD/SSD]
15 Гб
Рекомендуемая конфигурация Control plane node:
Значение
Размер
ЦПУ [CPU] (в ядрах)
8 (с поддержкой VT*)
ОЗУ [RAM]
16000 Мб
Размер диска [HDD/SSD]
50 Гб
2 worker машины:
Минимальная конфигурация worker node:
Значение
Размер
ЦПУ [CPU] (в ядрах)
4 (с поддержкой VT*)
ОЗУ [RAM]
8192 Мб
Размер диска [HDD/SSD]
30 Гб
Рекомендуемая конфигурация worker node:
Значение
Размер
ЦПУ [CPU] (в ядрах)
8 (с поддержкой VT*)
ОЗУ [RAM]
16000 Мб
Размер диска [HDD/SSD]
100 Гб
Минимальная конфигурация#
Минимальная конфигурация DropApp (min-config) — это базовая структура кластера DropApp, которая включает в себя минимальное количество компонентов, необходимых для обеспечения базовой функциональности кластера.
Для минимальной конфигурации потребуется 1 control plane машина и 2 worker машины.
Создание SSH-ключа на машине администратора#
Сгенерируйте пару SSH-ключей на машине администратора, используя команду ssh-keygen.
Пример с использованием типа RSA#
Для генерации SSH-ключей с использованием типа RSA и длиной не менее 4096 бит используйте команду:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/id_dapp
Где:
-t- тип ключа, напримерrsaилиed25519;-b- длина ключа (для RSA рекомендуется 4096 бит);-C- комментарий, обычно email;-f- путь и имя файла для сохранения ключей.
Пример с использованием типа Ed25519#
Для генерации SSH-ключей с использованием типа Ed25519 используйте команду:
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_dapp
Дополнительные настройки для каждой машины кластера#
На каждой машине кластера:
поместите публичный ключ
~/.ssh/id_dapp.pubв домашний каталог;проверьте доступ по SSH на каждую машину кластера с машины администратора;
Остальные настройки обеспечит Dactl.
Установка базовой языковой региональной настройки#
Для установки базовой языковой региональной настройки выполните следующие шаги:
Для установки базовой языковой региональной настройки, системной локали, установите пакет поддержки английского языка в приложениях с помощью команды:
dnf install glibc-langpack-enИзмените системную локаль с помощью команды:
localectl set-locale LANG=en_US.UTF-8Пример вывода:
LANG=en_US.UTF-8 LC_TIME=ru_RU.UTF-8 LC_MONETARY=en_US.UTF-8
Создание пользователя dapp#
На каждой машине:
Создайте пользователя с домашним каталогом:
useradd dappДобавьте пользователя
dappв группу sudo:usermod -aG wheel dappПредоставьте пользователю
dappправа на использование командыsudoбез пароля:echo "dapp ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/99-dapp-nopasswdНазначьте необходимые права пользователю
dapp:chmod 440 /etc/sudoers.d/99-dapp-nopasswd
Перемещение публичного ключа#
Для перемещения публичного ключа, выполните следующие шаги:
На машине администратора выведите сгенерированный ключ:
cat ~/.ssh/id_dapp.pubПример вывода:
"ssh-rsa AAAAaaaaa.....11111== email@example.com"Для перемещения публичного ключа на каждой машине кластера:
Переключитесь на пользователя
dapp:sudo su - dappСоздайте каталог для ключа:
mkdir -p ~/.sshСкопируйте ключ:
echo "ssh-rsa AAAAaaaaa.....11111== email@example.com" >> ~/.ssh/authorized_keysНазначьте необходимые права для каталога
~/.ssh:chmod 700 ~/.sshНазначьте необходимые права для каталога
~/.ssh/authorized_keys:chmod 600 ~/.ssh/authorized_keys
Проверка доступа по SSH#
Чтобы проверить, что с машины администратора для пользователя dapp есть доступ без пароля по протоколу SSH на каждую машину кластера, воспользуйтесь командами:
для control palne:
ssh dapp@<ip-address-control-plane> -i .ssh/id_dappдля каждого worker node:
ssh dapp@<ip-address-worker-node> -i .ssh/id_dappГде
id_dapp- имя файла приватного ключа SSH, который используется для аутентификации при подключении к удаленному серверу.
Добавление локального реестра с RPM-репозиторием#
Для добавления локального реестра с RPM-репозиторием отредактируйте файл sberlinux.repo:
vi /etc/yum.repos.d/sberlinux.repo
Пример конфигурации:
[sbel-<version>-appstream]
name=sbel-<version>-appstream Repository
baseurl=http://<repository_ip>:8080/sbel-<version>-appstream
enabled=1
gpgcheck=0
[sbel-<version>-baseos]
name=sbel-<version>-appstream Repository
baseurl=http://<repository_ip>:8080/sbel-<version>-baseos
enabled=1
gpgcheck=0
Где <repository_ip> содержится в выводе скрипта rpm_repo_install.sh, в разделе Подготовка окружения.
Формирование конфигурационного файла DropAppConfiguration#
Перед формированием конфигурационного файла DropAppConfiguration для Dactl, убедитесь в наличии:
реестра с образами контейнеров DropApp, созданного в разделе «Подготовка окружения»;
сертификата для реестра образов Harbor, созданного в разделе «Подготовка окружения»;
репозитория с RPM-пакетами DropApp, например
http://my-rpm-repo.com/dapp/<version>;репозитория с RPM-пакетами Platform V SberLinux OS Server, например
http://my-rpm-repo.com/SLO/<version>, в этом репозитории есть зависимости для DropApp;машины с пользователем
dapp;токена аутентификации для Harbor, указанного в файле
da.yamlв полеcredentials:.
Создайте конфигурационный файл (далее - файл, манифест)
da.yaml:da.yaml
apiVersion: config.dropapp.ru/v1alpha1 kind: DropAppConfiguration metadata: name: "da-cluster" spec: network: publicDomain: domain.ru metallb: pools: - addresses: "000.000.00.000/32" # Адрес из пула адресов для Metallb, описанный в разделе "Подготовка окружения" name: "dapp" l2Advertisement: true artifacts: # Реестр образов, куда были загружены образы в разделе "Подготовке окружения" imageRegistry: host: registry.da-cluster.domain.ru # Пример имени хоста реестра Harbor path: dapp # Если реестр без аутентификации - поле можно удалить credentials: <credentials> # Токен аутентификации в base64 для Harbor, в приведенном примере это echo -n 'admin:Harbor12345' | base64 | base64 certificate: <certificate> # Сертификат реестра. Если реестр имеет доверенный сертификат - поле можно удалить rpmRepository: - name: "dapp-<version>" baseUrl: http://000.000.00.27:8080/dapp-<version>-sbel9 gpgCheck: 0 enabled: 1 #gpgKey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux" - name: "slo-baseos-9.5" baseUrl: http://000.000.10.27:8080/sbel-9.5-baseos gpgCheck: 0 enabled: 1 #gpgKey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux" - name: "slo-appstream-9.5" baseUrl: http://000.000.10.27:8080/sbel-9.5-appstream gpgCheck: 0 enabled: 1 #gpgKey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux" compute: sshAccess: user: dapp privateKeyPath: "~/.ssh/id_dapp" userProvisioned: nodes: # Для высокодоступной конфигурации впишите еще 2 control-plane в список controlPlane controlPlane: - ip: "000.000.00.28" nodePool: "control-plane" worker: - ip: "000.000.00.29" nodePool: "worker" #- ip: "000.000.00.26" # nodePool: "worker" k8s: cni: cilium: values: tunnelProtocol: geneve podSubnetCIDR: 00.111.0.0/16 # При необходимости, настройте сеть для pods serviceSubnetCIDR: 00.22.0.0/16 # При необходимости, настройте сеть для сервисов # При необходимости, настройте ingressTLS. Если не указан, будет сгенерирован автоматически #ingressTLS: # cert: <certificate>... # key: <key>...Заполните поле
credentialsв блокеimageRegistry. Для этого получите токен аутентификации для Harbor, выполнив на машине администратора следующую команду:echo -n "admin:<harbor-admin-password>" | base64 | base64Пример вывода:
<credentials>==Заполните поле
certificateв блокеimageRegistry. Для этого используйте сертификат для Harbor, выполнив на машине администратора следующую команду:~~bash at ./harbor/certs/harbor.crt | base64 -w0 ~~
Пример вывода:
<certificate>
Запуск установки кластера#
Для установки кластера выполните команду:
./dactl/dactl create cluster --config ./da.yaml
Примечание
Для вывода полного лога увеличьте уровень verbosity, добавив флаг -v=6.
В конце установки появится сообщение:
======================================
Done! DropApp cluster with name 'da-cluster' and version '<version>' is successfully installed!
Next steps are:
- Cluster config is stored to this machine as /home/dapp/.dropapp/da-cluster/kubeconfig
you may need to export this path to the KUBECONFIG environment variable
or copy it as '~/.kube/config'
otherwise use it as --kubeconfig parameter value for kubectl or dactl commands
- Check pods and nodes by executing `kubectl get pods -A; kubectl get nodes`
- Check installed Platform V DropApp components by executing `kubectl get components -o wide`
- Check installed Platform V DropApp tools by executing `kubectl get tools -o wide`
- Visit Platform V DropApp UI: https://console.da-cluster.domain.ru
login: kubeadmin
password is stored in: /home/dapp/.dropapp/da-cluster/kubeadmin-password
Описание установленного кластера#
Артефакты установки#
После завершения процесса установки на машине администратора будут доступны следующие артефакты:
конфигурационный файл кластера:
/home/dapp/.dropapp/da-cluster/kubeconfig;параметры учетной записи пользователя
kubeadmin, в частности пароль для учетной записи в файле/home/dapp/.dropapp/da-cluster/kubeadmin-password. Данный артефакт можно использовать для доступа в пользовательскую консоль по адресу из примераhttps://console.da-cluster.domain.ru.
Установленные компоненты#
Для проверки перечня установленных компонентов, с помощью утилиты Kubectl, выполните команду:
./kubectl get components -o wide
Вывод команды покажет список установленных по умолчанию компонентов:
NAME STATUS AGE DAPP VERSION TOOLS
auth success 2m10s <version> dex, role-model
cert-management success 2m10s <version> cert-manager
cni success 2m10s <version> cilium
ingress-controller success 2m10s <version> ingress-nginx
load-balancer success 2m10s <version> metallb
ui success 2m10s <version> console
Установка утилиты Kubectl#
Для установки утилиты Kubectl выполните следующие шаги:
Скопируйте файл конфигурации в каталог
~/.kube/configс помощью команды:cp -p ~/.dropapp/da-cluster/kubeconfig ~/.kube/configИзвлеките Kubectl
unzip k8sc-binaries-<version>-<distrib_number>-distrib.zip
Установленные инструменты#
Для проверки перечня установленных инструментов, с помощью утилиты Kubectl из релизного дистрибутива, выполните команду:
./kubectl get tools -o wide
Вывод команды покажет список установленных по умолчанию инструментов и их версии:
NAME STATUS RETRY AGE VERSION DAPP VERSION COMPONENT
cert-manager success 0 2m10s <tool-version> <version> cert-management
cilium success 0 2m10s <tool-version> <version> cni
console success 0 2m10s <tool-version> <version> ui
dex success 0 2m10s <tool-version> <version> auth
ingress-nginx success 0 2m10s <tool-version> <version> ingress-controller
metallb success 0 2m10s <tool-version> <version> load-balancer
role-model success 0 2m10s <tool-version> <version> auth
Добавление новых node в кластер#
Добавление node в кластер происходит через создание Custom Resource с типом DropAppNode.
Подготовка машины#
Подготовьте машину, как описано в разделе «Подготовка машин для кластера».
Подготовка DropAppNode манифеста#
Worker node#
Создайте манифест с именем, например, dapp-node.yaml:
dapp-node.yaml
apiVersion: nodes.dropapp.ru/v1alpha1
kind: DropAppNode
metadata:
name: <DropAppNode-name> # например, dapp-worker-03.da-cluster.domain.ru
spec:
compute:
hostname: <DropAppNode-name> # например, dapp-worker-03.da-cluster.domain.ru
ip: 00.00.00.53
nodePool: worker # Значение подставится как роль для node (kubectl get nodes)
nodeType: worker
sshAccessRef:
kind: SSHAccess
name: primary-nodes-access # ресурс SSHAccess с именем primary-nodes-access создан автоматически при создании кластера
Примечание
Значения полей metadata.name и spec.compute.hostname должны совпадать. Также важно следить, чтобы не было конфликтов с существующими dropappnodes. Посмотреть существующие dropappnodes, которые создаются Dactl автоматически, можно командой kubectl get dropappnodes -o wide.
Применение DropAppNode манифеста#
Примените манифест:
./kubectl apply -f ./dapp-node.yaml
Валидация добавления нового node в кластер#
Проверьте, что node добавлен:
./kubectl get nodes
NAME STATUS ROLES AGE VERSION
dapp-cp-01.da-cluster.domain.ru Ready control-plane 83m <kubernetes-version>
dapp-worker-01.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
dapp-worker-02.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
dapp-worker-03.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
Проверьте, что ресурс dropappnode создан, дождитесь, пока он будет в статусе ready:
./kubectl get dropappnodes
NAME STATUS AGE TYPE IP ADDRESS
dapp-cp-01.da-cluster.domain.ru ready 5m28s control-plane 00.00.00.41
dapp-worker-01.da-cluster.domain.ru ready 5m28s worker 00.00.00.51
dapp-worker-02.da-cluster.domain.ru ready 5m28s worker 00.00.00.52
dapp-worker-03.da-cluster.domain.ru ready 74s worker 00.00.00.53
Control-plane node#
Для создания высокодоступного кластера или расширения количества control-plane nodes в существующем высокодоступном кластере добавьте новые control-plane nodes.
После добавления control-plane node на него автоматически реплицируются все control-plane pods (apiserver, controller-manager, scheduler, etcd).
Примечание
При применении пользовательского controlPlaneEndpoint, новый control-plane должен быть добавлен в конфигурацию haproxy/nginx вручную.
Создайте манифест с именем, например, dapp-node.yaml:
dapp-node.yaml
apiVersion: nodes.dropapp.ru/v1alpha1
kind: DropAppNode
metadata:
name: <DropAppNode-name> # например, dapp-cp-02-da-cluster.domain.ru
spec:
compute:
ip: 00.00.00.54
nodePool: control-plane
nodeType: control-plane
sshAccessRef:
kind: SSHAccess
name: primary-nodes-access # ресурс SSHAccess с именем primary-nodes-access создан автоматически при создании кластера
Применение DropAppNode манифеста#
Примените манифест:
./kubectl apply -f ./dapp-node.yaml
Валидация добавления нового node в кластер#
Проверьте, что node добавлен:
./kubectl get nodes
NAME STATUS ROLES AGE VERSION
dapp-cp-01.da-cluster.domain.ru Ready control-plane 83m <kubernetes-version>
dapp-cp-02-da-cluster.domain.ru Ready control-plane 1m <kubernetes-version>
dapp-worker-01.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
dapp-worker-02.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
dapp-worker-03.da-cluster.domain.ru Ready worker 83m <kubernetes-version>
Проверьте, что ресурс dropappnode создан, дождитесь, пока он будет в статусе ready:
./kubectl get dropappnodes
NAME STATUS AGE TYPE IP ADDRESS
dapp-cp-01.da-cluster.domain.ru ready 5m28s control-plane 00.00.00.41
dapp-cp-02-da-cluster.domain.ru ready 74s control-plane 00.00.00.54
dapp-worker-01.da-cluster.domain.ru ready 5m28s worker 00.00.00.51
dapp-worker-02.da-cluster.domain.ru ready 5m28s worker 00.00.00.52
dapp-worker-03.da-cluster.domain.ru ready 74s worker 00.00.00.53
Удаление worker node из кластера#
Для удаления worker node удалите пользовательский ресурс (custom resource) dropappnode с соответствующим именем node:
kubectl delete dropappnode dapp-worker-02-da-cluster.domain.ru
В результате выполнения команды удалится node, его pods будут вытеснены на другие рабочие node, на самой машине будет выполнен kubeadm reset и будут удалены образы, остановлены сервисы Kubelet и Cri-o.