Непрерывное развертывание с помощью 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 .... Однако есть еще несколько хитростей:







Итак, ваш .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. Развертывание




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







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







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:










б. Доступ 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




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







Вот пример 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:













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