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

habr.png

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

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

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

.base_deploy: &base_deploy
  stage: deploy
  script:
  - PROJECT_NAME="${CI_PROJECT_NAME}-${CI_ENVIRONMENT_SLUG}"
  - if [[ -z $(helm ls ${PROJECT_NAME} --deployed -q) ]]; then
        helm --namespace ${CI_ENVIRONMENT_SLUG} --name ${PROJECT_NAME} install helm --set "global.env=${CI_ENVIRONMENT_SLUG}";
      else
        helm upgrade ${PROJECT_NAME} helm --set "global.env=${CI_ENVIRONMENT_SLUG}";
      fi

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 }}


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

© Habrahabr.ru