# Установка Для работы с Global Server на кластере Kubernetes требуется: - jump-хост, с которого будет установлен и будет обслуживаться кластер - готовый к работе кластер Kubernetes, отвечающий вашим требованиям по производительности и отказоустойчивости - развернутая [PostgreSQL с базой данных для Global ERP](../020_install-postgres/010_install_postgres.md) - NFS-хранилище Чтобы получить простейший кластер Kubernetes: 1. установите [kubelet, kubeadm и kubectl](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl) 2. запустите `kubeadm init` на ведущем хосте для [инициализации кластера](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node) и получите токен для присоединения других нод к кластеру 3. [подключите ведомые хосты](https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/adding-linux-nodes/) при помощи команды `kubeadm join` и токена 4. [установите сетевой плагин CNI](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network), такой как [Flannel](https://docs.tigera.io/calico/latest/getting-started/) или [Calico](https://docs.tigera.io/calico/latest/getting-started/). Подробнее [читайте в документации Kubernetes](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/). ## Настройка узла администрирования (jump host) ### Установка необходимых пакетов На jump-хост необходимо установить следующие пакеты: ```bash sudo apt-get install mc htop sudo apt-get install -y kubectl sudo apt-mark hold kubectl sudo apt install nfs-common ``` ```{tip} Версия kubectl должна соответствовать версии в платформе kubernetes или быть новее ``` ### Настройка работы с docker образами Если требуется работа с образами из docker регистра ```bash sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USER ``` #### Insecure Docker Registry Если кластер запускается в закрытой сети, docker регистр может не использовать SSL (Insecure Docker Registry). Запуск Insecure Docker Registry для хранения своих docker-образов не самый лучший вариант с точки зрения безопасности, но порой это самое простое и разумное решение в закрытых сетях. Для настройки нужно изменить (или создать, если такового нет) конфигурационный файл /etc/docker/daemon.json, добавив в него следующие строки: ```json { "insecure-registries" : ["myregistry.example.local:1234"] } ``` , где myregistry.example.local:1234 - адрес и порт локального докер регистра скрипт для создания файла: ```bash cat < Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27 k8s-worker01 Ready 46d v1.29.1 0.0.0.0 Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27 k8s-worker02 Ready 46d v1.29.1 0.0.0.0 Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27 k8s-worker03 Ready 46d v1.29.1 0.0.0.0 Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27 ``` ### Требования к ос для nscli - GNU/Linux, а именно: - Debian 11 и выше - Python 3.9 ### Требование к железу для запуска nscli - 2 ядра - 200 Мб оперативной памяти - 30 Гб свободного места (nscli_installation)= ### Установка утилиты Nscli `Nscli` автоматизирует работу по развертыванию кластера Global. Установка: ```bash #Скачиваем из репозитория cd ~ wget --backups=1 --user=<пользователь> --ask-password "https://repo.global-system.ru/artifactory/general/ru/bitec/gs-ctk-nscli/4.8.2/gs-ctk-nscli-4.8.2.zip" unzip -o gs-ctk-nscli-4.8.2.zip -d nscli ``` где <пользователь> - учетная запись, полученная через контактное лицо технической поддержки. ```{tip} В закрытой среде требуется установить все пакеты, указанные в скрипте ~/nscli/bin/installpkg.sh вручную ``` Перейдите в каталог с утилитой и выполняем первичную установку ```bash cd ~/nscli # выполняем скрипты установки ./bin/initvenv.sh ``` Jump-хост готов к работе. (ns_configuration)= ## Настройка рабочего пространства в kubernetes Для настройки подключаемся по ssh к jump-хосту Перейдите в каталог с утилитой ```bash cd ~/nscli ``` Запустите мастер создания манифеста рабочего пространства ```bash ./namespace.sh create_install_scripts ``` ```{note} В более современных версиях nscli доступна команда `./namespace.sh create_namespace` ``` В режиме диалога введите параметры рабочего пространства: - Имя рабочего пространства - имя воркспейса, который будет создан в kubernetes - Адрес докер регистра - адрес ресурса с хранилищем образов (Публичный докер регистр Global: dockerhub.global-system.ru) - Имя файла для хранения мастер ключа - полный путь с именем файла, в котором будет храниться мастер ключ для шифрования паролей - Пользователь для авторизации докера - имя пользователя для авторизации, при анонимном доступе поле можно оставить пустым. - Пароль для авторизации докера - пароль для авторизации в регистре (вводится два раза) - Тип репозитория - тип репозитория, по умолчанию nfs - Имя сервера nfs - указываем ip адрес или доменное имя заранее настроенного NFS сервера - Путь - путь для подключения тома ```{note} В NFS-репозитории будет храниться комплект приложений. Для хранения другой информации, в том числе пользовательских файлов, используются прикладное хранилище Appvolume и другие NFS-хранилища, настраиваемые позже с помощью скрипта resgroup.sh в составе утилиты nsctl (читайте подробнее в документации gs-ctk). ``` Пример работы мастера создания пространства имен: ```text k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh create_install_scripts Введите имя рабочего пространства:gs-cluster-k8s Введите адрес докер регистра:dockerhub.global-system.ru Для безопасного хранения паролей необходимо сгенерировать приватный ключ. Укажите имя файла для хранения мастер ключа:/home/k8sadmin/.gs-ctk.priv Введите пользователя для авторизации докера:userk8s Введите пароль для авторизации докера:********** Введите пароль для авторизации докера:********** Выберите тип репозитория:nfs Необходимо задать параметры для Network File System Введите имя сервера:0.0.0.0 Введите путь:/mnt/nfs/gs-cluster-k8s k8sadmin@k8s-terminal02:~/nscli$ ``` ```{note} В новейших версиях доступна команда: ./namespace.sh install_namespace Если команда присутствует, вам будет автоматически предложено ей воспользоваться. После успешного выполнения переходите сразу к пункту ["Подготовка комплекта приложений appkit"](project:#appkit_preparation). Рекомендуем пользоваться этой командой. Она не только развернет пространство имен и под nsctl, как предыдущий способ, но также проверит: - установку сетевого плагина - готовность нод к развертыванию контейнеров - наличие связи между подами - возможность записи в системное хранилище Вы можете запустить диагностику кластера отдельно по команде `./namespace.sh diagnose`. ``` ```{note} Если в вашем кластере используются taints и tolerations, тогда для запуска пода nsctl нужно дополнить шаблон `nscli/profile/namespace/template/deploy.yaml`, добавив туда раздел с tolerations. Пример: ~~~yaml ... spec: tolerations: - key: "node" operator: "Equal" value: "first" effect: "NoSchedule" containers: ... ~~~ Для добавления tolerations к подам, которые создает nsctl, смотри раздел ["Хуки"](./045_manage_hooks.md) ``` Разрешите запуск скрипта установки рабочего пространства ```bash chmod +x ~/nscli/workspace/install_scripts/gs-cluster-k8s/install.sh ``` Создайте рабочее пространство ```bash ~/nscli/workspace/install_scripts/gs-cluster-k8s/install.sh ``` После выполнения скрипта будет создано рабочее пространство и будет запущен под управления кластером `nsctl` ```text namespace/gs-cluster-k8s created secret/docker-registry-secret created configmap/values created role.rbac.authorization.k8s.io/worker created rolebinding.rbac.authorization.k8s.io/worker-pods created deployment.apps/nsctl created ``` (appkit_preparation)= ## Подготовка комплекта приложений appkit [Комплект приложений](https://help.global-system.ru/gs_ctk_v1_0/html/050_appkit.html#appkit) определяет перечень артефактов, необходимых для разворачивания кластера системы Global ERP: - Дистрибутив сервера приложений (globalserver) - Образ прикладного решения (applib) - Профиль с шаблонами конфигурационных файлов (profile) Опционально в комплект приложений также входит: - Исходный код для отладки прикладного решения (appsrc) Комплект можно хранить в виде zip-архивов (`globalserver.zip`, `applib.zip`, `profile.zip`) или в распакованном виде в одноименных папках (`globalserver/`, `applib/`, `profile/`). Во втором случае файлы перед загрузкой на сетевое хранилище самой утилитой запаковываются в архив. В профиле с шаблонами конфигурационных файлов находятся: - Конфигурация сервера приложений `globalserver/template/config/global3.config.xml` - Конфигурация сборщика телеметрии `globalserver/template/config/otel-sdk.config.yaml` и `globalserver/template/config/otel-globalserver.config.yaml` - Конфигурация менеджера заданий `globalscheduler/template/config/quartz.properties` - Конфигурация проектных настроек системных логов `globalscheduler/template/config/logback-LoggerContext-ext.xml` - Конфигурация проектных настроек логов сессии `globalscheduler/template/config/logback-LoggerContext-session-ext.xml` Если в комплекте при загрузке его на сетевое хранилище, профиль отсутствует, то nscli создаст стандартный профиль, который, обычно, не требует изменений. Как работать и настраивать файлы с логами можно посмотреть в [документации по логам](../090_logs.md) Для создания комплекта приложений используйте каталог `~/nscli/workspace/appkit/v1` ```bash mkdir -p ~/nscli/workspace/appkit/v1/ ``` Подготовте и загрузите в этот каталог дистрибутивы. ```bash mv globalserver.zip ~/nscli/workspace/appkit/v1 mv applib.zip ~/nscli/workspace/appkit/v1 ``` Подготовте комплект приложений для работы ```bash ./appkit.sh push --namespace gs-cluster-k8s --source workspace/appkit/v1 --destination appkits/v1 ``` Утилита создаст, при необходимости, стандартный профиль, упакует комплект приложений, а также создаст контрольные суммы ```text Не найден профиль с шаблонами конфигурации, создать профиль по умолчанию?[да,нет]:да Загружен файл:globalserver.zip Загружен файл:profile.zip Загружен файл:applib.zip ``` ## Подготовка комплекта группы groupkit Обычно [комплект группы](https://help.global-system.ru/gs_ctk_v1_0/html/050_appkit.html#groupkit) **не требуется**. Однако в нем могут быть важные для работы сервиса компоненты. Если в комплекте поставки был groupkit, загрузите его с помощью команды: ```bash ./groupkit.sh push --namespace gs-cluster-k8s --source workspace/groupkit/v1 --destination groupkits/v1 ``` ## Работа с постоянными томами Данные в кластере Kubernetes могут храниться несколькими способами: непосредственно в контейнере или на томах (volumes). При хранении данных в контейнере возникают проблемы: - При сбое или остановке контейнера данные теряются. - Данные контейнера недоступны для других контейнеров, даже если все контейнеры находятся в одном поде. Чтобы решить эти проблемы, используются тома Kubernetes. Тома имеют разный жизненный цикл в зависимости от сценария использования: - У временных томов (ephemeral volume, EV) жизненный цикл совпадает с жизненным циклом пода. Когда под, использующий такой том, прекращает свое существование, том тоже удаляется. Временные тома могут использоваться только одним подом, поэтому объявление томов происходит непосредственно в манифесте пода. - У постоянных томов (persistent volume, PV) свой жизненный цикл, не зависящий от жизненного цикла пода. Благодаря разделению жизненных циклов такие тома можно переиспользовать позднее с другими подами. Для работы с постоянными томами поды и другие рабочие нагрузки используют Persistent Volume Claim (PVC). Кластеру Глобал ERP потребуется постоянный том для хранения метрик. Kubernetes поддерживает разные типы хранилищ, ниже представлен пример хранилища на основе локального каталога. ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: local-pv-50 spec: capacity: storage: 50Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disks/disk1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s-worker01 ``` ```bash cat < и \ на значения, сгенерированные с помощью следующих команд: ```bash cat ./ca.crt | base64 cat ./ca.key | base64 ``` ```yaml apiVersion: v1 kind: Secret metadata: name: haproxy-tls namespace: gs-cluster-k8s type: Opaque data: tls.crt: | tls.key: | ``` ```bash cat < и \ на корректные ```yaml apiVersion: v1 kind: Secret metadata: name: db-user-secret namespace: gs-cluster-k8s type: kubernetes.io/basic-auth stringData: username: password: ``` ```bash cat < password: EOF ``` ```bash kubectl apply -f ~/nscli/workspace/db-user-secret.yaml ``` - Создайте секрет с аккаунтом клиентского пользователя RabbitMQ ```yaml apiVersion: v1 kind: Secret metadata: name: rabbitmq-global namespace: gs-cluster-k8s type: kubernetes.io/basic-auth stringData: username: globalrabbitmq password: globalrabbitmq ``` ```bash cat < на корректное ```{attention} Токен планировщика должен быть закодирован в Base64, читайте подробнее [здесь](../070_addition/020_scheduler_setup.md#генерация-ключей-шифрования). ``` ```yaml apiVersion: v1 kind: Secret metadata: name: scheduler-token-secret namespace: gs-cluster-k8s data: private.key: ``` ```bash cat < EOF ``` ```bash kubectl apply -f ~/nscli/workspace/scheduler-token-secret.yaml ``` - Создайте секрет с аккаунтом администратора Графаны. ```yaml apiVersion: v1 kind: Secret metadata: name: grafana-admin namespace: gs-cluster-k8s type: kubernetes.io/basic-auth stringData: username: admin password: admin ``` ```bash cat <