Неуправляемый режим#

Утилита nscli позволяет развернуть кластер в неуправляемом режиме. Так вместо создания пространства имен и развертывания управляющего пода nsctl, nscli создаст уже готовый пакет, описывающий все группы и книги ресурсов, который затем уже можно развернуть на кластере при помощи kubectl.

Мы рекомендуем пользоваться управляемым режимом, но вам может быть необходимо работать с кластером Kubernetes напрямую с минимальным задействованием утилит Global.

Сравнение управляемого и неуправляемого режима#

Критерий

Управляемый режим

Неуправляемый режим

Степень автоматизации

Все основные задачи, необходимые для развертывания и поддержки Global ERP в кластере, автоматизированны

Автоматизировано лишь создание ресурсов, описывающих контейнеры и конфигурацию решения

Сложность администрирования

Работа с нативными средствами K8s сведена к минимуму, используются удобные обертки

Для использования требуется глубокое понимание K8s.

Обновление

Есть налаженные команды обновления решения и работы с сетевыми хранилищами

Утилита в неуправляемом режиме не обеспечивает доставки комплекта приложений, как и обновления БД

Вероятность ошибок

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

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

Развертывание в неуправляемом режиме#

Инструкция дана для:

  • рабочего кластера Kubernetes из одной control-plane ноды (10.0.1.1) и трех рабочих нод с 6ГБ ОЗУ и установленным дистрибутивом Debian;

  • двух NFS-хранилищ 10.0.2.1 с точками монтирования /nfs/sys и /nfs/app;

  • PostgreSQL-сервера по адресу 10.0.3.1 с подготовленной БД global;

  • jump-хоста с доступом к Kubernetes.

Совет

Доступ к кластеру для хоста, на котором будут генерироваться ресурсы K8s при помощи nscli, необязателен.

  1. Установите утилиту nscli в соответствии с инструкцией.

  2. Подготовьте папку с комплектом приложений (appkit). Поместите её на машину с утилитой, например, по пути ~/nscli/workspace/appkit.

  3. Подготовьте ресурсы секретов и роли для мониторинга.

  4. Выполните в папке nscli, чтобы получить (изменить) конфигурацию неуправляемого режима:

    ./namespace.sh configure_unmanaged --config workspace/config.yaml
    

    В ходе настройки укажите названия, характеристики и настройки пространства имен, групп и книг ресурсов.

    Утилита попросит у вас путь к папке с комплектом приложений (appkit), после ввода утилита упакует комплект, пересчитает и поместит в папке его хеш-суммы, после чего сохранит их в конфигурационном файле. Чтобы переупаковать комплект и пересчитать хеш-функции в неинтерактивном режиме используйте команду ./appkit.sh refresh_hash --source.

    Совет

    В некоторых полях, например, при выборе класса книги ресурсов, можно использовать стрелочки «вверх»-«вниз» для выбора из часто встречаемых вариантов.

    Пример:

    k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh configure_unmanaged --config workspace/config.yaml
    Введите имя рабочего пространства:gs-cluster-k8s
    Введите адрес докер регистра:dockerhub.global-system.ru
    Введите пользователя для авторизации докера:userk8s
    Введите пароль для авторизации докера:**********
    Введите пароль для авторизации докера:**********
    Выберите тип репозитория:nfs
    Необходимо задать параметры для Network File System
    Введите имя сервера:10.0.2.1
    Введите путь:/nfs/sys
    Добавить группу gs-cluster-1?[да,нет]:да
    Введите название группы ресурсов 1 (или оставьте пустым, чтобы приступить к настройке групп):gs-cluster-1
    Введите название группы ресурсов 2 (или оставьте пустым, чтобы приступить к настройке групп):
    Инициализация значений для группы ресурсов gs-cluster-1
    Введите timezone подов:Europe/Moscow
    Введите url базы данных:jdbc:postgresql://10.0.3.1:5432/global
    Введите alias базы данных:global
    Введите имя секрета для пользователя БД:db-user-secret
    Введите тип прикладного хранилища:nfs
    Введите адрес сервера(server):10.0.0.2
    Введите путь(path):/nfs/app
    Хотите загрузить метаданные appkit из папки?[да,нет]:да
    Укажите путь к папке с appkit:workspace/appkit
    Метаданные appkit загружены
    Укажите хеш globalserver:9828f2ebb9979e9e9765e8fe7591557bd15d0c3a
    Укажите хеш applib:56451d21e04b84fad0a87a3867d7bdbe91f464f5
    Укажите хеш profile:fb2add3bb36ebd219da754352ccdf0c78143e2fc
    Укажите путь к папке с appkit на системном хранилище (NFS):appkit/v1
    Внимание! В неуправлемом режиме вы обязаны сами поместить appkit на системное хранилище по указанному пути
    Укажите состояние appkit:started
    Введите путь к папке с комплектом группы (groupkit) на системном хранилище (NFS); оставьте пустым, если он не требуется:
    Введите название книги ресурсов 1 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-scheduler
    Введите класс книги ресурсов global-scheduler в группе gs-cluster-1:global_scheduler
    Добавить книгу ресурсов global-scheduler?[да,нет]:да
    Настройка книги ресурсов global-scheduler...
    Отслеживать метрики:true
    Дополнительно отсылать метрики во внешнюю систему:false
    Введите максимальный размер(java -Xmx) для globalscheduler:800M
    Введите запрос CPU для globalscheduler:1
    Введите запрос MEMORY для globalscheduler:1G
    Введите лимиты CPU для globalscheduler:1
    Введите лимиты MEMORY для globalscheduler:1G
    Введите запрос CPU для systemagent:1
    Введите запрос MEMORY для systemagent:250M
    Введите лимиты CPU для systemagent:1
    Введите лимиты MEMORY для systemagent:500M
    Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
    Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
    Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
    Введите имя секрета с токеном планировщика:scheduler-token-secret
    Введите название книги ресурсов 2 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-server-excl
    Введите класс книги ресурсов global-server-excl в группе gs-cluster-1:global_server_excl
    Отслеживать метрики:true
    Дополнительно отсылать метрики во внешнюю систему:false
    Введите максимальный размер(java -Xmx) для globalserver: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
    Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
    Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
    Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
    Введите внешний ip(external_ip):
    Введите имя секрета для администратора:gs-admin-auth
    Введите тип секрета для администратора:kubernetes.io/basic-auth
    Введите название книги ресурсов 3 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-server-share
    Введите класс книги ресурсов global-server-share в группе gs-cluster-1:global_server_share
    Отслеживать метрики:true
    Дополнительно отсылать метрики во внешнюю систему:false
    Введите максимальный размер(java -Xmx) для globalserver: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
    Введите количество экземпляров:2
    Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
    Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
    Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
    Введите имя секрета для администратора:gs-admin-auth
    Введите тип секрета для администратора:kubernetes.io/basic-auth
    Введите название книги ресурсов 4 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):grafana
    Введите класс книги ресурсов grafana в группе gs-cluster-1:grafana
    Настройка книги ресурсов grafana...
    Введите запрос CPU для grafana:1
    Введите запрос MEMORY для grafana:500M
    Введите лимиты CPU для grafana:2
    Введите лимиты MEMORY для grafana:1Gi
    Введите внешний ip(external_ip):10.0.1.1
    Введите класс хранилища:local-storage
    Введите размер хранилища:1Gi
    Введите имя системного пользователя с правами на доступ к метрикам cAdvisor:prometheus-cadvisor
    Введите имя секрета с аккаунтом администратора Grafana:grafana-admin
    Введите название книги ресурсов 5 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):haproxy
    Введите класс книги ресурсов haproxy в группе gs-cluster-1:haproxy
    Настройка книги ресурсов haproxy...
    Введите запрос CPU для haproxy:1
    Введите запрос MEMORY для haproxy:500M
    Введите лимиты CPU для haproxy:2
    Введите лимиты MEMORY для haproxy:1G
    Введите внешний ip(external_ip):10.0.1.1
    Введите внешний порт(external_port):8081
    Введите имя секрета basic-auth для авторизации статистики:secret-haproxy-auth
    Введите имя tls секрета для доступа по https:
    Добавить книгу ресурсов rabbitmq?[да,нет]:да
    Введите название книги ресурсов 6 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):rabbitmq
    Введите класс книги ресурсов rabbitmq в группе gs-cluster-1:rabbitmq
    Настройка книги ресурсов rabbitmq...
    Введите запрос CPU для rabbitmq:1
    Введите запрос MEMORY для rabbitmq:2Gi
    Введите лимиты CPU для rabbitmq:2
    Введите лимиты MEMORY для rabbitmq:4Gi
    Введите название секрета для доступа к RabbitMQ:rabbitmq-global
    Введите название секрета для доступа к консоли RabbitMQ:rabbitmq-admin
    Введите название создаваемого виртуального хоста RabbitMQ:globalrabbitmq
    Введите внешний ip(external_ip):10.0.1.1
    Введите внешний порт:15672
    Введите название книги ресурсов 7 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):
    Подключить RabbitMQ?[да,нет]:да
    Введите адрес RabbitMQ:gs-cluster-1-rabbitmq-internal.gs-cluster-k8s.svc.cluster.local
    Введите порт RabbitMQ:5672
    Введите виртуальный хост RabbitMQ:globalrabbitmq
    Введите секрет RabbitMQ:rabbitmq-global
    
  5. Поместите упакованный комплект приложений (находится по тому же пути ~/nscli/workspace/appkit) на системное (NFS-)хранилище, по указанному на предыдущем этапе пути (в нашем случае /nfs/sys/appkit/v1/).

  6. Создайте ресурсы с пространством имен, группами и книгами:

    ./namespace.sh create_unmanaged_namespace --config workspace/config.yaml --namespace-deploy workspace/namespace.yaml # пространство имен
    ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml # группы и книги ресурсов
    
  7. Последовательно примените ресурс пространства имен, секреты, роли и, наконец, группы и книги ресусров:

    kubectl apply -f workspace/namespace.yaml
    # kubectl apply -f secrets.yaml
    # kubectl apply -f roles.yaml
    kubectl apply -f workspace/resources.yaml
    
  8. Проверьте, что кластер исправно работает:

    • просмотрите список развернутых подов при помощи kubectl get -A pods на наличие созданных ресурсов и проверьте, что они работают;

    • попробуйте подключиться к веб-интерфейсу через браузер по указанному для HAProxy адресу.

    В случае неисправностей проанализируйте логи и метрики при помощи Grafana.

    Совет

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

Шифрование настроек учетной записи от реестра образов Docker#

Поскольку реквизиты от реестра образов - это чувствительная информация, она хранится в конфигурации в зашифрованном виде. Следовательно, чтобы работать с ними нужен мастер-ключ, хранящийся по пути ~/.gs-ctk.priv, и настройки шифрователя по пути (~/nscli/)workspace/cryptor_state.json.

Обратите внимание, что мастер-ключ не требуется для работы с группами и книгами ресурсов. Вы можете сказать утилите не расшифровывать реквизиты докер при помощи параметра --no-cryptor.

./namespace.sh configure_unmanaged  --no-cryptor --config cfg.yaml
./namespace.sh create_unmanaged_resources --no-cryptor --config cfg.yaml --resources m.yaml
./namespace.sh create_unmanaged_namespace --config cfg.yaml --namespace-deploy ns.yaml # невозможно сформировать пространство имен без правильного мастер-ключа

Перенос конфигурации#

В последних версиях утилитах, экспорт/импорт конфигурации управляемого режима полностью совместим с конфигурацией неуправляемого режима.

Чтобы перенести конфигурацию, выполните:

./configmgr.sh export --namespace gs-cluster-1 --file workspace/config.yaml 
# конфигурация gs-cluster-1 сохранена в файл workspace/config.yaml

./namespace.sh configure_unmanaged --config workspace/config.yaml
# укажите настройки реестра образов и внесите другие необходимые изменения, например, поменяйте название пространства имен

Теперь вы можете использовать (~/nscli/)workspace/config.yaml, как конфигурацию неуправляемого режима.

Обновление#

Поскольку в неуправляемом режиме утилита nscli не имеет доступа к кластеру, вам придется своими руками выполнить процедуру, которую обычно при обновлении выполняет утилита:

  1. Поместите новый комплект приложений в папку (~/nscli/)workspace/appkit.

  2. Переведите комплект приложений в состояние stopped. Для этого, измените в конфиге, который вы получили при помощи команды ./namespace.sh configure_unmanaged (в нашем примере (~/nscli/)workspace/config.yaml) значение состояния (spec.appkit.state) у необходимой группы ресурсов на указанное.

    config_version: 1
    resgroups:
     - name: gs-cluster-1
       spec:
          appkit:
             path: appkit/v1
             state: stopped
             applib_sha1: 56451d21e04b84fad0a87a3867d7bdbe91f464f5
             ...
          values:
             ...
    

    Создайте и примените новые ресурсы:

    ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml
    kubectl apply -f workspace/resources.yaml
    
  3. Запустите редактор конфигурации:

    ./namespace.sh configure_unmanaged --config workspace/config.yaml
    

    Обновите хеши комплекта приложений и установите ему состояние drained, когда пользователи не подключается, но сервер приложений работает.

    Совет

    Чтобы утилита сама подсчитала хеши, укажите в поле «Хотите загрузить метаданные appkit из папки?» значение «да», затем укажите папку с новым копмлектом приложений (~/nscli/)workspace/config.yaml.

    k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh configure_unmanaged --config workspace/config.yaml
    ...
    Хотите загрузить метаданные appkit из папки?[да,нет]:да
    Укажите путь к папке с appkit:workspace/appkit
    Метаданные appkit загружены
    Укажите хеш globalserver:de014bfd3604100ea19b4b5a6104e789fe136692
    Укажите хеш applib:ca4118be45efc4509e80f9cb97279399d697ca01
    Укажите хеш profile:18ddc5f7762ae21b3789692f304b4a4e35c8f115
    Укажите путь к папке с appkit на системном хранилище (NFS):appkit/v2
    Внимание! В неуправлемом режиме вы обязаны сами поместить appkit на системное хранилище по указанному пути
    Укажите состояние appkit:drained
    ...
    

    Совет

    Обратите внимание, что новый appkit хранится по пути appkit/v2, а не appkit/v1.

  4. Скопируйте новый комплект приложений с хешами (workspace/appkit) на системное NFS-хранилище по указанному пути (appkit/v2).

  5. Примените новую конфигурацию.

    ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml
    kubectl apply -f workspace/resources.yaml
    
  6. Обновите базу данных. Для этого подключитесь к поду с эксклюзивным экземпляром сервера приложений (global-server-excl) и выполните на нем команду:

    ./migrator.sh upgrade
    

    Совет

    Вы также можете воспользоваться командой ./invoke.sh в составе nscli, если у утилиты есть доступ к кластеру.

       ./invoke.sh --namespace [namespace] --app [resgroup]-[resbook] --cmd './migrator.sh upgrade'
    

    , где [namespace] - пространство имен, [resgroup] - группа ресурсов, [resbook] - книга ресурсов класса global-server-excl

    Проверьте, что вывод генератора таблиц не сообщает об ошибках.

  7. Переведите новый комплект приложений в состояние started аналогично шагу 2.

Обновление должно быть завершено, а сервер приложений должен принимать пользователей.

Обратите внимание, что мы рассмотрели лишь обновление комплекта приложений, но не образов контейнеров. Ознакомьтесь с документацией Kubernetes по поводу существующих средств обновления контейнеров.

В качестве самого простого решения, удалите пространство имен в Kubernetes:

kubectl delete namespace gs-cluster-k8s

Сделайте нужные изменения в конфигурации, сгенерируйте ресурсы заново и примените их:

./namespace.sh configure_unmanaged workspace/config.yaml

./namespace.sh create_unmanaged_namespace --config workspace/config.yaml --namespace-deploy workspace/namespace.yaml
./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml

kubectl apply -f workspace/namespace.yaml
# kubectl apply -f secrets.yaml
# kubectl apply -f roles.yaml
kubectl apply -f workspace/resources.yaml