Установка#

Нам потребуется виртуальная машина для административных задач - jump host. C нее будем выполнять все операции по администрированию кластера. Пользователь, под которым будет проводится настройка должен иметь привилегии администратора и разрешения для запуска sudo.

Настройка узла администрирования (jump host)#

Установка необходимых пакетов#

На jump хост необходимо установить следующие пакеты:

sudo apt-get install mc htop 
sudo apt-get install -y kubectl
sudo apt-mark hold kubectl
sudo apt install nfs-common

Совет

Версия kubectl должна соответствовать версии в платформе kubernetes или быть новее

Настройка работы с docker образами#

Если требуется работа с образами из docker регистра

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

Insecure Docker Registry#

Если кластер запускается в закрытой сети, docker регистр может не использовать SSL (Insecure Docker Registry). Запуск Insecure Docker Registry для хранения своих docker-образов не самый лучший вариант с точки зрения безопасности, но порой это самое простое и разумное решение в закрытых сетях.

Для настройки нужно изменить (или создать, если такового нет) конфигурационный файл /etc/docker/daemon.json, добавив в него следующие строки:

{
    "insecure-registries" : ["myregistry.example.local:1234"]
}

, где myregistry.example.local:1234 - адрес и порт локального докер регистра

скрипт для создания файла:

cat <<EOF | sudo tee /etc/docker/daemon.json
{
    "insecure-registries" : ["myregistry.example.local:1234"]
}
EOF

После чего выполнить перезапуск сервиса с помощью:

sudo systemctl restart docker

Настройка авторизации kubernetes кластера#

Получите конфигурационный файл авторизации для кластера Kubernetes, который создается при разворачивании kubernetes

Пример файла:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJUkMwZFZrYXhBTE13RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBeE1UZ3hOekUzTkRoYUZ3MHpOREF4TVRVeE56SXlORGhhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURRK0FxbVlpT2dJZnJhQ3NocXJOZ2hGQVA2dWtKSG1idjhpTGQzeDIvcXBGVENacDFldCtmTW9QMmcKSDluaXloRm00NjNTbXZzS0JCRml2Um5YbGpLOE9EMmM2U2E1NkVndEQzY3dmR0hsLzczTFQzQUZVeE5vL2RsLwo5dkNnNWQvbG5Ya3VqUVJmRmVQZHJUc3AyMU5YOGc2a25WbmRYaFlidExJNmVpbUF0SE92L1dCYndmbU9HZllBCkovdCt6Y3c2eG11OGFrcGFTeFN0ZWxlUGxSSG5XWnJ2U0w2LzJ1a094aHZFVnpJbFAxQy9yMGcvblhUZjVIcWUKSU9pSFM3TGRKVWxrUW5HblNVRDJ2cWJYOUV5S0tJMWV5dS83NHBiaE1qdE9HdFVDMHQxUUhRM0JWaWx6dXZTTwp0TTg2U1JBeVR4aURud2tyYmYrUmEzQ3BiRmNkQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL
    server: https://127.0.0.1:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJR04ydFhtNkEzc2N3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBeE1UZ3hOekUzTkRoYUZ3MHlOVEF4TVRjeE56SXlORGxhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcy9rekkKOWxudHRtRVdQa2xhWWVMYzZnc2pOWENQV0JFM1QvenVYeE8yNDdRMW5yZDFQcXdwdWVHMmYySUNOVWVXb0RJTgpQOHZYa2JQWTRZNkdZUUt0SFdVS1czejVUL2RNdVVRVFFabkVoZEk2cEs0M05saHBHVy81WWt0dWRuNU1KT1ZoCk5OV0pxYXVmazNMV3VmQUZKWWJXSTkrcmRvYS9NRHNib0p1ZXk0S1dGeGdaVkR3SGdORUxmUmc2N01RbVYxV2oKdHVnTnJFcXJEdDdJQzVWQ0V0RVBqWGlxSzJZNHJxVWMzQlJyWVZydkVRMXZYREhYbDBSTytUYVpEMVVxSTVDawpUYUVVYjNnY2tlbVdjYXEwdGVQNjIyZFUvL09LbktoNnJ5VU0xZkFXUFBFa1pKbEF3VHZLOW15L2p3OXdJaXJKCkhib0RpZEltZGZ0aWhvTC9BZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkg4Y1pPR3lyNlRsSk0wWgprTTZtS2grS2ZpRGtNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUE5SVduWENrY0lraGFSODlxV1VH
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBclA1TXlQWlo3YlpoRmo1SldtSGkzT29MSXpWd2oxZ1JOMC84N2w4VHR1TzBOWjYzCmRUNnNLYm5odG45aUFqVkhscUF5RFQvTDE1R3oyT0dPaG1FQ3JSMWxDbHQ4K1UvM1RMbEVFMEdaeElYU09xU3UKTnpaWWFSbHYrV0pMYm5aK1RDVGxZVFRWaWFtcm41Tnkxcm53QlNXRzFpUGZxM2FHdnpBN0c2Q2Juc3VDbGhjWQpHVlE4QjREUkMzMFlPdXpFSmxkVm83Ym9EYXhLcXc3ZXlBdVZRaExSRDQxNHFpdG1PSzZsSE53VWEyRmE3eEVOCmIxd3gxNWRFVHZrMm1ROVZLaU9RcEUyaEZHOTRISkhwbG5HcXRMWGordHRuVlAvemlweW9lcThsRE5Yd0ZqengKSkdTWlFNRTd5dlpzdjQ4UGNDSXF5UjI2QTRuU0puWDdZb2FDL3dJREFRQUJBb0lCQUZCTTFxMnVGTDVRR3k3dApDTFdvbkZyNVZPUXFDUzZ3cllVa1h2N3pLVDZLNGZyRnl0amtsNXZpeWRBaHZ3ZlJYWUtncDdzWXN2RkVrOXdICmoxWDNML3ZWbWpJOWwzeE96emRSQkRXQURQVjVQTVcxN1p4NVlINmdyU1p3cHgwR2FjZkVsS2tUa2srTmI3bnEKQXJPRHFkTnB3UFlqdnM1amZWYS85NS95WkdwSHYwMWJTajQvejZlL1RKS0NFaXVhZys5Z2JTbWswS2k4MWxzYgpIMEp3ZEZPWXpBUHkrQTFScUZPdHVyTnNRclRqZ1ZMWTBvSUliSkVDcHdDQitWZDJaNDVsYWtoREtTUWZ3dkFPCjVuTVJucEZ3S29Kb0NiSE9yUUpIbmJnOHJsVVV5Y3Jqb0xaYTliOUxRZlMvMk54Ti9YNTBsV3JNWk1LWGxVbGIKMkU5bGJSa0NnWUVBNHhaZDNnWU9Sc3dHQTJjVk1vK0YrdERoTkY4UUdmeVVDWkZxRDRZMVRR=

Настройте авторизацию kubernetes

# создаем каталог с конфигурацией
mkdir ~/.kube && \
chmod -R 0700 ~/.kube && \
cd ~/.kube

# сохраняем файл 
cat <<EOF | tee ~/.kube/config
apiVersion: v1
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJUkMwZFZrYXhBTE13RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBeE1UZ3hOekUzTkRoYUZ3MHpOREF4TVRVeE56SXlORGhhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURRK0FxbVlpT2dJZnJhQ3NocXJOZ2hGQVA2dWtKSG1idjhpTGQzeDIvcXBGVENacDFldCtmTW9QMmcKSDluaXloRm00NjNTbXZzS0JCRml2Um5YbGpLOE9EMmM2U2E1NkVndEQzY3dmR0hsLzczTFQzQUZVeE5vL2RsLwo5dkNnNWQvbG5Ya3VqUVJmRmVQZHJUc3AyMU5YOGc2a25WbmRYaFlidExJNmVpbUF0SE92L1dCYndmbU9HZllBCkovdCt6Y3c2eG11OGFrcGFTeFN0ZWxlUGxSSG5XWnJ2U0w2LzJ1a094aHZFVnpJbFAxQy9yMGcvblhUZjVIcWUKSU9pSFM3TGRKVWxrUW5HblNVRDJ2cWJYOUV5S0tJMWV5dS83NHBiaE1qdE9HdFVDMHQxUUhRM0JWaWx6dXZTTwp0TTg2U1JBeVR4aURud2tyYmYrUmEzQ3BiRmNkQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL
    server: https://127.0.0.1:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJR04ydFhtNkEzc2N3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBeE1UZ3hOekUzTkRoYUZ3MHlOVEF4TVRjeE56SXlORGxhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcy9rekkKOWxudHRtRVdQa2xhWWVMYzZnc2pOWENQV0JFM1QvenVYeE8yNDdRMW5yZDFQcXdwdWVHMmYySUNOVWVXb0RJTgpQOHZYa2JQWTRZNkdZUUt0SFdVS1czejVUL2RNdVVRVFFabkVoZEk2cEs0M05saHBHVy81WWt0dWRuNU1KT1ZoCk5OV0pxYXVmazNMV3VmQUZKWWJXSTkrcmRvYS9NRHNib0p1ZXk0S1dGeGdaVkR3SGdORUxmUmc2N01RbVYxV2oKdHVnTnJFcXJEdDdJQzVWQ0V0RVBqWGlxSzJZNHJxVWMzQlJyWVZydkVRMXZYREhYbDBSTytUYVpEMVVxSTVDawpUYUVVYjNnY2tlbVdjYXEwdGVQNjIyZFUvL09LbktoNnJ5VU0xZkFXUFBFa1pKbEF3VHZLOW15L2p3OXdJaXJKCkhib0RpZEltZGZ0aWhvTC9BZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkg4Y1pPR3lyNlRsSk0wWgprTTZtS2grS2ZpRGtNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUE5SVduWENrY0lraGFSODlxV1VH
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBclA1TXlQWlo3YlpoRmo1SldtSGkzT29MSXpWd2oxZ1JOMC84N2w4VHR1TzBOWjYzCmRUNnNLYm5odG45aUFqVkhscUF5RFQvTDE1R3oyT0dPaG1FQ3JSMWxDbHQ4K1UvM1RMbEVFMEdaeElYU09xU3UKTnpaWWFSbHYrV0pMYm5aK1RDVGxZVFRWaWFtcm41Tnkxcm53QlNXRzFpUGZxM2FHdnpBN0c2Q2Juc3VDbGhjWQpHVlE4QjREUkMzMFlPdXpFSmxkVm83Ym9EYXhLcXc3ZXlBdVZRaExSRDQxNHFpdG1PSzZsSE53VWEyRmE3eEVOCmIxd3gxNWRFVHZrMm1ROVZLaU9RcEUyaEZHOTRISkhwbG5HcXRMWGordHRuVlAvemlweW9lcThsRE5Yd0ZqengKSkdTWlFNRTd5dlpzdjQ4UGNDSXF5UjI2QTRuU0puWDdZb2FDL3dJREFRQUJBb0lCQUZCTTFxMnVGTDVRR3k3dApDTFdvbkZyNVZPUXFDUzZ3cllVa1h2N3pLVDZLNGZyRnl0amtsNXZpeWRBaHZ3ZlJYWUtncDdzWXN2RkVrOXdICmoxWDNML3ZWbWpJOWwzeE96emRSQkRXQURQVjVQTVcxN1p4NVlINmdyU1p3cHgwR2FjZkVsS2tUa2srTmI3bnEKQXJPRHFkTnB3UFlqdnM1amZWYS85NS95WkdwSHYwMWJTajQvejZlL1RKS0NFaXVhZys5Z2JTbWswS2k4MWxzYgpIMEp3ZEZPWXpBUHkrQTFScUZPdHVyTnNRclRqZ1ZMWTBvSUliSkVDcHdDQitWZDJaNDVsYWtoREtTUWZ3dkFPCjVuTVJucEZ3S29Kb0NiSE9yUUpIbmJnOHJsVVV5Y3Jqb0xaYTliOUxRZlMvMk54Ti9YNTBsV3JNWk1LWGxVbGIKMkU5bGJSa0NnWUVBNHhaZDNnWU9Sc3dHQTJjVk1vK0YrdERoTkY4UUdmeVVDWkZxRDRZMVRR=
EOF

Проверяем доступ

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

Установка утилиты Nscli#

Nscli автоматизирует работу по развертыванию кластера Global.

Установка:

#Скачиваем из репозитория
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

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

Совет

В закрытой среде требуется установить все пакеты, указанные в скрипте ~/nscli/bin/installpkg.sh вручную

Перейдите в каталог с утилитой и выполняем первичную установку

cd ~/nscli
# выполняем скрипты установки
./bin/install.sh

Jump хост готов к работе.

Настройка рабочего пространства в kubernetes#

Для настройки подключаемся по ssh к jump хосту

Перейдите в каталог с утилитой

cd ~/nscli

Запустите мастер создания манифеста рабочего пространства

./namespace.sh create_install_scripts

В режиме диалога введите параметры рабочего пространства:

  • Имя рабочего пространства - имя воркспейса, который будет создан в kubernetes

  • Адрес докер регистра - адрес ресурса с хранилищем образов (Публичный докер регистр Global: dockerhub.global-system.ru)

  • Имя файла для хранения мастер ключа - полный путь с именем файла, в котором будет храниться мастер ключ для шифрования паролей

  • Пользователь для авторизации докера - имя пользователя для авторизации, при анонимном доступе поле можно оставить пустым.

  • Пароль для авторизации докера - пароль для авторизации в регистре (вводится два раза)

  • Тип репозитория - тип репозитория, по умолчанию nfs

  • Имя сервера nfs - указываем ip адрес или доменное имя заранее настроенного NFS сервеа

  • Путь - путь для подключения тома

Пример работы мастера создания манифеста:

k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh create_install_scripts
Введите имя рабочего пространства:gs-cluster-k8s
Введите адрес докер регистра:dockerhub.global-system.ru
Для безопасного хранения паролей необходимо сгенерировать приватный ключ.
Укажите имя файла для хранения мастер ключа:/home/k8sadmin/.gs-ctk.priv
Введите пользователя для авторизации докера:userk8s
Введите пароль для авторизации докера:**********
Введите пароль для авторизации докера:**********
Выберите тип репозитория:nfs
Необходимо задать параметры для Network File System
Введите имя сервера:0.0.0.0
Введите путь:/mnt/nfs/gs-cluster-k8s
k8sadmin@k8s-terminal02:~/nscli$

Разрешите запуск скрипта установки рабочего пространства

chmod +x ~/nscli/workspace/install_scripts/gs-cluster-k8s/install.sh

Создайте рабочее пространство

~/nscli/workspace/install_scripts/gs-cluster-k8s/install.sh

После выполнения скрипта будет создано рабочее пространство и будет запущен под управления кластером nsctl

namespace/gs-cluster-k8s created
secret/docker-registry-secret created
configmap/values created
role.rbac.authorization.k8s.io/worker created
rolebinding.rbac.authorization.k8s.io/worker-pods created
deployment.apps/nsctl created

Подготовка комплекта приложений appkit#

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

  • Дистрибутив сервера приложений globalserver.zip

  • Образ прикладного решения applib.zip

  • Конфигурация сервера приложений

  • Конфигурация менеджера заданий

  • Конфигурация балансировщика haproxy

Для создания комплекта приложений используйте каталог ~/nscli/workspace/appkit/v1

mkdir -p ~/nscli/workspace/appkit/v1/

Подготовте и загрузите в каталог дистрибутивы и конфигурационные файлы.

Подготовте комплект приложений для работы

./appkit.sh push --namespace gs-cluster-k8s --source workspace/appkit/v1 --destination appkits/v1

Утилита автоматически упакует комплект приложений и создаст контрольные суммы

Загружен файл:globalserver.zip
Загружен файл:profile.zip
Загружен файл:applib.zip

Работа с постоянными томами#

Данные в кластере Kubernetes могут храниться несколькими способами: непосредственно в контейнере или на томах (volumes). При хранении данных в контейнере возникают проблемы:

  • При сбое или остановке контейнера данные теряются.

  • Данные контейнера недоступны для других контейнеров, даже если все контейнеры находятся в одном поде.

Чтобы решить эти проблемы, используются тома Kubernetes. Тома имеют разный жизненный цикл в зависимости от сценария использования:

  • У временных томов (ephemeral volume, EV) жизненный цикл совпадает с жизненным циклом пода. Когда под, использующий такой том, прекращает свое существование, том тоже удаляется. Временные тома могут использоваться только одним подом, поэтому объявление томов происходит непосредственно в манифесте пода.

  • У постоянных томов (persistent volume, PV) свой жизненный цикл, не зависящий от жизненного цикла пода. Благодаря разделению жизненных циклов такие тома можно переиспользовать позднее с другими подами. Для работы с постоянными томами поды и другие рабочие нагрузки используют Persistent Volume Claim (PVC).

Кластеру Глобал ERP потребуется постоянный том для хранения метрик.

Kubernetes поддерживает разные типы хранилищ, ниже представлен пример хранилища на основе локального каталога.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-50
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/disk1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-worker01
cat <<EOF | tee ~/nscli/workspace/local-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-50
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/disk1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-worker01
EOF
kubectl apply -f ~/nscli/workspace/local-pv.yaml

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

Секреты используются для безопасного хранения учетных данных

  • Создайте секрет для доступа к статистике haproxy

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-haproxy-auth
      namespace: gs-cluster-k8s
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: t0p-Secret
    
    cat <<EOF | tee ~/nscli/workspace/haproxy-sercret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-haproxy-auth
      namespace: gs-cluster-k8s
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: t0p-Secret
    EOF
    
    kubectl apply -f ~/nscli/workspace/haproxy-sercret.yaml
    
  • Создайте секрет с admin аккаунтом globalserver-а

    apiVersion: v1
    kind: Secret
    metadata:
      name: gs-admin-auth
      namespace: gs-cluster-k8s
    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-cluster-k8s
    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-cluster-k8s
    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-cluster-k8s
    type: kubernetes.io/basic-auth
    stringData:
      username: <username>
      password: <password>
    EOF
    
    kubectl apply -f ~/nscli/workspace/db-user-secret.yaml
    
  • Создайте секрет с токеном планировщика, заменив значение шаблона <key> на корректное

    apiVersion: v1
    kind: Secret
    metadata:
      name: scheduler-token-secret
      namespace: gs-cluster-k8s
    data:
      private.key: <key>
    
    cat <<EOF | tee ~/nscli/workspace/scheduler-token-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: scheduler-token-secret
      namespace: gs-cluster-k8s
    data:
      private.key: <key>
    EOF
    
    kubectl apply -f ~/nscli/workspace/scheduler-token-secret.yaml
    

Сервис аккаунт для получения метрик cAdvisor#

  • Создайте сервис аккаунт

    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: prometheus-cadvisor
    namespace: gs-cluster-k8s
    
    cat <<EOF | tee ~/nscli/workspace/cadvisor-sa.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: prometheus-cadvisor
    namespace: gs-cluster-k8s
    EOF
    
    kubectl apply -f ~/nscli/workspace/cadvisor-sa.yaml
    
  • Создайте роль

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: prometheus-cadvisor
    rules:
    - apiGroups: [""]
      resources:
      - nodes
      - nodes/proxy
      - services
      - endpoints
      - pods
      verbs: ["get", "list", "watch"]
    - apiGroups:
      - extensions
      resources:
      - ingresses
      verbs: ["get", "list", "watch"]
    - nonResourceURLs: ["/metrics"]
      verbs: ["get"]
    
    cat <<EOF | tee ~/nscli/workspace/cadvisor-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: prometheus-cadvisor
    rules:
    - apiGroups: [""]
      resources:
      - nodes
      - nodes/proxy
      - services
      - endpoints
      - pods
      verbs: ["get", "list", "watch"]
    - apiGroups:
      - extensions
      resources:
      - ingresses
      verbs: ["get", "list", "watch"]
    - nonResourceURLs: ["/metrics"]
      verbs: ["get"]                                
    EOF
    
    kubectl apply -f ~/nscli/workspace/cadvisor-role.yaml
    
  • Создайте биндинг роли

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: prometheus-cadvisor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: prometheus-cadvisor
    subjects:
    - kind: ServiceAccount
      name: prometheus-cadvisor
      namespace: gs-cluster-k8s
    
    cat <<EOF | tee ~/nscli/workspace/cadvisor-role-binding.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: prometheus-cadvisor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: prometheus-cadvisor
    subjects:
    - kind: ServiceAccount
      name: prometheus-cadvisor
      namespace: gs-cluster-k8s
    EOF
    
    kubectl apply -f ~/nscli/workspace/cadvisor-role-binding.yaml
    

Настройка параметров кластера#

Параметры кластера настраиваются с помощью пода nsctl

Для настройки нужно подключится к поду nsctl, который был запущен при создании рабочего пространства.

Получите список подов рабочего простнанства

kubectl get pods --namespace gs-cluster-k8s
NAME                     READY   STATUS    RESTARTS   AGE
nsctl-7f97cb6df4-8kjkc   1/1     Running   0          57m

Получите доступ по ssh в под nsctl

kubectl -n gs-cluster-k8s exec -it nsctl-7f97cb6df4-8kjkc -- /bin/bash

Выполните первоначальную настройку

# создаем группу
./resgroup.sh create --name gs-cluster-1 
# указываем актуальный appkit
./resgroup.sh switch_appkit --name gs-cluster-1 --path appkits/v1
# создаем эксклюзивный экземпляр
./resbook.sh create --name global-server-excl --group gs-cluster-1 --class_name global_server_excl
# создаем клонируемые экземпляры
./resbook.sh create --name global-server-share --group gs-cluster-1 --class_name global_server_share
#экземпляр шедулера
./resbook.sh create --name global-scheduler --group gs-cluster-1 --class_name global_scheduler
# ресурсы балансировщика и мониторинга
./resbook.sh create --name haproxy --group gs-cluster-1 --class_name haproxy
./resbook.sh create --name grafana --group gs-cluster-1 --class_name grafana

Сконфигурируйте характеристики

./resgroup.sh init_spec --name gs-cluster-1

Введите необходимые характеристики или оставте значения по умолчанию

Инициализация характеристик для группы ресурсов gs-cluster-1
Установка характеристик для книги ресурсов:global-scheduler
Отслеживать метрики:true
Введите максимальный размер(java -Xmx) для globalscheduler:800M
Введите запрос CPU для globalscheduler:1
Введите запрос MEMORY для globalscheduler:1G
Введите лимиты CPU для globalscheduler:4
Введите лимиты MEMORY для globalscheduler:1G
Введите запрос CPU для systemagent:1
Введите запрос MEMORY для systemagent:250M
Введите лимиты CPU для systemagent:1
Введите лимиты MEMORY для systemagent:500M
Установка характеристик для книги ресурсов:global-server-excl
Отслеживать метрики:true
Введите максимальный размер(java -Xmx) для globalserver:3500M
Введите запрос CPU для globalserver:2
Введите запрос MEMORY для globalserver:4G
Введите лимиты CPU для globalserver:4
Введите лимиты MEMORY для globalserver:4G
Введите запрос CPU для systemagent:1
Введите запрос MEMORY для systemagent:250M
Введите лимиты CPU для systemagent:1
Введите лимиты MEMORY для systemagent:500M
Установка характеристик для книги ресурсов:global-server-share
Отслеживать метрики:true
Введите максимальный размер(java -Xmx) для globalserver:3500M
Введите запрос CPU для globalserver:2
Введите запрос MEMORY для globalserver:4G
Введите лимиты CPU для globalserver:4
Введите лимиты MEMORY для globalserver:4G
Введите запрос CPU для systemagent:1
Введите запрос MEMORY для systemagent:250M
Введите лимиты CPU для systemagent:1
Введите лимиты MEMORY для systemagent:500M
Установка характеристик для книги ресурсов:grafana
Введите запрос CPU для grafana:1
Введите запрос MEMORY для grafana:500M
Введите лимиты CPU для grafana:4
Введите лимиты MEMORY для grafana:4Gi
Установка характеристик для книги ресурсов:haproxy
Введите запрос CPU для haproxy:1
Введите запрос MEMORY для haproxy:500M
Введите лимиты CPU для haproxy:2
Введите лимиты MEMORY для haproxy:1G

Сконфигурируйте параметры кластера

./resgroup.sh init_values --name gs-cluster-1
Инициализация значений для группы ресурсов gs-cluster-1
Введите url базы данных:jdbc:postgresql://pgProject2:5432/nordsy
Введите тип прикладного хранилища:nfs
Введите адрес сервера(server):127.0.0.1
Введите путь(path):/mnt/nfs/gs-cluster-k8s/globalfilestorage
Установка значений для книги ресурсов:global-scheduler
Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
Установка значений для книги ресурсов:global-server-excl
Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
Введите внешний ip(external_ip):127.0.0.1
Установка значений для книги ресурсов:global-server-share
Введите количество экземпляров:3
Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
Установка значений для книги ресурсов:grafana
Введите внешний ip(external_ip):127.0.0.1
Введите класс хранилища:local-storage
Введите размер хранилища:5Gi
Установка значений для книги ресурсов:haproxy
Введите внешний ip(external_ip):127.0.0.1
Введите внешний порт(external_port):8080
Введите имя секрета basic-auth для авторизации статистики:secret-haproxy-auth
Введите имя tls секрета для доступа по https:

Запустите кластер

./resgroup.sh start_appkit --name gs-cluster-1
./resbook.sh enable_all --group gs-cluster-1
./resgroup.sh enable --name gs-cluster-1