Установка#

Примечание

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

Инструкция по установке, используя ранние версии gs-ctk, доступна здесь.

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

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

  • развернутая 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#

Примечание

Временно 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, например, на общекорпоративном коммунальном кластере.

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

  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
    

    Примечание

    Docker-секрет будет создан позже, после развертывания пространства имен Helm-чартом.
    
  2. Разверните 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)
    
  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: {}
    

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

    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 потребуются следующие секреты:

Учетная запись администратора 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.

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

  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
    Укажите версию 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`
    
  2. Создайте книгу ресурсов 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`
    
  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: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`
    
  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: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`
    
  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 для 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`
    
  6. Создайте книгу ресурсов 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`
    
  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. (Опционально) Создайте книгу ресурсов 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, однако это необязательно. Читайте подробнее здесь.

  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. Подготовьте комплект группы#

Комплект группы (groupkit) - это дополнительные и редко изменяемые артефакты, используемые в развертывании Global ERP. В их число входят:

  • Архив с дополнительными библиотеками (libs)

  • Архив с дополнительными шрифтами (fonts)

  • Файлы JDK для переопределения (java), например cacerts.

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

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

    ./groupkit.sh push --namespace gs-ctk --source workspace/groupkit --destination groupkit/v1
    
  2. Добавьте в файл (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. Запустите обновление базы данных#

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

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

    kubectl apply -f ./config.yaml
    

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