Установка#
Примечание
Эта инструкция - о развертывании Global ERP, используя gs-ctk версии 5.0 и выше.
Инструкция по установке, используя ранние версии gs-ctk, доступна здесь.
Для работы с Global ERP на кластере Kubernetes требуется:
готовый к работе кластер Kubernetes, отвечающий вашим требованиям по производительности и отказоустойчивости,
развернутая PostgreSQL с базой данных для Global ERP,
NFS-хранилище,
рабочее место, с которого производиться развертывание, представляющее собой командную оболочку ОС Debian 11 или выше.
В этой инструкции мы также предполагаем, что у вас есть Ingress-контроллер, который мы будем использовать в качестве прокси для подключения к серверу приложений.
Чтобы получить простейший кластер Kubernetes:
установите на хостах kubelet, kubeadm и kubectl
запустите
kubeadm initна ведущем хосте для инициализации кластера и получите токен для присоединения других нод к кластеруподключите ведомые хосты при помощи команды
kubeadm joinи токенаустановите сетевой плагин CNI, такой как Flannel или Calico.
Установите пакет
nfs-commonна каждую ноду, чтобы Kubernetes мог смонтировать NFS.
Подробнее читайте в документации Kubernetes.
Примечание
Если кластер запускается в закрытой сети, docker регистр может не использовать SSL (Insecure Docker Registry). Запуск Insecure Docker Registry для хранения своих docker-образов не самый лучший вариант с точки зрения безопасности, но порой это самое простое и разумное решение в закрытых сетях.
Для настройки нужно изменить (или создать, если такового нет) конфигурационный файл /etc/docker/daemon.json, добавив в него следующие строки:
{
"insecure-registries" : ["myregistry.example.local:1234"]
}
, где myregistry.example.local:1234 - адрес и порт локального докер регистра
Подготовка рабочего места#
Установите kubectl.
Установите Helm.
Поместите файл kubeconfig, необходимый для авторизации пользователя перед кластером, по пути
~/.kube/config. При создании кластера при помощиkubeadm init, такой файл для суперпользователя сохраняется по пути/etc/kubernetes/admin.conf.
Проверяем доступ:
kubectl cluster-info
kubectl get nodes -o wide
При успешном подключении должны получить вывод:
Kubernetes control plane is running at https://0.0.0.0:6443
CoreDNS is running at https://0.0.0.0:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master01 Ready control-plane 46d v1.29.1 0.0.0.0 <none> Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27
k8s-worker01 Ready <none> 46d v1.29.1 0.0.0.0 <none> Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27
k8s-worker02 Ready <none> 46d v1.29.1 0.0.0.0 <none> Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27
k8s-worker03 Ready <none> 46d v1.29.1 0.0.0.0 <none> Debian GNU/Linux 11 (bullseye) 5.10.0-27-amd64 containerd://1.6.27
Шаг 1. Скачайте nscli#
Примечание
Временно Helm-чарт поставляется только вместе с nscli. Установка и использование nscli для развертывания при этом необязательны.
Скачайте и распакуйте nscli из нашего репозитория:
cd ~
wget --backups=1 --user=<пользователь> --ask-password "https://repo.global-system.ru/artifactory/general/ru/bitec/gs-ctk-nscli/5.1.5/gs-ctk-nscli-5.1.5.zip"
unzip -o gs-ctk-nscli-5.1.5.zip -d nscli
Мы рекомендуем также установить нужные пакеты и развернуть виртуальное окружение Python для запуска скриптов nscli:
chmod +x nscli/bin/*.sh
./nscli/bin/install.sh
Шаг 2. Установите контроллер nsctl#
Установка контроллера nsctl может быть выполнена двумя способами в зависимости от ваших прав доступа к Kubernetes-кластеру:
-
Требует прав администратора. Helm-чарт самостоятельно создаст все необходимые ресурсы Kubernetes, включая пространство имен для Global ERP и ресурсы RBAC. Выберите этот путь, если у вас есть права администратора кластера или вы работаете на тестовом стенде.
Установка с ручной подготовкой окружения.
Требует участия администратора кластера. Пространство имён и роли с правами доступа должны быть созданы вручную, а оставшиеся ресурсы, такие как ресурс контроллера nsctl и ConfigMap с параметрами, разворачиваются из Helm-чарта. Выберите этот путь, если развертывание производится на кластере с ограниченными правами пользователя Kubernetes, например, на общекорпоративном коммунальном кластере.
Автоматизированная установка#
Подготовьте values.yaml:
Важно
Не забудьте изменить параметры доступа к системному файловому хранилищу
cat <<EOF | tee values.yaml # Реестр образов imageRepository: docker-registry.net # Системное файловое хранилище для хранения комплектов групп и приложений systemVolume: nfs: server: "nfs.server" # Путь к NFS-серверу path: /export # Путь к публикуемой на NFS-сервере папке # Секрет загрузки с репозитория imagePullSecret: "" # или "docker-secret", если Docker-реестр требует авторизации # Селекторы нод для подов #nodeSelector: {} # Tolerations для подов #tolerations: [] # Affinity для подов #affinity: {} EOF
Примечание
Docker-секрет будет создан позже, после развертывания пространства имен Helm-чартом.
Разверните Helm-чарт вместе с пространством имен.
helm upgrade \ --install \ gs-ctk \ ~/nscli/helm_chart \ -f values.yaml
NAME: gs-ctk LAST DEPLOYED: Tue Jan 19 03:14:08 2038 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: ===================================== GS-CTK Версия SNAPSHOT-5.1.3 Copyright © 2000-2025 Компания «Бизнес Технологии» Все права защищены. ===================================== Развернут в пространстве имен `gs-ctk`. (venv)
Создайте и примените Docker-секрет
docker login docker-registry.net # укажите здесь ваш репозиторий cat <<EOF | tee docker-secret.yaml apiVersion: v1 kind: Secret metadata: name: docker-secret namespace: gs-ctk data: .dockerconfigjson: $(cat ~/.docker/config.json | base64 | tr -d '\n') type: kubernetes.io/dockerconfigjson EOF kubectl apply -f docker-secret.yaml
Проверьте, что под nsctl находится в состоянии
Running.На развертывание может потребоваться некоторое время, так как требуется скачать образ контейнера и запустить его. Обычно это занимает не больше пяти минут.
kubectl get pods --namespace gs-ctk
NAME READY STATUS RESTARTS AGE nsctl-84cb5578fd-b2c5x 1/1 Running 0 1h
Если nsctl запустился, у вас должно быть все готово к переходу к следующему шагу - созданию секретов.
Установка с ручной подготовкой окружения#
Создайте от имени администратора Kubernetes пространство имен, роли с требуемыми полномочиями, сервисного пользователя и его привязки к ролям:
cat <<EOF | tee superuser-resources.yaml # Пространство имен apiVersion: v1 kind: Namespace metadata: name: gs-ctk --- # Роли apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: gs-ctk-role namespace: gs-ctk rules: - apiGroups: - "" - apps - policy - rbac.authorization.k8s.io - coordination.k8s.io - networking.k8s.io resources: - pods - componentstatuses - configmaps - daemonsets - deployments - events - ingresses - pods - persistentvolumes - persistentvolumeclaims - poddisruptionbudgets - replicasets - services - statefulsets - secrets - "pods/log" - "pods/exec" - leases verbs: [ "*" ] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: gs-ctk-cluster-role rules: - apiGroups: - global-system.ru - events.k8s.io resources: - "*" verbs: - "*" --- # Сервисный пользователь и его привязки к ролям apiVersion: v1 kind: ServiceAccount metadata: name: gs-ctk-sa namespace: gs-ctk --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: gs-ctk-role-bind namespace: gs-ctk roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: gs-ctk-role subjects: - kind: ServiceAccount name: gs-ctk-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: gs-ctk-cluster-role-bind roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: gs-ctk-cluster-role subjects: - kind: ServiceAccount name: gs-ctk-sa EOF kubectl apply -f superuser-resources.yaml
При использовании Docker с авторизацией, необходимо подготовить ресурс с секретом от репозитория.
docker login docker-registry.net # укажите здесь ваш репозиторий cat <<EOF | tee docker-secret.yaml apiVersion: v1 kind: Secret metadata: name: docker-secret namespace: gs-ctk data: .dockerconfigjson: $(cat ~/.docker/config.json | base64 | tr -d '\n') type: kubernetes.io/dockerconfigjson EOF kubectl apply -f docker-secret.yaml
Примените от имени администратора CRD из
~/nscli/helm_chart/crds/crd.yaml:kubectl apply -f ~/nscli/helm_chart/crds/crd.yaml
Примечание
На этом этапе мы развернули все ресурсы, которые могут потребовать прав администратора. Перед продолжением убедитесь, что вы переключились с контекста администратора на контекст непривилегированного пользователя.
Подготовьте values.yaml по обычной инструкции развертывания. Обратите внимание, что при использовании Docker с авторизацией, требуется указать название секрета из 2 пункта в
imagePullSecret.# Реестр образов imageRepository: "docker-registry.net" # Тег образов, по-умолчанию равен версии чарта imageTag: "" # Секрет загрузки с репозитория imagePullSecret: "" # "docker-secret" - ваш секрет с учетной записью докер-реестра # Тип развертывания: # "cluster" - будут сгенерированы только ресурсы уровня кластера (пространство имен, роли) # "namespace" - будут сгенерированы только ресурсы уровня пространства имен (ConfigMap, ресурс с контроллером) # "both" - все ресурсы, значение по умолчанию. Обычно не требует изменения. deploymentType: namespace # Часовой пояс timezone: "Europe/Moscow" # Режим отладки для nsctl nsctlDebugEnabled: false # Суффикс, добавляемый к названию релиза, чтобы получить название пространства имен namespaceSuffix: "" # Системное файловое хранилище для хранения комплектов групп и приложений systemVolume: nfs: server: "nfs.server" path: /export # Субъекты RoleBinding/ClusterRoleBinding, которым стоит предоставить права по # управлению GlobalConfiguration, ресурсами в пространстве имен. Можно # использовать для предоставления прав администраторам GlobalERP. Например: #privilegedSubjects: #- kind: User # name: gs_admin privilegedSubjects: [] # Переопределение ServiceAccount для установки nsctl и другим подам. # По умолчанию используются пользователи, созданные этим Helm-чартом на уровне # кластера. overrideNsctlServiceAccount: gs-ctk-sa overrideWorkerServiceAccount: gs-ctk-sa # Аннотации подов podAnnotations: {} # Лейблы подов podLabels: {} # Селекторы нод для подов nodeSelector: {} # Tolerations для подов tolerations: [] # Affinity для подов affinity: {}
Обратите внимание, что должны быть установлены следующие параметры:
deploymentType: namespace # указывает, что разворачивать пространство имен и роли не требуется overrideNsctlServiceAccount: gs-ctk-sa # созданный ранее ServiceAccount overrideWorkerServiceAccount: gs-ctk-sa # созданный ранее ServiceAccount
Примечание
Если для работы gs-ctk требуются Tolerations или
nodeSelector, укажите их здесь, в values.yamlРазверните ресурсы уровня пространства имен (ресурс контроллера nsctl и ConfigMap с параметрами) с правами непривилегированного пользователя:
helm upgrade \ --install \ gs-ctk \ ~/nscli/helm-chart \ -f values.yaml \ --namespace gs-ctk \ --skip-crds
Примечание
Если не указать
--skip-crds, то высока вероятность, что у вашего пользователя не хватит прав на развертывание.NAME: gs-ctk LAST DEPLOYED: Tue Jan 19 03:14:08 2038 NAMESPACE: gs-ctk STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: ===================================== GS-CTK Версия SNAPSHOT-5.1.3 Copyright © 2000-2025 Компания «Бизнес Технологии» Все права защищены. ===================================== Развернут в пространстве имен `gs-ctk`. (venv)
Проверьте, что под nsctl находится в состоянии
Running.На развертывание может потребоваться некоторое время, так как требуется скачать образ контейнера и запустить его. Обычно это занимает не больше пяти минут.
kubectl get pods --namespace gs-ctk
NAME READY STATUS RESTARTS AGE nsctl-84cb5578fd-b2c5x 1/1 Running 0 1h
Если nsctl запуcтился, у вас должно быть все готово к переходу к следующему шагу - созданию секретов.
Шаг 3. Создайте секреты#
Секреты используются для безопасного хранения учетных данных. Для работы Global ERP потребуются следующие секреты:
-
логин/пароль для доступа к статистике HAProxy
если клиенты будут подключаться к балансировщику напрямую (без Ingress) по TLS, то также сертификат и приватный ключ
-
логин/пароль от панели администратора RabbitMQ
логин/пароль для взаимодействия RabbitMQ и сервера приложений
Учетная запись администратора GlobalERP#
apiVersion: v1
kind: Secret
metadata:
name: gs-admin-auth
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: Secret#123#Pass!
cat <<EOF | tee ~/nscli/workspace/admin-auth-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: gs-admin-auth
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: Secret#123#Pass!
EOF
kubectl apply -f ~/nscli/workspace/admin-auth-secret.yaml
Учетная запись для подключения к базе данных#
Создайте секрет с аккаунтом пользователя БД, заменив значения шаблона <username> и <password> на корректные
apiVersion: v1
kind: Secret
metadata:
name: db-user-secret
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: <username>
password: <password>
cat <<EOF | tee ~/nscli/workspace/db-user-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-user-secret
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: <username>
password: <password>
EOF
kubectl apply -f ~/nscli/workspace/db-user-secret.yaml
Токен планировщика#
Создайте секрет с токеном планировщика, заменив значение шаблона <key> на корректное
Внимание
Токен планировщика должен быть закодирован в Base64, читайте подробнее здесь.
apiVersion: v1
kind: Secret
metadata:
name: scheduler-token-secret
namespace: gs-ctk
data:
private.key: <key>
cat <<EOF | tee ~/nscli/workspace/scheduler-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: scheduler-token-secret
namespace: gs-ctk
data:
private.key: <key>
EOF
kubectl apply -f ~/nscli/workspace/scheduler-token-secret.yaml
Секреты HAProxy#
Создайте секрет для доступа к статистике HAProxy
apiVersion: v1
kind: Secret
metadata:
name: secret-haproxy-auth
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: t0p-Secret
cat <<EOF | tee ~/nscli/workspace/haproxy-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-haproxy-auth
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: t0p-Secret
EOF
kubectl apply -f ~/nscli/workspace/haproxy-secret.yaml
При необходимости, создайте TLS-сертификат для HAProxy и поместите его в секрет
Создайте TLS-сертификат с помощью OpenSSL, заменив «example» домены на собственные.
Пример создания TLS-сертификата:
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout ca.key -out ca.crt -subj '/CN=example.com'
Пример создания мультидоменного TLS-сертификата:
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout ca.key -out ca.crt -subj '/CN=example.com' \
-addext 'subjectAltName=DNS:example.com,DNS:example.net'
Создайте секрет, заменив значения шаблона <cert-b64> и <key-b64> на значения, сгенерированные с помощью следующих команд:
cat ./ca.crt | base64
cat ./ca.key | base64
apiVersion: v1
kind: Secret
metadata:
name: haproxy-tls
namespace: gs-ctk
type: Opaque
data:
tls.crt: |
<cert-b64>
tls.key: |
<key-b64>
cat <<EOF | tee ~/nscli/workspace/haproxy-tls.yaml
apiVersion: v1
kind: Secret
metadata:
name: haproxy-tls
namespace: gs-ctk
type: Opaque
data:
tls.crt: |
$(cat ./ca.crt | base64 -w 0)
tls.key: |
$(cat ./ca.key | base64 -w 0)
EOF
kubectl apply -f ~/nscli/workspace/haproxy-tls.yaml
Учетная запись администратора Grafana#
apiVersion: v1
kind: Secret
metadata:
name: grafana-admin
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: admin
cat <<EOF | tee ~/nscli/workspace/grafana-admin-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: grafana-admin
namespace: gs-ctk
type: kubernetes.io/basic-auth
stringData:
username: admin
password: admin
EOF
kubectl apply -f ~/nscli/workspace/grafana-admin-secret.yaml
Секреты RabbitMQ#
Создайте секрет с аккаунтом RabbitMQ для подключения к нему сервера приложений
apiVersion: v1 kind: Secret metadata: name: rabbitmq-global namespace: gs-ctk type: kubernetes.io/basic-auth stringData: username: globalrabbitmq password: globalrabbitmq
cat <<EOF | tee ~/nscli/workspace/rabbitmq-global.yaml apiVersion: v1 kind: Secret metadata: name: rabbitmq-global namespace: gs-ctk type: kubernetes.io/basic-auth stringData: username: globalrabbitmq password: globalrabbitmq EOF
kubectl apply -f ~/nscli/workspace/rabbitmq-global.yaml
Создайте секрет с аккаунтом администратора RabbitMQ
apiVersion: v1 kind: Secret metadata: name: rabbitmq-admin namespace: gs-ctk type: kubernetes.io/basic-auth stringData: username: admin password: Secret#123#Pass!
cat <<EOF | tee ~/nscli/workspace/rabbitmq-admin.yaml apiVersion: v1 kind: Secret metadata: name: rabbitmq-admin namespace: gs-ctk type: kubernetes.io/basic-auth stringData: username: admin password: Secret#123#Pass! EOF
kubectl apply -f ~/nscli/workspace/rabbitmq-admin.yaml
Шаг 4. Настройте группы ресурсов#
Примечание
Если вы мигрировали с кластера предыдущей версии переходите к шагу 5 - у вас уже есть конфигурационный ресурс.
Совет
Здесь конфигурационный ресурс будет формироваться при помощи мастеров утилиты nscli.
Вы можете сформировать его самостоятельно без использования утилиты. Подробнее читайте здесь.
Создайте конфигурационный ресурс и группу ресурсов в нем следующей командой:
./configmgr.sh configure_resgroup --config-path config.yaml --resgroup gs-cluster-1
Настройка группы ресурсов: gs-cluster-1 ======================================= Введите имя проекта (контура): Введите timezone подов:Europe/Moscow Введите поисковые домены для resolv.conf (если их несколько, вводите через пробел): Введите url базы данных:jdbc:postgresql://host:5432/database Введите alias базы данных:db_alias Введите имя секрета для пользователя БД:db-user-secret Укажите версию Java:8 Введите адрес к дополнительному GossipRouter или пропустите поле: Введите тип прикладного хранилища:nfs Введите адрес сервера(server):10.10.0.1 Введите путь(path):/export Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет Группа ресурсов настроена! Следующие действия: - Добавьте книгу ресурсов: `./configmgr.sh configure_resbook --config config.yaml --resgroup gs-cluster-1 --resbook [имя книги ресурсов] --classname [класс книги ресурсов]` - Список классов ресурсов можно получить при помощи команды `./configmgr.sh show_resbook_classes` - Список групп ресурсов можно получить при помощи команды `./configmgr.sh list_resgroups --config config.yaml` - Удалить группу ресурсов: `./configmgr.sh remove_resgroup --config config.yaml --resgroup gs-cluster-1`
Создайте книгу ресурсов
global-server-excl, описывающую эксклюзивный под с сервером приложений:./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook global-server-excl --classname global_server_excl
Настройка книги ресурсов: global-server-excl (класс global_server_excl) ======================================================================= Введите внешний ip(external_ip): Введите максимальный размер кучи Java (java -Xmx):3500M Введите запрос CPU для globalserver:2 Введите запрос MEMORY для globalserver:4G Введите лимиты CPU для globalserver:2 Введите лимиты MEMORY для globalserver:4G Введите запрос CPU для systemagent:1 Введите запрос MEMORY для systemagent:250M Введите лимиты CPU для systemagent:1 Введите лимиты MEMORY для systemagent:500M Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет Введите имя секрета для администратора:gs-admin-auth Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook global-server-excl`
Создайте книгу ресурсов
global-server-share, описывающую группу подов с сервером приложений:./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook global-server-share --classname global_server_share
Настройка книги ресурсов: global-server-share (класс global_server_share) ========================================================================= Введите количество экземпляров:2 Введите длительность вежливого отключения в секундах (0 для немедленного выключения):0 Введите максимальный размер кучи Java (java -Xmx):3500M Введите запрос CPU для globalserver:2 Введите запрос MEMORY для globalserver:4G Введите лимиты CPU для globalserver:2 Введите лимиты MEMORY для globalserver:4G Введите запрос CPU для systemagent:1 Введите запрос MEMORY для systemagent:250M Введите лимиты CPU для systemagent:1 Введите лимиты MEMORY для systemagent:500M Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет Введите имя секрета для администратора:gs-admin-auth Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook global-server-share`
Создайте книгу ресурсов
global-scheduler, описывающую планировщик задач:./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook global-scheduler --classname global_scheduler
Настройка книги ресурсов: global-scheduler (класс global_scheduler) =================================================================== Введите максимальный размер кучи Java (java -Xmx):800M Введите запрос CPU для globalscheduler:2 Введите запрос MEMORY для globalscheduler:4G Введите лимиты CPU для globalscheduler:2 Введите лимиты MEMORY для globalscheduler:4G Введите запрос CPU для systemagent:1 Введите запрос MEMORY для systemagent:250M Введите лимиты CPU для systemagent:1 Введите лимиты MEMORY для systemagent:500M Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет Введите имя секрета с токеном планировщика:scheduler-token-secret Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook global-scheduler`
Создайте книгу ресурсов
haproxy, описывающую балансирощик:./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook haproxy --classname haproxy
Настройка книги ресурсов: haproxy (класс haproxy) ================================================= Использовать Ingress?[да,нет]:да Введите класс Ingress:nginx Введите хост Ingress: Введите дополнительную аннотацию Ingress (или пропустите поле): Введите имя секрета basic-auth для авторизации статистики:secret-haproxy-auth Введите имя tls секрета для доступа по https: Введите запрос CPU для haproxy:1 Введите запрос MEMORY для haproxy:500M Введите лимиты CPU для haproxy:2 Введите лимиты MEMORY для haproxy:1Gi Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook haproxy`
Создайте книгу ресурсов
grafana, описывающую внутренний стек мониторинга:Внимание
Данная кнга ресурсов требует адрес сервиса kube-prometheus-stack. Он задаётся в формате „{{service_name}}.{{namepace}}.svc.cluster.local“
Для этого:
Найдите неймспейс kube-prometheus-stack-а (обычно monitoring, prometheus-monitoring)
kubectl get namespaces
Найдите имя сервиса прометея (сервис с портами 9090:web/TCP,8080:reloader-web/TCP, обычно prometheus-k8s, prometheus-prometheus)
kubectl get services -n {{namespace}}
Создайте книгу ресурсов
./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook grafana --classname grafana
Настройка книги ресурсов: grafana (класс grafana) ================================================= Использовать Ingress?[да,нет]:нет Введите внешний ip(external_ip):10.10.0.1 Введите класс хранилища: Введите размер хранилища: Введите адрес сервиса kube-prometheus-stack:prometheus-k8s.monitoring.svc.cluster.local Введите имя секрета с аккаунтом администратора Grafana:grafana-admin Введите запрос CPU для grafana:1 Введите запрос MEMORY для grafana:500M Введите лимиты CPU для grafana:2 Введите лимиты MEMORY для grafana:1Gi Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook grafana`
Создайте книгу ресурсов
rabbitmq, описывающую встроенный экземпляр RabbitMQ:./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook rabbitmq --classname rabbitmq
Настройка книги ресурсов: rabbitmq (класс rabbitmq) =================================================== Введите название секрета для доступа к RabbitMQ:rabbitmq-global Введите название секрета для доступа к консоли RabbitMQ:rabbitmq-admin Введите название виртуального хоста RabbitMQ:globalrabbitmq Введите внешний порт:15672 Использовать Ingress?[да,нет]:нет Введите внешний ip(external_ip): Книга ресурсов настроена! Следующие действия: - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1` - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook rabbitmq`
(Опционально) Создайте книгу ресурсов
img2doc, описывающую встроенный экземпляр img2doc:
./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook img2doc --classname img2doc
Настройка книги ресурсов: img2doc (класс img2doc)
===================================================
Введите порт:7000
Введите кол-во реплик:1
Введите запрос CPU для grafana:1
Введите запрос MEMORY для grafana:500M
Введите лимиты CPU для grafana:2
Введите лимиты MEMORY для grafana:1Gi
Книга ресурсов настроена!
Следующие действия:
- Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1`
- Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook img2doc`
Шаг 5. Подготовьте комплект приложений#
Комплект приложений - это артефакты, необходимые для разворачивания кластера системы Global ERP:
Дистрибутив сервера приложений (globalserver)
Образ прикладного решения (applib)
Профиль с шаблонами конфигурационных файлов (profile)
Опционально в комплект приложений также входит:
Исходный код для облачной отладки прикладного решения (appsrc)
Комплект хранится в виде zip-архивов (globalserver.zip, applib.zip, profile.zip). Сервер приложений и образ прикладного решения должен быть предоставлен вам контактным лицом. Содержимое profile.zip лежит в папке (~/nscli/)default/profile в дистрибутиве nscli.
Утилита nscli позволяет хранить комплект в распакованном виде в одноименных папках (globalserver/, applib/, profile/), при этом если profile/ нет при запуске утилиты, она будет создана из (~/nscli/)default/profile. В таком случае файлы перед загрузкой на сетевое хранилище самой утилитой запаковываются в архив.
Совет
Мы здесь будем использовать утилиту nscli, однако это необязательно. Читайте подробнее здесь.
Загрузите комплект приложений на системное NFS-хранилище:
./appkit.sh push --namespace gs-ctk --source workspace/appkit --destination appkit/v1
--namespace gs-ctk- пространство имен, в котором развертан gs-ctk--source workspace/appkit- путь к папке с комплектом на локальной ФС относительно текущей папки--destination appkit/v1- путь к папке, в которую следует поместить комплект, относительно точки монтирования системного хранилища
Обновите хеши и пути к комплекту приложения (appkit) в конфигурации при помощи одной из следующих команд:
Эта команда не требует подключения к кластеру, хеш-суммы будут считаны с комплекта приложений на локальном диске
./appkit.sh switch_local --config-path ./config.yaml --resgroup gs-cluster-1 --local-appkit workspace/appkit --remote-appkit appkit/v1
--config-path ./config.yaml- путь к конфигурационном ресурсу--resgroup gs-cluster-1- название группы ресурсов--local-appkit workspace/appkit- путь к папке с комплектом на локальной ФС относительно текущей папки (--sourceиз предыдущего пункта)--remote-appkit appkit/v1- путь к папке на системном хранилище, в котором находится комплект (--destinationиз предыдущего пункта)
ИЛИ
При выполнении этой команды хеш-суммы читаются с комплекта приложений на хранилище в кластере, следовательно требует подключения к кластеру
# хеши читаются с комплекта приложений на хранилище в кластере, следовательно требует подключения к кластеру ./appkit.sh switch_remote --config-path ./config.yaml --resgroup gs-cluster-1 --namespace gs-ctk --remote-appkit appkit/v1
--config-path ./config.yaml- путь к конфигурационном ресурсу--resgroup gs-cluster-1- название группы ресурсов--namespace gs-ctk- пространство имен, в котором развертан gs-ctk--remote-appkit appkit/v1- путь к папке на системном хранилище, в котором находится комплект (--destinationиз предыдущего пункта)
Переведите комплект приложения в состояние
started:./appkit.sh start --config-path ./config.yaml --resgroup gs-cluster-1
Шаг 6. Подготовьте комплект группы#
Комплект группы (groupkit) - это дополнительные и редко изменяемые артефакты, используемые в развертывании Global ERP. В их число входят:
Архив с дополнительными библиотеками (libs)
Архив с дополнительными шрифтами (fonts)
Файлы JDK для переопределения (java), например cacerts.
Наличие всех компонентов необязательно, и обычно комплект группы не требуется, поэтому вы можете пропустить этот шаг.
Загрузите комплект группы на системное NFS-хранилище аналогично комплекту приложений:
./groupkit.sh push --namespace gs-ctk --source workspace/groupkit --destination groupkit/v1
Добавьте в файл (
config.yaml) параметр группы ресурсовgroupkit:apiVersion: global-system.ru/v1 kind: GlobalConfiguration metadata: name: config spec: type: advanced resgroups: - name: gs-cluster-1 groupkit: groupkit/v1 ...
Шаг 7. Примените конфигурацию при помощи kubectl#
К этому шагу у вас должен был получиться конфигурационный файл приблизительно следующего содержания:
apiVersion: global-system.ru/v1
kind: GlobalConfiguration
metadata:
name: config
spec:
type: advanced
resgroups:
- name: gs-cluster-1
#groupkit: groupkit/v1
appkit:
applib_sha1: e1ffb3becd7e9315e371adcc7615a29f4df59e3e
globalserver_sha1: 76416b8e09ec36438ad84aa6cb89c2a699496719
profile_sha1: e5b8876dec7122ca221f6a17a74d429bdad66a00
globalserver_instance: '1'
path: appkit/v1
state: started
database_url: jdbc:postgresql://host:5432/database
database_alias: db_alias
database_secret: db-user-secret
appvol:
type: nfs
server: 10.10.0.1
path: /export
resbooks:
- type: global_server_excl
name: global-server-excl
admin_secret: gs-admin-auth
- type: global_server_share
name: global-server-share
admin_secret: gs-admin-auth
- type: global_scheduler
name: global-scheduler
scheduler_token_secret: scheduler-token-secret
- type: haproxy
name: haproxy
service:
type: ingress
ingress_class: nginx
host: ''
statistics_secret: secret-haproxy-auth
- type: grafana
name: grafana
service:
type: ip
external_ip: 10.10.0.1
admin_secret: grafana-admin
- type: rabbitmq
name: rabbitmq
apmq_secret: rabbitmq-global
admin_secret: rabbitmq-admin
Мы готовы к развертыванию Global ERP. Для этого выполним:
kubectl apply -f ./config.yaml
Начнется инициализация контейнеров, после чего сервер приложений должен быть доступен через браузер, войти однако не получится - требуется проинициализировать базу данных.
Совет
В случае неполадок посмотрите созданное пространство имен на наличие перезагружающихся подов. Также в случае ошибок с конфигурацией nsctl создаст событие на конфигурационный ресурс.
Шаг 8. Запустите обновление базы данных#
Выполните следующую команду:
./appkit.sh upgrade --config-path ./config.yaml --resgroup gs-cluster-1
Повторно примените ресурс:
kubectl apply -f ./config.yaml