Установка#

Примечание

В текущем разделе приведена установка DropApp без опциональных компонентов.

Опциональные компоненты DropApp устанавливаются и настраиваются администратором. Порядок установки каждого опционального компонента приведен в соответствующем разделе документа «Руководство по системному администрированию».

Установка опциональных компонентов DropApp

Примечание

В DropApp поставляется две версии опционального компонента Grafana - 10.4.9 и 11.4.0.

Выбор способа установки#

Установка DropApp возможна только с помощью утилиты командной строки kubeadm.

Предварительные условия#

Предварительные условия для установки DropApp:

  • rpm-репозиторий получен пользователем;

  • выбранные пользователем rpm-пакеты из полученного репозитория загружены в репозиторий пользователя.

Примечание

rpm-репозиторий поставляется в виде zip-архива, состоящего из двух частей: repo и docker images.

Подготовка окружения#

Используйте репозиторий DropApp, полученный от производителя продукта. В репозитории должны присутствовать все rpm-пакеты, перечисленные в разделе «Подготовка к установке».

Примечание

Для установки выбранных rpm-пакетов, выполните команду yum install, которая выполнит их подключения. Специальной предварительной настройки не требуется. td yum самостоятельно определяет все пользовательские права (выдает sudo-права), в том числе права на репозиторий клиента, если он подключен в систему. Поэтому пользователь получает привилегированные права в рамках установки.

DropApp настраивается администратором на виртуальной машине с предустановленной ОС (см. официальную документацию к продуктам, указанным в разделе «Системные требования» текущего документа).

Сценарий перетегирования docker-образов из дистрибутива DropApp#

Для корректной загрузки образов docker из дистрибутива DropApp необходимо использовать скрипт для изменения имен образов - retag.sh. Он находится в дистрибутиве, в архиве: K8S-retag-2.1.0-9-distrib.zip

Скрипт перебирает *.tar архивы с образами из каталога DropApp. При совпадении образа в архиве и образа из файла с путями для загрузки образов в локальный реестр, образ из архива будет загружен в локальный реестр.

Для работы скрипта требуется установленный podman, jq и доступ к локальному реестру с правом на запись.

Для запуска скрипта используйте команду:

./retag.sh --dir <path_to_folder_with_>*.tar --map <path_to_map_file>

Где :

  • <path_to_folder_with_>*.tar - путь к каталогу с *.tar файлами образов;

  • <path_to_map_file> - путь к файлу, который содержит пути для загрузки образов в локальный реестр.

Пример файла со списком образов

<registry-name>/<path-to-image>/dropapp_1_3/docker.io/curlimages/curl:7.86.0
<registry-name>/<path-to-image>/dropapp_1_3/docker.io/envoyproxy/envoy:distroless-v1.25.11
<registry-name>/<path-to-image>/dropapp_1_3/docker.io/grafana/grafana:10.1.2

Где :

  • <registry-name> - название реестра;

  • <path-to-image> - путь к образу.

В результате скрипт выведет список образов из архивов, для которых не удалось найти сопоставление в файле с путями в консоль, а так же сохранит информацию в лог-файл, формата retag_log_220524091100.txt.

Настройка DropApp в ОС#

Чтобы настроить DropApp в ОС:

  1. Установите ОС, следуя шагам документации к продукту.

  2. Создайте каталог, в который будет смонтирован установочный диск с ОС, например /mnt/iso:

    # mkdir -p /mnt/iso
    
  3. Смонтируйте ISO-образ установочного диска с ОС в созданный ранее каталог:

    # mount -o loop /tmp/distr/dvd.iso /mnt/iso
    
    mount: /dev/loop0 is write-protected, mounting read-only
    

    В случае, если вместо файла ISO-образа используется DVD-привод с установленным в него установочным диском с ОС, смонтируйте его командой типа:

    # mount /dev/sr0 /mnt/iso
    
  4. Скопируйте файл media.repo из смонтированного каталога с установочными файлами SLO в системный каталог /etc/yum.repos.d/ и установите в файл разрешения (файл с правами доступа):

    # cp /mnt/iso/media.repo /etc/yum.repos.d/dvd.repo
    # chmod 644 /etc/yum.repos.d/dvd.repo
    
  5. Внесите корректировки в файл dvd.repo, заменив параметр gpgcheck=0 на 1 и добавьте в конец файла еще 3 строки:

    # vi /etc/yum.repos.d/dvd.repo
    
    ...
    enabled=1
    baseurl=file:///mnt/iso/
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OS-release
    
  6. Установите ebtables, ethtool или аналогичный исполняемый файл на узле. Их можно установить при помощи следующей команды:

    yum install ebtables 
    # или ethtool на выбор пользователя
    

Установка DropApp#

Все шаги, приведенные в этой инструкции, описывают последовательность действий для установки DropApp.

Подготовка к установке#

Перед началом установки убедитесь, что выполнена подготовка окружения:

  • установите ОС;

  • получите zip-архив от разработчика DropApp.

Примечание

Перед установкой DropApp загрузите полученный zip-архив с rpm-файлом и docker-образами (в виде tar-архива). Распакуйте архив в частный rpm-репозиторий с указанием пути к папке. rpm-репозиторий должен быть прописан в конфигурационном файле /etc/yum.repos.d/dapp.repo в параметре которого указана ссылка на репозиторий baseurl= [путь к папке с расположенными в ней файлами rpm]. Выгрузите образ DropApp в пользовательский репозиторий – docker registry (этот репозиторий должен быть доступен для пользовательской виртуальной машины при запуске DropApp).

Установка для ОС Platform V Sberlinux OS Server, ОС Platform V Sberlinux OS Core#

Предварительные условия#

Предварительные условия перед установкой DropApp:

  1. Используйте полученный от разработчика DropApp zip-архив из 2 частей, включающий:

    • rpm-пакеты;

    • docker images.

    Список обязательных (главных) rpm-пакетов находится в составе дистрибутива по пути K8S-1.5.0-owned-distrib.zip->K8S-rpms-1.5.0\x86_64\pkglist. Список зависимостей находится в K8S-1.5.0-owned-distrib.zip->K8S-rpms-1.5.0\src\pkglist.

    Когда пакет создается с помощью rpm, если какой-либо файл в списке rpm-пакета является общей библиотекой, soname-библиотеки автоматически добавляется в список возможностей, предоставляемых пакетом. Soname - это имя, используемое для определения совместимости между различными версиями библиотеки.

  2. Добавьте rpm-пакеты в существующий rpm-репозиторий, а docker images из архива добавьте в существующий docker-registry.

  3. Разверните количество виртуальных машин (виртуальные машины с предустановленной ОС) равное количеству узлов в кластере. Количество узлов в кластере приведено в разделе «Системные требования», где даны рекомендации с аппаратными характеристиками для главного узла и рабочих узлов.

  4. Отключите использование swap на каждой виртуальной машине, для этого введите команду:

    sudo swapoff -a
    
  5. Настройте переадресацию IPv4 и разрешение на просмотр трафика:

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
    
    sudo modprobe overlay
    sudo modprobe br_netfilter
    
    # параметры sysctl, требуемые при установке (сохраняются при перезагрузке)
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
    # Применить параметры sysctl без перезагрузки
    sudo sysctl --system
    
  6. Убедитесь, что модули br_netfilter и overlay загружены, выполнив следующие команды:

    lsmod | grep br_netfilter
    lsmod | grep overlay
    
  7. Убедитесь, что для системных переменных net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, net.ipv4.ip_forward в конфигурации установлено значение 1 sysctl, выполнив следующую команду:

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
    
  8. Настройте драйверы групп. Базовая среда выполнения контейнера должна взаимодействовать с группами управления, чтобы обеспечить управление ресурсами для pods и контейнеров и установить ресурсы, такие как запросы и ограничения процессора, памяти. Для взаимодействия с контрольными группами kubelet и среда выполнения контейнера должны использовать драйвер cgroup. Крайне важно, чтобы kubelet и среда выполнения контейнера использовали один и тот же драйвер cgroup и были настроены одинаково.

    Доступны два драйвера cgroup:

    • cgroupfs;

    • systemd.

    Драйвер cgroupfs

    Драйвер cgroupfs является драйвером cgroup по умолчанию в kubelet. При cgroupfs использовании драйвера kubelet и среда выполнения контейнера напрямую взаимодействуют с файловой системой cgroup для настройки cgroups.

    Драйвер systemd cgroup

    Когда systemd выбирается в качестве системы инициализации для дистрибутива SLO, процесс инициализации генерирует и использует корневую контрольную группу (cgroup) и действует как менеджер cgroup.

    Systemd имеет тесную интеграцию с cgroups и выделяет cgroup для каждой единицы systemd. В результате systemd используется в качестве системы инициализации драйвера cgroupfs, система получает два разных менеджера cgroup.

    Два менеджера cgroup дают два представления доступных и используемых ресурсов в системе. В некоторых случаях узлы, которые настроены на использование cgroupfs для среды выполнения kubelet и контейнера, но при этом используется systemd для остальных процессов, становятся нестабильными из-за нехватки ресурсов.

    Подход к нивелированию нестабильности заключается в использовании systemd в качестве драйвера cgroup для kubelet и среды выполнения контейнера, когда systemd является выбранной системой инициализации.

    Чтобы установить systemd в качестве драйвера cgroup, отредактируйте KubeletConfiguration параметр cgroupDriver и установите для него значение systemd при помощи команды:

    apiVersion: kubelet.config.k8s
    kind: KubeletConfiguration
    ...
    cgroupDriver: systemd
    
  9. Если драйвер systemd cgroup настроен для kubelet, настройте его для среды выполнения контейнера CRI-O. CRI-O по умолчанию использует драйвер systemd cgroup.

  10. Чтобы переключить драйвер cgroup на cgroupfs, отредактируйте /etc/crio/crio.conf или поместите драйвер в /etc/crio/crio.conf.d/02-cgroup-manager.conf, например:

    [crio.runtime]
    conmon_cgroup = "pod"
    cgroup_manager = "cgroupfs"
    

    Обратите внимание на измененное значение conmon_cgroup, которое должно быть установлено в значение pod при использовании CRI-O с cgroupfs. Как правило, необходимо синхронизировать конфигурацию драйвера cgroup для kubelet и CRI-O.

    Для CRI-O по умолчанию используется сокет CRI /var/run/crio/crio.sock.

Установка и развертывание кластера DropApp#

Предварительные условия развертывания#

Предварительные условия установки и развертывания кластера DropApp:

  • пользователь имеет роль администратора в ОС;

  • пользователем получен zip-архив с дистрибутивом DropApp.

Установка и развертывание#

Установка и развертывание кластера DropApp:

  1. Установите инструменты DropApp и обновите данные при помощи команды:

    sudo yum install kubelet kubeadm cri-o kubectl
    

    Результат команды будет содержать в конце следующее сообщение:

    complete!
    
  2. Активируйте и запустите службы CRI-O и kubelet:

    sudo systemctl enable --now crio kubelet
    

    Результат команды будет следующим:

    Created symlink /etc/systemd/system/cri-o.service  /usr/lib/systemd/system/crio.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/crio.service  /usr/lib/systemd/system/crio.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service  /usr/lib/systemd/system/kubelet.service.
    
  3. Подготовьте конфигурацию с указанием репозитория DropApp для создания кластера, при помощи команды:

    nano clusterconfig.yml
    
  4. Добавьте в YAML-файл параметры конфигурации.

    Для Platform V Sberlinux OS Server и Platform V Sberlinux OS Core:

    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    kubernetesVersion: v1.25.11
    imageRepository: example.ru/1.5.0/dapp-kubernetes-2 # <--- репозиторий в registry, где лежат образы kube-apiserver, kube-proxy, kube-controller-manager, kube-scheduler
    dns:
       imageRepository: example.ru/1.5.0/dapp-coredns-2 # <--- репозиторий в registry, где лежит образ coredns. imageRepository является изменяемым параметром и может быть изменен в соответствии с docker repository
       imageTag: v1.9.3
    etcd:
       local:
       imageRepository: example.ru/1.5.0/dapp-etcd-2 # <--- репозиторий в registry, где лежит образ etcd
         imageTag: 3.5.6
    networking:
       serviceSubnet: "<IP-address>/16" # Подсеть для services адресов внутри кластера. Адрес должен быть изменен в соответствии с сетевыми настройками
       podSubnet: "<IP-address>/16" # подсеть для pods адресов внутри кластера. Адрес должен быть изменен в соответствии с сетевыми настройками
    ---
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    cgroupDriver: systemd
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    metricsBindAddress: "0.0.0.0"
    mode: "ipvs"
    

    Примечание

    Конфигурация является тестовой и приведена в качестве примера проверки работоспособности.

  5. Нажмите сочетание клавиш Ctrl + X для сохранения.

  6. На вопрос: Save modified buffer? введите Y для подтверждения действия и нажмите Enter для выхода.

  7. Запустите создание кластера:

    sudo kubeadm init --config clusterconfig.yml
    

    Результат команды будет следующим:

       [init] Using Kubernetes version:
       [preflight] Running pre-flight checks
       [WARNING SystemVerification]: missing optional cgroups: blkio
       [preflight] Pulling images required for setting up a Kubernetes cluster
       [preflight] This might take a minute or two, depending on the speed of your internet connection
       [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
       [certs] Using certificateDir folder "/etc/kubernetes/pki"
       [certs] Generating "ca" certificate and key
       [certs] Generating "apiserver" certificate and key
       [certs] apiserver serving cert is signed for DNS names [control-plane kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [<IP-address1>, <IP-address2>]
       [certs] Generating "apiserver-kubelet-client" certificate and key
       [certs] Generating "front-proxy-ca" certificate and key
       [certs] Generating "front-proxy-client" certificate and key
       [certs] Generating "etcd/ca" certificate and key
       [certs] Generating "etcd/server" certificate and key
       [certs] etcd/server serving cert is signed for DNS names [control-plane localhost] and IPs [<IP-address2> <IP-address3> ::1]
       [certs] Generating "etcd/peer" certificate and key
       [certs] etcd/peer serving cert is signed for DNS names [control-plane localhost] and IPs [<IP-address2> <IP-address3> ::1]
       [certs] Generating "etcd/healthcheck-client" certificate and key
       [certs] Generating "apiserver-etcd-client" certificate and key
       [certs] Generating "sa" key and public key
       [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
       [kubeconfig] Writing "admin.conf" kubeconfig file
       [kubeconfig] Writing "kubelet.conf" kubeconfig file
       [kubeconfig] Writing "controller-manager.conf" kubeconfig file
       [kubeconfig] Writing "scheduler.conf" kubeconfig file
       [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
       [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
       [kubelet-start] Starting the kubelet
       [control-plane] Using manifest folder "/etc/kubernetes/manifests"
       [control-plane] Creating static Pod manifest for "kube-apiserver"
       ...
       [bootstrap-token] Using token: 0m00w0.jgdd0w000py0ljwp
       [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
       [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
       [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
       [bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
       [bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
       [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
       [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
       [addons] Applied essential addon: CoreDNS
    
       Your Kubernetes control-plane has initialized successfully!
    
       To start using your cluster, you need to run the following as a regular user:
    
          mkdir -p $HOME/.kube
          sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
          sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
      Alternatively, if you are the root user, you can run:
    
          export KUBECONFIG=/etc/kubernetes/admin.conf
    
       You should now deploy a pod network to the cluster.
       Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
          https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
       Then you can join any number of worker nodes by running the following on each as root:
    
       kubeadm join <IP-address2>:6443 --token 0m00w0.jgdd0w0py0ljwp \
       --discovery-token-ca-cert-hash sha256:0cc0eb00000c00edac00b0a0000c0c00ef0f0e00ce000c0f0b000f000bc00000:890128 # приведенное в примере значение токена и SHA256 являются вымышленным, при каждой установке DropApp должны использоваться уникальные значения токенов.
    

    Примечание

    Адрес в блоке вывода будет действительным IP узлов кластера.

    Убедитесь, что вывод предыдущей команды содержит сообщение: Your Kubernetes control-plane has initialized successfully!

  8. Для взаимодействия с кластером, выполните команды на главном узле и создайте файловую структуру:

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  9. Сгенерируйте ключ сертификата (token) на главном узле при помощи команды:

    kubeadm token create --print-join-command
    

    Результат команды будет следующим:

    kubeadm join <IP-address4>:6443 --token 2xqf30.qe81qi7vhi32pnxk --discovery-token-ca-cert-hash sha256:000fg00i0000000000000000erw0000
    

    Примечание

    IP токен и порт приведены для примера.

  10. Скопируйте token и хеш SHA256, необходимые для безопасной связи с главным узлом.

    Примечание

    Сохраните результат (например, в специальную папку или репозиторий) выполненной команды для дальнейшего использования на всех подключенных рабочих узлах.

  11. Переключитесь на рабочий узел (worker) и выполните команду:

    sudo hostnamectl set-hostname
    
    #[имя-машины, например worker1]
    

    Примечание

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

  12. Установите инструменты DropApp и обновите данные при помощи команды:

    sudo yum install kubelet kubeadm cri-o kubectl
    

    Результат команды будет содержать в конце следующий вывод:

    Complete!
    

    Примечание

    Все экземпляры пакета, установленные на виртуальные машины, должны быть одной и той же версии и соответствовать ранее установленной версии на главном узле управляющего слоя (control-plane node).

    sudo systemctl enable --now crio kubelet
    

    Результат команды будет следующим:

    Created symlink /etc/systemd/system/cri-o.service  /usr/lib/systemd/system/crio.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/crio.service  /usr/lib/systemd/system/crio.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service  /usr/lib/systemd/system/kubelet.service.
    
  13. Присоедините рабочий узел к кластеру DropApp (совокупности рабочих и главных узлов, объединенных в одну сеть) при помощи команды:

    sudo [результат шага №12]
    

    Пример выполняемой команды представлен ниже:

    sudo kubeadm join <IP-address4>:6443 --token 2xqf30.qe81qi7vhi32pnxk --discovery-token-ca-cert-hash sha256:fee0d000d0000cd0f00ace0be00d000dda00edc0bf00b000000ad0a0c0aee0ca
    

    Примечание

    IP токен и порт приведены для примера.

    Результат команды будет следующим:

    ...
    [kubelet-start] Starting the kubelet
    [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
    
    This node has joined the cluster:
    * Certificate signing request was sent to apiserver and a response was received.
    * The Kubelet was informed of the new secure connection details.
    
    Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
    
  14. Проверьте, что рабочие узлы присоединились к главному узлу. По умолчанию их количество будет равным двум (см. в разделе Системные требования). Переключитесь на главный узел по ssh и выполните команду:

    kubectl get nodes
    

    Результат команды будет следующим:

    NAME       STATUS   ROLES       AGE    VERSION
    control-plane   Ready   control-plane   5m14s
    worker1      Ready   <none>      58s
    worker2      Ready   <none>      65s