Kubernetes (k8s) + Helm + GitLab CI/CD. Деплоим правильно
Для деплоя приложений я использую 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 }}
Всем спасибо. Деплойте правильно.

