Установка#
Примечание
В текущем разделе приведена установка DropApp без опциональных инструментов.
Опциональные инструменты DropApp устанавливаются и настраиваются администратором. Порядок установки каждого опционального инструмента приведен в соответствующем разделе документа «Руководство по системному администрированию».
Примечание
В DropApp поставляется две версии опционального компонента Grafana - 10.4.19 и 11.6.2.
Порядок установки#
Выбор способа установки#
Установка DropApp возможна только с помощью утилиты командной строки kubeadm.
Предварительные условия#
Предварительные условия для установки DropApp:
ZIP-архив с дистрибутивом получен пользователем;
выбранные пользователем rpm-пакеты и контейнерные образы из полученного архива загружены в репозиторий пользователя.
Подготовка окружения#
Используйте ZIP-архив DropApp, полученный от производителя продукта. Загрузите rpm-пакеты в локальный репозиторий. В репозитории должны присутствовать все необходимые rpm-пакеты. Подробнее про перечень необходимых rpm-пакетов в разделе «Подготовка к установке».
Примечание
Для установки выбранных rpm-пакетов, выполните команду dnf install <package name>, которая выполнит их подключение.
DropApp настраивается администратором на виртуальной машине с предустановленной ОС (см. официальную документацию к продуктам, указанным в разделе «Системные требования» документа Описание).
Настройка DropApp в ОС#
Чтобы настроить DropApp в ОС:
Установите ОС, следуя шагам документации к продукту.
Создайте каталог, в который будет смонтирован установочный диск с ОС, например
/mnt/iso:mkdir -p /mnt/isoСмонтируйте 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Скопируйте файл
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Внесите корректировки в файл 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Установите ebtables, ethtool или аналогичный исполняемый файл на node. Их можно установить при помощи следующей команды:
dnf install <ebtables|ethtool>
Установка DropApp#
Все шаги, приведенные в этой инструкции, описывают последовательность действий для установки DropApp.
Подготовка к установке#
Перед началом установки убедитесь, что выполнена подготовка окружения:
установите ОС;
получите ZIP-архив от разработчика DropApp.
Примечание
Действия по настройке в следующих шагах выполняются на всех nodes будущего кластера.
Предварительные условия перед установкой DropApp:
Используйте полученный от разработчика DropApp ZIP-архив из 3 основных частей, включающий:
контейнерные образы;
пакеты;
бинарные файлы.
Пример образов:
<registry-name>/<path-to-image>/4.0.0/dapp-kubernetes-2 <registry-name>/<path-to-image>/4.0.0/dapp-coredns-2 <registry-name>/<path-to-image>/4.0.0/dapp-etcd-2Список rpm-пакетов в составе дистрибутива находится по пути
K8S-<version>-owned-distrib.zip->K8S-rpms-<version>\x86_64\pkglist. Список зависимостей находится вK8S-<version>-owned-distrib.zip->K8S-rpms-<version>\src\pkglist.Когда пакет создается с помощью rpm, если какой-либо файл в списке rpm-пакета является общей библиотекой, soname-библиотеки автоматически добавляется в список возможностей, предоставляемых пакетом. Soname - это имя, используемое для определения совместимости между различными версиями библиотеки.
Добавьте rpm-пакеты в существующий rpm-репозиторий, а контейнерные образы из архива - в существующий container registry.
Извлеките архив с компонентом
K8S-k8sc-<version>-<distrib_number>-distrib.zip.Из архива с компонентом K8SC извлеките архивы:
K8S-k8sc-rpms-<version>-<distrib_number>-SBEL<sbel_version>-distrib.zipс rpm-пакетами,k8sc-images-<version>-<distrib_number>-distrib.zipс контейнерными образами,k8sc-binaries-<version>-<distrib_number>-distrib.zipс бинарными файлами.
Распакуйте архив с rpm-пакетами
K8S-k8sc-rpms-<version>-<distrib_number>-SBEL<sbel_version>-distrib.zipи загрузите пакеты в частный rpm-репозиторий. rpm-репозиторий должен быть прописан в конфигурационном файле/etc/yum.repos.d/dapp.repoв параметре которого указана ссылка на репозиторийbaseurl= [путь к папке с расположенными в ней файлами rpm].Распакуйте архив с контейнерными образами
k8sc-images-<version>-<distrib_number>-distrib.zipи выгрузите образы в пользовательский репозиторий – container registry (этот репозиторий должен быть доступен для пользовательской виртуальной машины при запуске DropApp).Распакуйте архив с бинарными файлами
k8sc-binaries-<version>-<distrib_number>-distrib.zipв удобное место.
Разверните количество виртуальных машин (виртуальные машины с предустановленной ОС) равное количеству nodes в кластере. Количество nodes в кластере приведено в разделе «Системные требования», где даны рекомендации с аппаратными характеристиками для master node и рабочих nodes.
Отключите использование
swap, выполните действия на каждой виртуальной машине:Проверьте статус
swap. Еслиswapактивен, в выводе будет указано активное swap-устройство, например/dev/dm-1:swapon --showЕсли
swapвыключен, то активныеswap-разделы и устройства отображаться не будут.Чтобы временно отключить
swap, введите команду:swapoff -aДля отключения
swapнавсегда, нужно выполнить несколько действий:В конфигурационном файле
/etc/fstabзакомментировать все строки, которые содержатswap. Например, закомментированная строка может иметь следующий вид:/dev/mapper/sberlinux-swap none swap defaults 0 0Отключить службу
swap.target:
systemctl disable --now swap.targetНастройте переадресацию IPv4 и разрешение на просмотр трафика:
Создайте файл
/etc/modules-load.d/k8s.conf: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Убедитесь, что модули
br_netfilterиoverlayзагружены, выполнив следующие команды:lsmod | grep br_netfilter lsmod | grep overlayПример вывода:
Module Size Used by br_netfilter 36864 0 bridge 409600 1 br_netfilter overlay 233472 22Убедитесь, что для системных переменных
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Примечание
Если, после выполнения команд из шага 5, на каком-то node параметр
net.ipv4.ip_forwardостается в значении0, примените команду:sudo sysctl -w net.ipv4.ip_forward=1Настройте драйверы групп. Базовая среда выполнения контейнера должна взаимодействовать с группами управления, чтобы обеспечить управление ресурсами для pods и контейнеров и установить ресурсы, такие как запросы и ограничения процессора, памяти. Для взаимодействия с контрольными группами Kubelet и среда выполнения контейнера должны использовать драйвер
cgroup. Крайне важно, чтобы Kubelet и среда выполнения контейнера использовали один и тот же драйверcgroupи были настроены одинаково.Доступен драйвер
cgroup- systemd.Драйвер systemd cgroup
Когда systemd выбирается в качестве системы инициализации для дистрибутива SLO, процесс инициализации генерирует и использует корневую контрольную группу (
cgroup) и действует как менеджерcgroup.Systemd имеет тесную интеграцию с
cgroupsи выделяетcgroupдля каждой единицы systemd. В результате systemd используется в качестве системы инициализации драйвераcgroupfs, система получает два разных менеджераcgroup.Два менеджера
cgroupдают два представления доступных и используемых ресурсов в системе. В некоторых случаях nodes, которые настроены на использованиеcgroupfsдля среды выполнения Kubelet и контейнера, но при этом используется systemd для остальных процессов, становятся нестабильными из-за нехватки ресурсов.Подход к нивелированию нестабильности заключается в использовании systemd в качестве драйвера
cgroupдля Kubelet и среды выполнения контейнера, когда systemd является выбранной системой инициализации.Чтобы установить systemd в качестве драйвера
cgroup, отредактируйте KubeletConfiguration параметрcgroupDriverи установите для него значениеsystemd. Пример настройки:apiVersion: kubelet.config.k8s kind: KubeletConfiguration ... cgroupDriver: systemdПримечание
Редактировать
KubeletConfigurationможно в файлеclusterconfig.ymlперед запуском инициализации кластера. Подробнее в подразделе Установка и развертывание кластера DropApp.Если драйвер systemd cgroup настроен для Kubelet, настройте его для среды выполнения контейнера CRI-O. CRI-O по умолчанию использует драйвер systemd cgroup.
Установка и развертывание кластера DropApp#
Предварительные условия развертывания#
Примечание
Следующие действия по настройке выполняются на всех nodes будущего кластера.
Предварительные условия установки и развертывания кластера DropApp:
пользователь имеет роль администратора в ОС;
пользователем получен ZIP-архив с дистрибутивом DropApp.
Установка и развертывание#
Установка и развертывание кластера DropApp:
Установите инструменты DropApp и обновите данные при помощи команды:
sudo dnf install kubelet kubeadm cri-o kubectlРезультат команды будет содержать в конце следующее сообщение:
complete!Примечание
Все экземпляры пакетов, установленных на виртуальные машины, должны быть одной и той же версии на всех nodes.
Активируйте и запустите службы CRI-O и Kubelet:
sudo systemctl enable --now crio kubeletЕсли
kubeadmне может скачать образы из-за ошибки авторизации, то нужно выполнить несколько действий:Заполните файл
/var/lib/kubelet/config.jsonс данными для входа в удаленный репозиторий. Пример структуры файла/var/lib/kubelet/config.json:{ "auths": { "доменное_имя_репозитория": { "auth": "закодированные_учетные_данные" } } }Примечание
Строку с закодированными учетными данными можно получить в файле
auth.jsonпосле авторизации в репозитории с образами, например, с помощьюpodman login <repository-name>, и после поиска этого файла, например, с командойfind / -name "auth.json".Отредактируйте файл
/etc/crio/crio.conf, чтобы он мог считать файл для аутентификации/var/lib/kubelet/config.json. Пример раздела с репозиторием в файле/etc/crio/crio.conf:[crio.image] registries = ["доменное_имя_репозитория"] global_auth_file = "/var/lib/kubelet/config.json" pause_image = "доменное_имя_репозитория/путь/pause:тег" pause_image_auth_file = "/var/lib/kubelet/config.json"
После изменения файлов перезапустите службы:
sudo systemctl restart kubelet sudo systemctl restart crioРезультат команды будет следующим:
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.Примечание
Для подключения worker nodes к кластеру и корректной работы Cilium может потребоваться отключение firewall на всех nodes кластера.
Отключите firewall, например, для
firewalld:`sudo systemctl stop firewalld` `sudo systemctl disable firewalld`Подготовьте конфигурацию с указанием репозитория DropApp для создания кластера, при помощи команды:
Примечание
С этого шага команды выполняются на master node.
nano clusterconfig.ymlДобавьте в YAML-файл параметры конфигурации.
Для Platform V Sberlinux OS Server и Platform V Sberlinux OS Core:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.27.16 imageRepository: <registry-name>/<path-to-image>/4.0.0/dapp-kubernetes-2 # <--- репозиторий в registry, где лежат образы kube-apiserver, kube-proxy, kube-controller-manager, kube-scheduler dns: imageRepository: <registry-name>/<path-to-image>/4.0.0/dapp-coredns-2 # <--- репозиторий в registry, где лежит образ coredns. imageRepository является изменяемым параметром и может быть изменен в соответствии с docker repository imageTag: v1.10.1 etcd: local: imageRepository: <registry-name>/<path-to-image>/4.0.0/dapp-etcd-2 # <--- репозиторий в registry, где лежит образ etcd imageTag: 3.5.16 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"Примечание
Конфигурация является тестовой и приведена в качестве примера проверки работоспособности.
Нажмите сочетание клавиш Ctrl + X для сохранения.
На вопрос:
Save modified buffer?введите Y для подтверждения действия и нажмите Enter для выхода.Запустите создание кластера:
Примечание
Чтобы команда запустилась успешно, нужно правильно настроить
clusterconfig.ymlи доступ к репозиторию у Cri-o.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 nodes кластера. Убедитесь, что вывод предыдущей команды содержит сообщение: Your Kubernetes control-plane has initialized successfully!
Для взаимодействия с кластером, выполните команды на master nodes и создайте файловую структуру:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configСгенерируйте ключ сертификата (token) на master node при помощи команды:
kubeadm token create --print-join-commandРезультат команды будет следующим:
kubeadm join <IP-address4>:6443 --token 2xqf30.qe81qi7vhi32pnxk --discovery-token-ca-cert-hash sha256:000fg00i0000000000000000erw0000Примечание
IP-токен и порт приведены для примера.
Скопируйте token и хеш SHA256, необходимые для безопасной связи с master node.
Примечание
Сохраните результат (например, в специальную папку или репозиторий) выполненной команды для дальнейшего использования на всех подключенных рабочих nodes.
Переключитесь на рабочий node (worker) и выполните команду:
sudo hostnamectl set-hostname #[имя-машины, например worker1]Примечание
Эту команду требуется выполнить на каждом worker node.
Присоедините worker node к кластеру DropApp (совокупности worker и master nodes, объединенных в одну сеть) при помощи команды:
sudo [результат шага №9]Пример выполняемой на рабочем node команды представлен ниже:
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.Проверьте, что рабочие nodes присоединились к master node. По умолчанию их количество будет равным двум (см. в разделе Системные требования). Переключитесь на master node по ssh и выполните команду:
kubectl get nodesРезультат команды будет следующим:
NAME STATUS ROLES AGE VERSION control-plane Ready control-plane 5m14s worker1 Ready <none> 58s worker2 Ready <none> 65s
Установка Cilium#
Для корректной работы кластера установите на master node сетевой плагин (CNI) Cilium версии 1.16.5:
Получите файлы Cilium для Helm в виде чарта, например, из официального репозитория github:
wget https://github.com/cilium/charts/raw/refs/heads/master/cilium-1.16.5.tgzРазархивируйте полученный архив:
tar -xvf cilium-1.16.5.tgzДля установки Cilium с Helm создайте файл значений
values.yaml:nano values.yamlПример заполнения файла
values.yaml:values.yaml
image: repository: ${PATH_TO_REPOSITORY}/4.0.0/dapp-cilium-2/cilium digest: "" useDigest: false operator: image: useDigest: false repository: ${PATH_TO_REPOSITORY}/4.0.0/dapp-cilium-2/operator ipam: operator: clusterPoolIPv4PodCIDRList: ["<IP-address>/16"] installIptablesRules: false kubeProxyReplacement: true enableNodePort: true l7Proxy: false sockops: enabled: false bpf: masquerade: true k8sServiceHost: ${CONTROL_PLANE_IP} k8sServicePort: 6443 hubble: relay: enabled: true image: useDigest: false repository: ${PATH_TO_REPOSITORY}/4.0.0/dapp-cilium-2/hubble-relay ui: enabled: true frontend: image: useDigest: false repository: ${PATH_TO_REPOSITORY}/4.0.0/dapp-hubble-ui-2/hubble-ui tag: v0.13.1 backend: image: useDigest: false repository: ${PATH_TO_REPOSITORY}/4.0.0/dapp-hubble-ui-2/hubble-ui-backend tag: v0.13.1 clustermesh: apiserver: image: useDigest: false preflight: image: useDigest: falseДля сохранения и выхода нажмите сочетание клавиш Ctrl + X. На вопрос:
Save modified buffer?введитеYдля подтверждения действия и нажмите Enter для выхода.Установите Cilium с помощью Helm:
export CONTROL_PLANE_IP=<IP> # адрес master-node export PATH_TO_REPOSITORY="<PATH_TO_REPOSITORY>" # путь до репозитория до указания версии envsubst < ~/values.yaml > ~/values-resolved.yaml # для подстановки указанных выше значений в файл значений для Helm. envsubst подставляет переменные окружения в values.yaml и записывает вывод в файл resolved helm install \ --namespace kube-system cilium ./cilium \ --version 1.16.5 \ -f ~/values-resolved.yaml # применение файла значений при установке с HelmПримечание
В местах с путем указывается ссылка на репозиторий с инструментом. Должна быть настроена аутентификация в репозиторий для CRI-O.
Проверьте установку Cilium, используя команду:
cilium status --waitПримечание
Для корректного запуска всех pods после установки Cilium рекомендуется пересоздать coredns pods командой:
kubectl delete pods -n kube-system -l k8s-app=kube-dnsПример вывода:

Результаты выполнения сценария установки DropApp:
Установлен программный компонент K8SC;
Настроены хосты;
Развернут кластер DropApp;
Установлены CNI-плагин Cilium.