Непрерывное развертывание с помощью GitLab и Kubernetes

Если у вас есть веб-приложение с соответствующим файлом Dockerfile, теперь вы можете перейти к следующему шагу и использовать GitLab для автоматического развертывания вашего приложения в кластере kubernetes. Вот как…

Для этого поста в блоге вам понадобится:

  • ваш исходный код и файл Dockerfile размещены в проекте GitLab
  • бегун GitLab с исполнителем docker-in-docker
  • доступ к кластеру kubernetes

Процесс на самом деле состоит из 2 этапов:

  1. создайте образ Docker и перейдите во встроенный реестр Docker в GitLab
  2. используйте kubectl apply для развертывания новой версии

1. Сборка

Если ваш Dockerfile готов, создание образа — это просто вопрос запуска docker build ...и docker push .... Однако есть еще несколько хитростей:

  • мы будем использовать push для встроенного реестра Docker в GitLab;
  • мы будем использовать предопределенные переменные среды GitLab, чтобы получить соответствующий логин, пароль, имя изображения и т.д.;
  • нам нужен docker-in-docker runner, имидж и сервис.

Итак, ваш .gitlab-ci.yml должен выглядеть так:

stages:
  - test
  - build
  - deploy

build:
  stage: build
  # this job requires docker-in-docker
  tags:
    - dind
  image: docker:19.03.12
  services:
    - docker:19.03.12-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA --tag $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

После завершения этапа сборки ваше изображение должно появиться в реестре контейнеров GitLab:

2. Развертывание

Чтобы выполнить развертывание, мы должны добавить задание развертывания, которое

  • создает соответствующий файл deploy.yml
  • запускает развертывание: kubectl apply -f deploy.yml

Но сначала мы должны обеспечить, чтобы:

  • бегун GitLab может получить доступ к кластеру kubernetes
  • кластеру kubernetes разрешено извлекать изображение из нашего частного реестра GitLab

a. Доступ GitLab к kubernetes

Чтобы предоставить GitLab доступ к вашему кластеру kubernetes, используйте kubectl для создания учетной записи службы (SA):

kubectl create sa gitlab

В настоящее время этой учетной записи разрешен вход в систему, но у нее нет абсолютно никаких других прав. Это довольно бесполезно! Итак, мы должны определить роль, например, в файле с именем role-deployer.yaml:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: deployer
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["services", "deployments", "replicasets", "pods", "configmap"]
  verbs: ["*"]

В этом примере роль называется deployer и определяется в пространстве имен по умолчанию. Очевидно, что вы должны адаптироваться к своим настройкам.

To apply this configuration:

kubectl apply -f role-deployer.yaml

Now we have to bind this role to our gitlab account, using another file called rolebinding-gitlab-deployer.yaml:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab-deployer
  namespace: default
subjects:
- kind: User
  name: system:serviceaccount:default:gitlab
  apiGroup: ""
roleRef:
  kind: Role
  name: deployer
  apiGroup: ""

And once again we apply the configuration:

kubectl apply -f rolebinding-gitlab-deployer.yaml

Now we have to extract the token that kubernetes created for the gitlab account:

kubectl get sa gitlab -o yaml
kubectl get secret gitlab-token-??? -o yaml | grep token:

Наконец, в GitLab мы определяем 2 переменные вSettings > CI / CD / Variables:

  • K8S_TOKEN с помощью токена, который мы только что извлекли
  • K8S_SERVER с адресом сервера API kubernetes (https://kube.example.com:6443)

б. Доступ Kubernetes к GitLab

Чтобы разрешить доступ из Kubernetes к реестру GitLab, перейдите Personal menu > Settings > Access Tokensи создайте токен личного доступа с областью apiдействия .

Then, back on kubernetes, use kubectl to create a PullSecret called gitlab-token:

kubectl create secret docker-registry gitlab-token 
  --docker-server=<gitlab.server:port>
  --docker-username=<gitlab-token-name> 
  --docker-password=<gitlab-token>

c. deploy job

We can add the deploy job to .gitlab-ci.yml:

deploy:
  stage: deploy
  image: cylab/kubectl
  before_script:
    # create the configuration (context) for our kubernetes cluster
    - kubectl config set-cluster deploy-cluster --server="$K8S_SERVER" --insecure-skip-tls-verify
    - kubectl config set-credentials gitlab --token=$(echo $K8S_TOKEN | base64 -d)
    - kubectl config set-context deploy-cluster --cluster=deploy-cluster --namespace=default --user=gitlab
    - kubectl config use-context deploy-cluster
  script:
    - envsubst < deploy.tmpl > deploy.yaml
    - kubectl apply -f deploy.yaml

Как вы можете видеть:

  • before_scriptраздел использует переменные $K8S_SERVERи $K8S_TOKENдля создания соответствующего контекста kubectl
  • scriptраздел использует envsubstкоманду и deploy.tmplшаблон для создания соответствующего deploy.yaml

Вот пример deploy.tmpl, который вы, очевидно, должны настроить для своего приложения. Он содержит один контейнер и 4 реплики, он использует gitlab-token PullSecret и имеет службу NodePort для предоставления приложения:

apiVersion: v1
kind: Service
metadata:
  name: hello-svc
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
    protocol: TCP
  selector:
    app: hello-app

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: hello-app
  minReadySeconds: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: hello-app
    spec:
      containers:
      - name: hello-pod
        image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: gitlab-token

Наконец-то

Если все пойдет хорошо, при следующем нажатии на ваш репозиторий GitLab:

  • будет создан новый образ Docker;
  • развертывание kubernetes будет обновлено для использования в новом образе Docker;
  • kubernetes создаст и обновит необходимые наборы реплик;
  • будет извлечен новый образ Docker;
  • новая версия вашего приложения появится в Сети!

Источник: https://cylab.be/blog/112/continuous-deployment-with-gitlab-and-kubernetes

Was this helpful?

0 / 0