Интеграция Gitlab и Kubernetes для автоматизации деплоя приложений в кластер

В первом приближении по моему CV/Blog у меня все готово. Шаблоны приложений созданы, сборка приложений в докер закончена, имеются окружение для разработки и Production-окружение в личном Kubernetes-кластере. Написан Yaml-манифест развертывания приложения в кластере и CI для автоматической сборки образов в GitLab CI.

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

Настройка агента для Kubernetes

Для подключения к кластеру кубика создайте отдельный репозитарий и назовите его например k8s-connection. Создаем дефолтного агента для нашего приложения, для чего в репозитории создаем файл .gitlab/agents/default/config.yaml и пока оставляем его пустым.

В GUI GitLab переходим Operate > Kubernetes clusters > Connect a cluster (agent).

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

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

Регистрируем агента при помощи helm-chart по инструкции любезно предоставленной нам гитлабом (helm должен быть установлен на вашей рабочей станции):

$ helm repo add gitlab https://charts.gitlab.io
$ helm repo update
helm upgrade --install default gitlab/gitlab-agent \
    --namespace gitlab-agent-default \
    --create-namespace \
    --set image.tag=v16.9.0-rc1 \
    --set config.token=xxx-SECRET-TOKEN-xxx \
    --set config.kasAddress=wss://gitlab.bds.su/-/kubernetes-agent/

Проверяем что пространство имен в кластере создано:

И соответственно удостоверимся, что агент вышел на связь.

Агент готов и можно переходить к настройке проекта.

Настройка проекта для автодеплоя приложения

Дальше сущий ужас и бардак. Пока искал адекватное объяснение процесса было непреодолимое желание все сделать по своему, но раз уж эта чертова интеграция настроена будем петь и плясать от этой стены. Итак, вообще зачем нам понадобился дополнительный репозиторий описанный выше? А он выступает в качестве своеобразного Firewall где мы опиываем какие проекты, пользователи и группы могут взаимодействовать с нашим кластером. 

Мы можем разрешить доступ для:

  • Проекта
  • Группы проектов
  • Пользователя

Подробнее на официальном сайте https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html#authorize-the-agent

Минимальное содержимое файла .gitlab/agents/default/config.yaml будет выглядеть следующим образом (приминительно для моего приложения).

ci_access:
  projects:
    - id: production-services/chernousov-cv-and-blog

И пример собственно джобы для взаимодействия с кластером.

variables:
  KUBE_CONTEXT: production-services/k8s-connection:k8s-connection

deploy-prod:
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  stage: deploy-prod
  script:
    - kubectl config get-contexts
    - kubectl config use-context $KUBE_CONTEXT
    - kubectl get pods

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *