Если у вас есть веб-приложение с соответствующим файлом Dockerfile, теперь вы можете перейти к следующему шагу и использовать GitLab для автоматического развертывания вашего приложения в кластере kubernetes. Вот как…
Для этого поста в блоге вам понадобится:
- ваш исходный код и файл Dockerfile размещены в проекте GitLab
- бегун GitLab с исполнителем docker-in-docker
- доступ к кластеру kubernetes
Процесс на самом деле состоит из 2 этапов:
- создайте образ Docker и перейдите во встроенный реестр Docker в GitLab
- используйте 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
для создания соответствующего контекста kubectlscript
раздел использует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