Установка#

Примечание

Эта инструкция - о развертывании Global ERP, используя gs-ctk версии 5.0 и выше.

Для работы с Global ERP на кластере Kubernetes требуется:

  • готовый к работе кластер Kubernetes, отвечающий вашим требованиям по производительности и отказоустойчивости. Версия Kubernetes не должна входить в End Of Life Releases. Проверить актуальную версию можно в Release History

  • развернутая PostgreSQL с базой данных для Global ERP;

  • NFS-хранилище;

  • рабочее место, с которого производиться развертывание, представляющее собой командную оболочку ОС Debian 11 или выше.

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

Чтобы получить простейший кластер Kubernetes:

  1. Установите на хостах kubelet, kubeadm и kubectl.

  2. Запустите kubeadm init на ведущем хосте для инициализации кластера и получите токен для присоединения других нод к кластеру.

  3. Подключите ведомые хосты при помощи команды kubeadm join и токена.

  4. Установите сетевой плагин CNI, такой как Flannel или Calico.

  5. Установите пакет 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 - адрес и порт локального докер регистра

Подготовка рабочего места#

  1. Установите kubectl.

  2. Установите Helm.

  3. Поместите файл 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#

Скачайте и распакуйте nscli из нашего репозитория:

cd ~
wget --backups=1 --user=<пользователь> --ask-password "https://repo.global-system.ru/artifactory/general/ru/bitec/gs-ctk-nscli/SNAPSHOT/gs-ctk-nscli-SNAPSHOT.zip"
unzip -o gs-ctk-nscli-SNAPSHOT.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, например, на общекорпоративном коммунальном кластере.

Если вам удобнее, то можете Helm-чарт скачать отдельно от nscli:

cd ~
wget --backups=1 --user=<пользователь> --ask-password "https://repo.global-system.ru/ui/native/general/ru/bitec/gs-ctk-helm-chart/SNAPSHOT/gs-ctk-helm-chart-SNAPSHOT.tgz"

Мы предполагаем, что мы будем разворачивать Helm-чарт из дистрибутива nscli, он точно такой же.

Автоматизированная установка#

  1. Подготовьте 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
    

    Примечание

    Весь список параметров смотрите в values.yaml из чарта. Получить values.yaml из скачанного отдельно Helm-чарта можно при помощи команды helm show values gs-ctk-helm-chart-SNAPSHOT.tgz > values.yaml.

    Документация по параметрам Helm-чарта доступна здесь.

    Режим ссылок на образы (Helm)

    При установке Helm-чарта способ формирования ссылок на образы задается в values.yaml параметром imageMode:

    • tag - совместимый режим, образа указываются по тегу (:<tag>).

    • digestAuto - nsctl будет разворачивать контейнеры по хешам образов (digest), сформированным вендором при сборке.

    • digestManual - digest указываются вручную через imageDigests.

    Параметр imageDigests задается списком, например:

    imageMode: digestManual  # варианты: tag | digestAuto | digestManual
    imageTag: "SNAPSHOT"
    imageDigests:
      - image: nsctl
        digest: sha256:...
      - image: globalserver
        digest: sha256:...
    

    В режиме digestAuto значение для image=nsctl можно задать в imageDigests опционально.

    Примечание

    Docker-секрет будет создан позже, после развертывания пространства имен Helm-чартом.
    
  2. Разверните Helm-чарт вместе с пространством имен:

    helm upgrade \
         --install \
         gs-ctk \
         ~/nscli/helm_chart \
         -f values.yaml
    

    Примечание

    Если вы скачали Helm-чарт отдельно от nscli, то укажите вместо ~/nscli/helm_chart путь к скачанному файлу, например, ./gs-ctk-helm-chart-SNAPSHOT.tgz.

    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)
    
  3. Создайте и примените 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
    
  4. Проверьте, что под nsctl находится в состоянии Running.

    На развертывание может потребоваться некоторое время, так как требуется скачать образ контейнера и запустить его. Обычно это занимает не больше пяти минут.

    kubectl get pods --namespace gs-ctk
    
    NAME                     READY   STATUS    RESTARTS   AGE
    nsctl-84cb5578fd-b2c5x   1/1     Running   0          1h
    

Если nsctl запустился, у вас должно быть все готово к переходу к следующему шагу - созданию секретов.

Установка с ручной подготовкой окружения#

Развернуть описание
  1. Создайте от имени администратора 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
    
  2. При использовании 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
    
  3. Примените от имени администратора CRD из ~/nscli/helm_chart/crds/crd.yaml:

    kubectl apply -f ~/nscli/helm_chart/crds/crd.yaml
    

    Примечание

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

  4. Подготовьте 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: {}
    

    Примечание

    Весь список параметров смотрите в values.yaml из чарта. Получить values.yaml из скачанного отдельно Helm-чарта можно при помощи команды helm show values gs-ctk-helm-chart-SNAPSHOT.tgz > values.yaml.

    Документация по параметрам Helm-чарта доступна здесь.

    Обратите внимание, что должны быть установлены следующие параметры:

    deploymentType: namespace # указывает, что разворачивать пространство имен и роли не требуется
    overrideNsctlServiceAccount: gs-ctk-sa # созданный ранее ServiceAccount
    overrideWorkerServiceAccount: gs-ctk-sa # созданный ранее ServiceAccount
    

    Примечание

    Если для работы gs-ctk требуются Tolerations или nodeSelector, укажите их здесь, в values.yaml

  5. Разверните ресурсы уровня пространства имен (ресурс контроллера 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)
    
  6. Проверьте, что под 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 потребуются следующие секреты (смотри раздел Создание секретов вручную):

  • логин/пароль администратора Global ERP;

  • логин/пароль для подключения к базе данных PostgreSQL;

  • токен авторизации планировщика перед сервером приложений;

  • секреты HAProxy:

    • логин/пароль для доступа к статистике HAProxy;

    • если клиенты будут подключаться к балансировщику напрямую (без Ingress) по TLS, то также сертификат и приватный ключ.

  • логин/пароль для доступа к мониторингу встроенной Grafana;

  • секреты встроенного RabbitMQ:

    • логин/пароль от панели администратора RabbitMQ;

    • логин/пароль для взаимодействия RabbitMQ и сервера приложений.

Создание секретов через Helm-чарт#

Начиная с версии 5.4.0 секреты можно создавать через Helm-чарт. За это отвечают следующие параметры values.yaml:

Примечание

Чтобы получить токен шедулера выполните команду ./scheduler_keys.sh generate_new_keys --destination workspace/keys. Подробнее о создании секрета шедулера читайте здесь.

# Включить добавление секретов через values.yaml
addSecrets: true

# Настройка секретов по умолчанию
secrets:
  gs-admin-auth:
    type: kubernetes.io/basic-auth
    stringData:
      password: admin
      username: admin
  db-user-secret:
    type: kubernetes.io/basic-auth
    stringData:
      password: admin
      username: admin
  scheduler-token-secret:
    stringData:
      private.key: change_me_scheduler_private_key
  secret-haproxy-auth:
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: t0p-Secret
  grafana-admin:
    type: kubernetes.io/basic-auth
    stringData:
      password: admin
      username: admin
  rabbitmq-global:
    type: kubernetes.io/basic-auth
    stringData:
      password: globalrabbitmq
      username: globalrabbitmq
  rabbitmq-admin:
    type: kubernetes.io/basic-auth
    stringData:
      password: admin
      username: admin
  ctk-restapi-secret:
    type: Opaque
    stringData:
      jwt-secret-key: change_me_in_production_min_32_char
      admin-password: admin
      viewer-password: viewer
  prometheus-admin:
    type: kubernetes.io/basic-auth
    stringData:
      password: admin
      username: admin

Совет

Как видно по values.yaml из Helm-чарта, по умолчанию для rabbitmq-global логин - globalrabbitmq, для всех остальных логин - admin.

Мы можем развернуть наши секреты через следующую команду (если вы указывали --namespace при развертывании на предыдущем этапе укажите его и здесь):

helm upgrade gs-ctk ~/nscli/helm_chart -f values.yaml \
  --set addSecrets=true \
  --set secrets.gs-admin-auth.stringData.password="admin" \
  --set secrets.db-user-secret.stringData.username="dbuser" \
  --set secrets.db-user-secret.stringData.password="dbpass" \
  --set-json 'secrets.scheduler-token-secret.stringData={"private.key":"token..."}' \
  --set secrets.secret-haproxy-auth.stringData.password="admin" \
  --set secrets.grafana-admin.stringData.password="admin" \
  --set secrets.prometheus-admin.stringData.password="admin" \
  --set secrets.rabbitmq-global.stringData.password="globalrabbitmq" \
  --set secrets.rabbitmq-admin.stringData.password="admin" \
  --set-string secrets.ctk-restapi-secret.stringData.jwt-secret-key="replace_me_with_32_or_more_chars" \
  --set-string secrets.ctk-restapi-secret.stringData.admin-password="admin" \
  --set-string secrets.ctk-restapi-secret.stringData.viewer-password="viewer"

Проверьте создание секретов через команду:

kubectl get secret --namespace gs-ctk

Если секреты созданы, переходите к шагу 4.

Создание секретов вручную#

Развернуть описание
  1. Учетная запись администратора 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
    
  2. Учетная запись для подключения к базе данных

    Создайте секрет с аккаунтом пользователя БД, заменив значения шаблона <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
    
  3. Токен планировщика

    Создайте секрет с токеном планировщика, выполнив команду nscli ./scheduler_keys.sh generate_new_keys --destination workspace/keys.

    Внимание

    Подробнее о генерации quartz.private.pem здесь.

    apiVersion: v1
    kind: Secret
    metadata:
      name: scheduler-token-secret
      namespace: gs-ctk
    stringData:
      private.key: <key>
    
    kubectl apply -f ~/nscli/workspace/keys/secret.yaml
    
  4. Секреты 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
    
  5. Учетная запись администратора 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
    
  6. Учетная запись администратора Prometheus

    apiVersion: v1
    kind: Secret
    metadata:
      name: prometheus-admin
      namespace: gs-ctk
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: admin
    
    cat <<EOF | tee ~/nscli/workspace/prometheus-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: prometheus-admin
      namespace: gs-ctk
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: admin
    EOF
    
    kubectl apply -f ~/nscli/workspace/prometheus-secret.yaml
    
  7. Секреты 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
    
  8. Секреты Ctk Rest API

    • Создайте секрет с аккаунтами и JWT токеном для Ctk Rest API

    apiVersion: v1
    kind: Secret
    metadata:
      name: ctk-restapi-secret
      namespace: gs-ctk
    type: Opaque
    stringData:
      jwt-secret-key: change_me_in_production_min_32_char
      admin-password: admin
    
    cat <<EOF | tee ~/nscli/workspace/ctk-restapi-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: ctk-restapi-secret
      namespace: gs-ctk
    type: Opaque
    stringData:
      jwt-secret-key: change_me_in_production_min_32_char
      admin-password: admin
    EOF
    
    kubectl apply -f ~/nscli/workspace/ctk-restapi-secret.yaml
    

Шаг 4. Настройте группы ресурсов#

Совет

Здесь конфигурационный ресурс будет формироваться при помощи мастеров утилиты nscli.

Вы можете сформировать его самостоятельно без использования утилиты. Подробнее читайте здесь.

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

    ./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
    Введите имя секрета basic-auth для настройки обязательной авторизации в Prometheus или пропустите для работы без авторизации:prometheus-admin
    Укажите версию Java:21
    Включить горячие обновления?[да,нет]:нет
    Осушать кластер перед запуском обновления?[да,нет]:да
    Включить обновление при помощи ресурса Kubernetes типа Job?[да,нет]:да
    Укажите размер кучи Java (Xmx) для Job обновления:3500M
    Введите запрос CPU для globalserver:2
    Введите запрос MEMORY для globalserver:4G
    Введите лимиты CPU для globalserver:2
    Введите лимиты MEMORY для globalserver:4G
    Введите запрос CPU для systemagent:1
    Введите запрос MEMORY для systemagent:500M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:1G
    Введите адрес к дополнительному 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`
    
  2. Создайте книгу ресурсов global-server-excl, описывающую эксклюзивный под с сервером приложений:

    Внимание

    Не рекомендуется занижать requests memory (например, до 4Gi) на prod контурах для excl и share подов. Планирование в Kubernetes выполняется по requests, из-за чего несколько ресурсоёмких подов могут быть размещены на одной ноде при наличии свободных, что под нагрузкой приводит к рестартам/эвиктам из-за дефицита RAM на ноде. Рекомендуется задавать requests.memory близким к -Xmx, а limits.memory - на уровне Xmx + ~10% для покрытия накладных расходов JVM.

    ./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:1
    Введите запрос MEMORY для globalserver:4G
    Введите лимиты CPU для globalserver:2
    Введите лимиты MEMORY для globalserver:4G
    Введите запрос CPU для systemagent:1
    Введите запрос MEMORY для systemagent:500M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:1G
    Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет
    Введите имя секрета для администратора: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`
    
  3. Создайте книгу ресурсов 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:1
    Введите запрос MEMORY для globalserver:4G
    Введите лимиты CPU для globalserver:2
    Введите лимиты MEMORY для globalserver:4G
    Введите запрос CPU для systemagent:1
    Введите запрос MEMORY для systemagent:500M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:1G
    Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет
    Введите имя секрета для администратора: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`
    
  4. Создайте книгу ресурсов 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:1
    Введите запрос MEMORY для globalscheduler:4G
    Введите лимиты CPU для globalscheduler:2
    Введите лимиты MEMORY для globalscheduler:4G
    Введите запрос CPU для systemagent:1
    Введите запрос MEMORY для systemagent:500M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:1G
    Дополнительно отсылать метрики во внешнюю систему[да,нет]:нет
    Введите имя секрета с токеном планировщика: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`
    
  5. Создайте книгу ресурсов 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 для systemagent:1
    Введите запрос MEMORY для systemagent:500M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:1G
    
    Книга ресурсов настроена!
    
    Следующие действия:
    - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config config.yaml --resgroup gs-cluster-1`
    - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config config.yaml --resgroup gs-cluster-1 --resbook haproxy`
    
  6. Создайте книгу ресурсов grafana, описывающую внутренний стек мониторинга:

    Внимание

    Данная книга ресурсов требует адрес сервиса kube-prometheus-stack. Он задаётся в формате „{{service_name}}.{{namespace}}.svc.cluster.local“. Подробнее о сервисе

    Для этого:

    • Найдите неймспейс kube-prometheus-stack-а (обычно monitoring, prometheus-monitoring):

      kubectl get namespaces
      
    • Найдите имя сервиса prometheus (сервис с портами 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
    Введите интервал запроса метрик из kube-prometheus-stack:30
    Введите имя секрета с аккаунтом администратора 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`
    
  7. Создайте книгу ресурсов 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`
    
  8. Создайте книгу ресурсов queuewalker, описывающий обходчик очередей:

    ./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook queuewalker --classname queuewalker
    
    Настройка книги ресурсов: queuewalker (класс queuewalker)
    =========================================================
    
    Введите запрос CPU для queuewalker:1
    Введите запрос MEMORY для queuewalker:512M
    Введите лимиты CPU для queuewalker:1
    Введите лимиты MEMORY для queuewalker:1G
    Количество реплик (replicas):1
    Секрет обходчика. Если оставить пустым, будет использоваться секрет шедулера (token_secret):
    Код обходчика очередей, по которому отправляются запросы к БД (code_worker):default
    Частота опроса БД в миллисекундах для получения новых очередей (reader_timeout_ms):1000
    Таймаут запроса в миллисекундах (request_timeout_ms):10000
    Количество потоков, отправляющих задачи на сервер (sender_threads_worker):10
    Пользователь, от имени которого выполняются JEXL-скрипты (exec_user):admin
    Максимальное количество неуспешных попыток выполнить очередь (queue_max_attempts):5
    Путь в URL, на который отправляются задачи (url_path):app/sys/rest/ss/pkg/Btk_JexlGatePkg/execute
    Максимальный размер кучи (Xmx) для обходчика очередей (queuewalker_xmx):512m
    Уровень подробности логов (log_level):INFO
    
    Книга ресурсов настроена!
    
    Следующие действия:
    - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config c.yaml --resgroup gs-cluster-1`
    - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config c.yaml --resgroup gs-cluster-1 --resbook queuewalker`
    
  9. (Опционально) Создайте книгу ресурсов img2doc:

    ./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook img2doc --classname img2doc
    
    Настройка книги ресурсов: img2doc (класс img2doc)
    ===================================================
    
    Введите порт:7000
    Введите кол-во реплик:1
    Введите запрос CPU для img2doc:1
    Введите запрос MEMORY для img2doc:500M
    Введите лимиты CPU для img2doc:2
    Введите лимиты MEMORY для img2doc: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`
    
  10. (Опционально) Создайте книгу ресурсов ctk-restapi:

    ./configmgr.sh configure_resbook --config-path config.yaml --resgroup gs-cluster-1 --resbook ctk-restapi --classname ctk-restapi
    
    Настройка книги ресурсов: ctk-restapi (класс ctk-restapi)
    =========================================================
    
    Использовать Ingress?[да,нет]:да
    Введите класс Ingress:nginx
    Введите хост Ingress:ctk-rest.api
    Введите дополнительную аннотацию Ingress (или пропустите поле):
    Порт API:8000
    Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL):INFO
    Имя секрета с ключами и паролями ctk-restapi:ctk-restapi-secret
    Введите запрос CPU для ctk-restapi:500m
    Введите запрос MEMORY для ctk-restapi:256Mi
    Введите лимиты CPU для ctk-restapi:1000m
    Введите лимиты MEMORY для ctk-restapi:512Mi
    Автоматически добавить все сервисы из других книг ресурсов?[да,нет]:да
    Автоматически добавлено 6 сервисов из других книг ресурсов.
    
    Параметры конфигурации REST API
    ===============================
    
    Окружение приложения (production or development or test):development
    JWT алгоритм:HS256
    Время истечения токена (минут):15
    Лимит запросов входа в минуту:5
    Лимит API запросов в минуту:10
    Включить аудит логирование[да,нет]:да
    Максимальная длина причины перезагрузки:500
    CORS источники (через запятую):*
    CORS разрешить учетные данные[да,нет]:нет
    CORS методы (через запятую):GET, POST
    CORS заголовки (через запятую):Content-Type, Authorization
    
    Kubernetes сервисы
    ==================
    
    Существующие сервисы:
    1. global-scheduler
    2. global-server-excl
    3. global-server-share
    4. haproxy
    5. grafana
    6. rabbitmq
    7. ctk-restapi
    Действие: (a)dd, (e)dit, (d)elete, (q)uit:e
    Имя сервиса для редактирования:haproxy
    Редактирование сервиса 'haproxy'
    K8s сервис:gs-cluster-1-haproxy
    Селектор:app=gs-cluster-1-haproxy
    ✓ Сервис 'haproxy' обновлён
    Существующие сервисы:
    1. global-scheduler
    2. global-server-excl
    3. global-server-share
    4. haproxy
    5. grafana
    6. rabbitmq
    7. ctk-restapi
    Действие: (a)dd, (e)dit, (d)elete, (q)uit:q
    
    Пользователи
    ============
    
    Форматы: service:all, service:view, service:restart, service:NAME:view, service:NAME:restart
    Существующие пользователи:
    1. admin
    Действие: (a)dd, (e)dit, (d)elete, (q)uit:q
    
    Книга ресурсов настроена!
    
    Следующие действия:
    - Список книг ресурсов можно получить при помощи команды `./configmgr.sh list_resbooks --config ../config.yaml --resgroup gs-cluster-1`
    - Удалить книгу ресурсов: `./configmgr.sh remove_resbook --config ../config.yaml --resgroup gs-cluster-1 --resbook ctk-restapi`
    

Шаг 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, однако это необязательно. Читайте подробнее здесь.

  1. Загрузите комплект приложений на системное NFS-хранилище:

    ./appkit.sh push --namespace gs-ctk --source workspace/appkit --destination appkit/v1
    
    • --namespace gs-ctk - пространство имен, в котором развернут gs-ctk.

    • --source workspace/appkit - путь к папке с комплектом на локальной ФС относительно текущей папки.

    • --destination appkit/v1 - путь к папке, в которую следует поместить комплект, относительно точки монтирования системного хранилища.

  2. Обновите хеши и пути к комплекту приложения (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 из предыдущего пункта).

  3. Переведите комплект приложения в состояние started:

    ./appkit.sh start --config-path ./config.yaml --resgroup gs-cluster-1
    

Шаг 6. Подготовьте комплект группы#

Подробнее о загрузке комплекта группы в отдельном руководстве

Шаг 7. Примените конфигурацию при помощи kubectl#

К этому шагу у вас должен был получиться конфигурационный файл приблизительно следующего содержания:

apiVersion: global-system.ru/v1
kind: GlobalConfiguration
metadata:
  name: config
spec:
  type: advanced
  resgroups:
  - name: gs-cluster-1
    #groupkit: groupkit/v1
    prometheus_secret: prometheus-admin
    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
    - enabled: true
      type: queuewalker
      name: queuewalker
      replicas: 1
      token_secret: ''
      code_worker: default
      reader_timeout_ms: 1000
      request_timeout_ms: 10000
      sender_threads_worker: 10
      exec_user: admin
      queue_max_attempts: 5
      url_path: app/sys/rest/ss/pkg/Btk_JexlGatePkg/execute
      queuewalker_xmx: 512m
      log_level: INFO
    upgrade_job:
      enabled: true
      java_xmx: 3500M
      resources:
        requests:
          memory: 4G
          cpu: '2'
        limits:
          memory: 4G
          cpu: '2'
      agent_resources:
        requests:
          memory: 250M
          cpu: '1'
        limits:
          memory: 500M
          cpu: '1'

Совет

Замените GlobalConfiguration на NamespacedGlobalConfiguration и добавьте поле namespace в metadata с указанием вашего пространства имен, чтобы хранить конфигурационный ресурс на уровне пространства имен.

Мы готовы к развертыванию Global ERP. Для этого выполним:

kubectl apply -f ./config.yaml

Начнется инициализация контейнеров, после чего сервер приложений должен быть доступен через браузер, войти однако не получится - требуется проинициализировать базу данных.

Совет

В случае неполадок посмотрите созданное пространство имен на наличие перезагружающихся подов. Также в случае ошибок с конфигурацией nsctl создаст событие на конфигурационный ресурс.

Шаг 8. Запустите обновление базы данных#

  1. Выполните следующую команду:

    ./appkit.sh upgrade --config-path ./config.yaml --resgroup gs-cluster-1
    
  2. Повторно примените ресурс:

    kubectl apply -f ./config.yaml
    

Совет

Для отслеживания статуса обновления и чтения логов, используйте команду:

./appkit.sh wait_upgrade --namespace gs-ctk --resgroup gs-cluster-1

Следующие шаги#