Установка 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

Дополнительные настройки для каждой машины кластера#

На каждой машине кластера:

Остальные настройки обеспечит Dactl.

Установка базовой языковой региональной настройки#

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

  1. Для установки базовой языковой региональной настройки, системной локали, установите пакет поддержки английского языка в приложениях с помощью команды:

    dnf install glibc-langpack-en
    
  2. Измените системную локаль с помощью команды:

    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#

На каждой машине:

  1. Создайте пользователя с домашним каталогом:

    useradd dapp
    
  2. Добавьте пользователя dapp в группу sudo:

    usermod -aG wheel dapp
    
  3. Предоставьте пользователю dapp права на использование команды sudo без пароля:

    echo "dapp ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/99-dapp-nopasswd
    
  4. Назначьте необходимые права пользователю dapp:

    chmod 440 /etc/sudoers.d/99-dapp-nopasswd
    
Перемещение публичного ключа#

Для перемещения публичного ключа, выполните следующие шаги:

  1. На машине администратора выведите сгенерированный ключ:

    cat ~/.ssh/id_dapp.pub
    

    Пример вывода:

    "ssh-rsa AAAAaaaaa.....11111== email@example.com"
    
  2. Для перемещения публичного ключа на каждой машине кластера:

    • Переключитесь на пользователя 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:.

  1. Создайте конфигурационный файл (далее - файл, манифест) 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>...
    
  2. Заполните поле credentials в блоке imageRegistry. Для этого получите токен аутентификации для Harbor, выполнив на машине администратора следующую команду:

    echo -n "admin:<harbor-admin-password>" | base64 | base64
    

    Пример вывода:

    <credentials>==
    
  3. Заполните поле 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 выполните следующие шаги:

  1. Скопируйте файл конфигурации в каталог ~/.kube/config с помощью команды:

    cp -p ~/.dropapp/da-cluster/kubeconfig ~/.kube/config
    
  2. Извлеките 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.