05. Deploy приложения с помощью GitLab и Helm в MiniKube, обновляющегося при коммите или релизе

Устанавливаем динамические значения переменных в HelmChart


apps/v1/chart/guestbook/charts/frontend/templates/frontend.yaml


Прописываю:


image: webmakaka/devops-frontend:{{ .Values.image.tag }}


apps/v1/chart/guestbook/charts/backend/templates/backend.yaml


Прописываю:


image: webmakaka/devops-backend:{{ .Values.image.tag }}


Создаю файлы values.yaml

tag: “2.0” - значение по умолчанию.


chart/guestbook/charts/frontend/values.yaml

image:
  repository: webmakaka/devops-frontend
  tag: '2.0'


chart/guestbook/charts/backend/values.yaml

image:
  repository: webmakaka/devops-backend
  tag: '2.0'


Проверка генерации правильного конфига

$ helm delete myguestbook


$ export CI_COMMIT_TAG=15aee951
$ helm upgrade myguestbook -i apps/v1/chart/guestbook --reuse-values --set-string frontend.image.tag=$CI_COMMIT_TAG --set-string backend.image.tag=$CI_COMMIT_TAG --dry-run --debug


Возвращает:

***
USER-SUPPLIED VALUES:
backend:
  image:
    tag: 15aee951
frontend:
  image:
    tag: 15aee951

COMPUTED VALUES:
backend:
  global: {}
  image:
    repository: webmakaka/devops-backend
    tag: 15aee951
database:
  global: {}
frontend:
  global: {}
  image:
    repository: webmakaka/devops-frontend
    tag: 15aee951

***


Deploy с помощью GitLab в MiniKube

Наверное, можно сделать разные переменны $KUBE_CONFIG, указывающие на разные кластеры. Либо же, добавить названия dev, test, prod к сервисам и деплоить на 1 хост.

Пока буду делать deploy на 1 кластер. И каждый новый коммит будет обновлять версию проекта, заменяя в том числе релиз.


.gitlab-ci.yml


image: docker:stable

variables:
  DOCKER_TLS_CERTDIR: ''
  DOCKER_HOST: tcp://192.168.0.5:2375
  DOCKER_DRIVER: overlay2

services:
  - docker:stable-dind

before_script:
  - docker info
  - echo ${CI_REGISTRY}
  - echo ${REGISTRY_USER}
  - echo ${REGISTRY_PASSWORD} | docker login -u ${REGISTRY_USER} --password-stdin ${CI_REGISTRY}

stages:
  - build
  - release
  - deploy

backend-build:
  stage: build
  except:
    - tags
  script:
    - docker build ./apps/v1/app/backend/ -f ./apps/v1/app/backend/Dockerfile -t webmakaka/devops-backend:$CI_COMMIT_SHORT_SHA
    - docker push webmakaka/devops-backend:$CI_COMMIT_SHORT_SHA

backend-release:
  stage: release
  only:
    - tags
  script:
    - docker pull webmakaka/devops-backend:$CI_COMMIT_SHORT_SHA
    - docker tag webmakaka/devops-backend:$CI_COMMIT_SHORT_SHA webmakaka/devops-backend:$CI_COMMIT_TAG
    - docker push webmakaka/devops-backend:$CI_COMMIT_TAG

frontend-build:
  stage: build
  except:
    - tags
  script:
    - docker build ./apps/v1/app/frontend/ -f ./apps/v1/app/frontend/Dockerfile -t webmakaka/devops-frontend:$CI_COMMIT_SHORT_SHA
    - docker push webmakaka/devops-frontend:$CI_COMMIT_SHORT_SHA

frontend-release:
  stage: release
  only:
    - tags
  script:
    - docker pull webmakaka/devops-frontend:$CI_COMMIT_SHORT_SHA
    - docker tag webmakaka/devops-frontend:$CI_COMMIT_SHORT_SHA webmakaka/devops-frontend:$CI_COMMIT_TAG
    - docker push webmakaka/devops-frontend:$CI_COMMIT_TAG

deploy-app-test:
  stage: deploy
  except:
    - tags
  script:
    - apk add -U openssl curl tar gzip bash ca-certificates git
    - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv ./kubectl /usr/local/bin/
    - mkdir -p ~/.kube/ && echo $KUBE_CONFIG | base64 -d > ~/.kube/config
    - kubectl cluster-info
    - curl -L https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
    - helm upgrade myguestbook -i apps/v1/chart/guestbook --reuse-values --set-string frontend.image.tag=$CI_COMMIT_SHORT_SHA --set-string backend.image.tag=$CI_COMMIT_SHORT_SHA

deploy-app-prod:
  stage: deploy
  only:
    - tags
  script:
    - apk add -U openssl curl tar gzip bash ca-certificates git
    - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv ./kubectl /usr/local/bin/
    - mkdir -p ~/.kube/ && echo $KUBE_CONFIG | base64 -d > ~/.kube/config
    - kubectl cluster-info
    - curl -L https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
    - helm upgrade myguestbook -i apps/v1/chart/guestbook --reuse-values --set-string frontend.image.tag=$CI_COMMIT_TAG --set-string backend.image.tag=$CI_COMMIT_TAG


Провека

$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
backend-6dc6bb859f-vx9n7   1/1     Running   1          2m26s
frontend-66ddd4f57-fltvq   1/1     Running   0          2m26s
mongodb-746c86846c-rc8hw   1/1     Running   0          2m26s


$ kubectl describe pod frontend-66ddd4f57-fltvq | grep Image
    Image:          webmakaka/devops-frontend:d04d29cf
    Image ID:       docker-pullable://webmakaka/[email protected]:176c5f87fdd8e0c3f0ccf54f45490f16d3758a95bb3b51506ad07b58cf80e487


Создаю в web интерфейсе новый релиз

(Можно и в командной строке)


Application


$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
backend-867b9b9989-c98zf   1/1     Running   0          52s
frontend-6477dbbc5-zvv8z   1/1     Running   0          52s
mongodb-746c86846c-rc8hw   1/1     Running   0          5m53s


$ kubectl describe pod frontend-6477dbbc5-zvv8z | grep Image
    Image:          webmakaka/devops-frontend:0.0.11
    Image ID:       docker-pullable://webmakaka/[email protected]:176c5f87fdd8e0c3f0ccf54f45490f16d3758a95bb3b51506ad07b58cf80e487