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}"
- 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 }}
Всем спасибо. Деплойте правильно.