Развертывание Accelera в k8s
Необходимые инструменты
- helm
- helmfile
- sops
- kubectl
- kustomize
- helm secrets
- docker
- helm diff
Установка инструментов
Данная установка для Ubuntu 24.04. Если будет другая ОС, то установка будет отличаться.
helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm versionhelmfile
wget https://github.com/helmfile/helmfile/releases/download/v0.171.0/helmfile_0.171.0_linux_amd64.tar.gz
tar -xvzf helmfile_0.171.0_linux_amd64.tar.gz
sudo mv helmfile /usr/local/bin/
helmfile --versionkubectl
snap install kubectl --classic
kubectl versionhelm secrets
helm plugin install https://github.com/zendesk/helm-secretsdocker
snap install dockerhelm diff
helm plugin install https://github.com/databus23/helm-diffДоп. шаги перед развертыванием
-
Установка ключей шифрования (опционально)
-
Связать докер с реестром контейнеров, например Yandex Container Registry (опционально)
docker login yc container registry configure-docker #Команда подразумевает установленной yc cli и пройденной авторизации -
Иметь в наличии образы Accelera и Helm chart
-
Иметь в наличии базовый конфиг для установки Accelera
Понимание структуры
Вся конфигурация описывается в файлах values.yaml
Допустимые значения в helm чарте развертывания Accelera
Задавать переменные окружения/значения для шаблона можно двумя способами
-
Глобально для всех сервисов, по пути
flows/accelera-t/envs.yaml #для переменных окруженияи
flows/accelera-t/values.yaml #для значений шаблона -
Для конкретного сервиса, по пути
services/<service-name>/accelera-t/envs.yaml #для переменных окружения конкретного сервисаи
services/<service-name>/accelera-t/values.yaml #для значений шаблона конкретного сервиса
При этом приоритетными станут значения для конкретного сервиса
Пример:
Указание переменных глобально
envVars:
LOGGER_LEVEL: info
NODE_ENV: production
ENABLE_METRICS: "true"
METRICS_PORT: 3010Указание переменных конкретно для сервиса
envVars:
ENABLE_METRICS: "false"
METRICS_PORT: 6040Итогом станет объект ConfigMap с таким значением
envVars:
LOGGER_LEVEL: info
NODE_ENV: production
ENABLE_METRICS: "false"
METRICS_PORT: 6040Для secret.yaml правила те же, но создается объект Kubernetes secret
Установка
Устанавливаем сервис командой
helmfile -e accelera-t -f services/<service-name>/helmfile.yaml syncВместо
syncможно использоватьtemplate(не выпускает релиз), чтобы увидеть, как значения манифестов подтянулись в развертывание, аdiff(не выпускает релиз), показывает разницу между прошлым и текущим развертыванием
-
Установку можно вынести в отдельный файл с перечислением всех сервисов
Пример:
файл
helmfile.yamlenvironments: accelera-t: helmfiles: - path: services/flows-backoffice/helmfile.yaml - path: services/flows-actions/helmfile.yaml - path: services/flows-frontend/helmfile.yaml - path: services/flows-bulk/helmfile.yaml - path: services/flows-engine/helmfile.yaml - path: services/flows-segments/helmfile.yaml - path: services/flows-timers/helmfile.yaml
Тогда командой для развертывания станет
helmfile -e accelera-t -f path/to/helmfile.yaml syncВажные замечания при развертывании
flows-backofficeиflows-segmentsдолжны иметь общий volumepersistence.accessModesдолжен бытьReadWriteMany(это правило можно опустить, если все сервисы лежат на одной ноде и развертывание сервисов требующих Persistant Volume указано в одной репликеReplicaCount)
Пример базового сценария развертывания
Подразумевается, что уже указаны все значения для envs.yaml и values.yaml
- Устанавливаем
redis(если хотим, чтоб он был в кластере рядом с Accelera)
helmfile -e accelera-t -f services/redis/helmfile.yaml syncИз вывода в консоли командой получаем redis-password, указываем его в envs.yaml
- Устанавливаем
rabbitmq(если хотим, чтоб он был в кластере рядом с Accelera)
helmfile -e accelera-t -f services/accelera-broker/helmfile.yaml syncИ указать дефолтные креды для accelera-broker (уточнять при развертывании)
- Выносим развертывания в отдельный файл helmfile.yaml
environments:
accelera-t:
helmfiles:
- path: services/flows-backoffice/helmfile.yaml
- path: services/flows-actions/helmfile.yaml
- path: services/flows-frontend/helmfile.yaml
- path: services/flows-bulk/helmfile.yaml
- path: services/flows-engine/helmfile.yaml
- path: services/flows-segments/helmfile.yaml
- path: services/flows-timers/helmfile.yaml- Запускаем развертывание
helmfile -e accelera-t -f path/to/helmfile.yaml sync- Устанавливаем ingress-nginx и cert-manager
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yamlkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.1/cert-manager.yaml- Устанавливаем ClusterIssuer
kubectl apply -f cluster-issuer.yaml- Устанавливаем IngressClass
kubect apply -f ingress-class.yaml- Устанавливаем сам ingress (перед этим нужно изменить
spec.tls.hostsиspec.rulesпод себя)
kubectl apply -f ingress.yamlip, который нужно указать при выпуске домена, можно узнать из команды
kubectl get svc --all-namespaces | grep "ingress-nginx" | grep "LoadBalancer"На выходе получается готовый redis с rabbit’ом, привязанная к ним базовая Accelera и настроенная ingress маршрутизация через https