Kubernetes (k8s) + Helm + GitLab CI/CD. Деплоим правильно

В данной статье я хочу рассказать как деплоить приложения в разные среды. В этом примере, мы будем деплоить в: «Test» и «Production». Разумеется, вы можете добавить любые среды.

Для деплоя приложений я использую HELM. Он позволяет гибко управлять конфигурациями. В чем вы сможете убедится ниже. Предполагается, что у вас уже есть настроенный runner с helm-ом и вы знаете и умеете работать с HELM-ом.

Пример файла: .gitlab-ci.yml

.base_deploy: &base_deploy   stage: deploy   script:   - PROJECT_NAME="${CI_PROJECT_NAME}-${CI_ENVIRONMENT_SLUG}"   - helm --namespace ${CI_ENVIRONMENT_SLUG} upgrade -i ${PROJECT_NAME} helm --set "global.env=${CI_ENVIRONMENT_SLUG}";  stages:   - deploy  Deploy to Test:   <<: *base_deploy   environment:     name: test  Deploy to Production:   <<: *base_deploy   environment:     name: production   when: manual 

Здесь стоит обратить внимание на то, что в зависимости от среды мы передаем переменную: «test» или «production».

Имя проекта мы тоже формируем с учетом имени переменной, для того, чтобы helm понимал, что это разные проекты (helm ls).

Далее, мы передаем эту переменную (среду) в HELM как: «global.env».

Для выше указанного примера helm должен находиться в одноименной папке в вашем репозиторие.

Теперь рассмотрим пример, как использовать переменную среды в Chart-ах HELM.

Создадим такой values.yaml:

replicas:   test: 1   production: 3  domain:   test: test.domain.com   production: production.domain.com  resources:   requests:     cpu:       _default: 50m       production: 50m     memory:       _default: 256Mi       production: 10Mi   limits:     memory:       _default: 1Gi       production: 1Gi     cpu:       _default: 1000m 

Здесь видно, что для разных сред мы указываем разные настройки.
Для удобства можно указывать и default-ные настройки.

Ещё один пример, для ingress.yaml:

apiVersion: extensions/v1beta1 kind: Ingress metadata:   name: {{ .Chart.Name }} spec:   rules:   - host: {{ pluck .Values.global.env .Values.domain | first | default .Values.domain._default }}     http:       paths:       - path: /         backend:           serviceName: {{ .Chart.Name }}           servicePort: 80 

Вы всегда можете проверить как собирается ваш Chart, командой:

helm template ./helm --set "global.env=test" helm template ./helm --set "global.env=production" 

Так же вы можете деплоить ваш код на разные ноды в зависимости от среды.

Пример:

{{ if eq .Values.global.env "test" }}       nodeSelector:         nodetype: testnodes {{ else if eq .Values.global.env "production" }}       nodeSelector:         nodetype: productionnodes {{ else }} 

Всем спасибо. Деплойте правильно.

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

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

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