ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ื ืฉืชืžืฉ ื‘-Gitlab CI ื•ื‘-GitOps ื™ื“ื ื™ ื›ื“ื™ ืœื™ื™ืฉื ื•ืœื”ืฉืชืžืฉ ื‘ืคืจื™ืกื” ืฉืœ Canary ื‘-Kubernetes

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ืžืืžืจื™ื ืžืกื“ืจื” ื–ื•:

ืื ื• ื ื‘ืฆืข ืืช ื”ืคืจื™ืกื” ื”ืงื ืจื™ืช ื‘ืื•ืคืŸ ื™ื“ื ื™ ื‘ืืžืฆืขื•ืช GitOps ื•ื ื™ืฆื•ืจ/ืฉื ื” ืืช ื”ืžืฉืื‘ื™ื ื”ืจืืฉื™ื™ื ืฉืœ Kubernetes. ืžืืžืจ ื–ื” ืžื™ื•ืขื“ ื‘ืขื™ืงืจ ืœื”ืงื“ืžื” ืขื ืื•ืคืŸ ืคืขื•ืœืช ื”ืคืจื™ืกื” ื‘-Kubernetes Canary, ืฉื›ืŸ ื™ืฉื ืŸ ืฉื™ื˜ื•ืช ื™ืขื™ืœื•ืช ื™ื•ืชืจ ืœืื•ื˜ื•ืžืฆื™ื”, ืื•ืชืŸ ื ืฉืงื•ืœ ื‘ืžืืžืจื™ื ื”ื‘ืื™ื.


ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

https://www.norberteder.com/canary-deployment/

ืคืจื™ืกื” ืงื ืจื™ืช

ืขื ื”ืืกื˜ืจื˜ื’ื™ื” ื”ืงื ืจื™ืช, ืขื“ื›ื•ื ื™ื ืžื•ื—ืœื™ื ืชื—ื™ืœื” ืจืง ืขืœ ืชืช-ืงื‘ื•ืฆื” ืฉืœ ืžืฉืชืžืฉื™ื. ื‘ืืžืฆืขื•ืช ื ื™ื˜ื•ืจ, ื ืชื•ื ื™ ื™ื•ืžืŸ, ื‘ื“ื™ืงื•ืช ื™ื“ื ื™ื•ืช ืื• ืขืจื•ืฆื™ ืžืฉื•ื‘ ืื—ืจื™ื, ื”ืžื”ื“ื•ืจื” ื ื‘ื“ืงืช ืœืคื ื™ ืฉื”ื™ื ืžืฉื•ื—ืจืจืช ืœื›ืœ ื”ืžืฉืชืžืฉื™ื.

ืคืจื™ืกืช Kubernetes (ืขื“ื›ื•ืŸ ืžืชื’ืœื’ืœ)

ืืกื˜ืจื˜ื’ื™ื™ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ Kubernetes Deployment ื”ื™ื ืขื“ื›ื•ืŸ ืžืชื’ืœื’ืœ, ืฉื‘ื• ืžื•ืฉืงื™ื ืžืกืคืจ ืžืกื•ื™ื ืฉืœ ืคื•ื“ื™ื ืขื ื’ืจืกืื•ืช ื—ื“ืฉื•ืช ืฉืœ ื”ืชืžื•ื ื•ืช. ืื ื”ื ื ื•ืฆืจื• ืœืœื ื‘ืขื™ื•ืช, ืคื•ื“ื™ื ืขื ื’ืจืกืื•ืช ื™ืฉื ื•ืช ืฉืœ ืชืžื•ื ื•ืช ื ืกืชื™ื™ืžื•, ื•ืชืจืžื™ืœื™ื ื—ื“ืฉื™ื ื ื•ืฆืจื™ื ื‘ืžืงื‘ื™ืœ.

GitOps

ืื ื• ืžืฉืชืžืฉื™ื ื‘-GitOps ื‘ื“ื•ื’ืžื” ื–ื• ืžื›ื™ื•ื•ืŸ ืฉืื ื•:

  • ืฉื™ืžื•ืฉ ื‘-Git ื›ืžืงื•ืจ ื™ื—ื™ื“ ืฉืœ ืืžืช
  • ืื ื• ืžืฉืชืžืฉื™ื ื‘-Git Operations ืœื‘ื ื™ื™ื” ื•ืคืจื™ืกื” (ืื™ืŸ ืฆื•ืจืš ื‘ืคืงื•ื“ื•ืช ืžืœื‘ื“ ืชื’/ืžื™ื–ื•ื’ git)

ื“ื•ื’ืžื”

ื‘ื•ื ื ื™ืงื— ืชืจื’ื•ืœ ื˜ื•ื‘ - ืฉื™ื”ื™ื” ืœื ื• ืžืื’ืจ ืื—ื“ ืขื‘ื•ืจ ืงื•ื“ ื™ื™ืฉื•ืžื™ื ื•ืื—ื“ ืขื‘ื•ืจ ืชืฉืชื™ืช.

ืžืื’ืจ ื™ื™ืฉื•ืžื™ื

ื–ื”ื• API ืคืฉื•ื˜ ืžืื•ื“ ืฉืœ Python+Flask ืฉืžื—ื–ื™ืจ ืชื’ื•ื‘ื” ื‘ืชื•ืจ JSON. ื ื‘ื ื” ืืช ื”ื—ื‘ื™ืœื” ื“ืจืš GitlabCI ื•ื ื“ื—ื•ืฃ ืืช ื”ืชื•ืฆืื” ืœ-Gitlab Registry. ื‘ืจื™ืฉื•ื ื™ืฉ ืœื ื• ืฉืชื™ ื’ืจืกืื•ืช ืžื”ื“ื•ืจื” ืฉื•ื ื•ืช:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

ื”ื”ื‘ื“ืœ ื”ื™ื—ื™ื“ ื‘ื™ื ื™ื”ื ื”ื•ื ื”ืฉื™ื ื•ื™ ื‘ืงื•ื‘ืฅ ื”-JSON ื”ืžื•ื—ื–ืจ. ืื ื• ืžืฉืชืžืฉื™ื ื‘ืืคืœื™ืงืฆื™ื” ื–ื• ื›ื“ื™ ืœื“ืžื™ื™ืŸ ื‘ืงืœื•ืช ื›ื›ืœ ื”ืืคืฉืจ ืขื ืื™ื–ื• ื’ืจืกื” ืื ื• ืžืชืงืฉืจื™ื.

ืžืื’ืจ ืชืฉืชื™ื•ืช

ื‘ืคืช ื–ื” ื ืคืจื•ืก ื“ืจืš GitlabCI ืœ-Kubernetes, .gitlab-ci.yml ื”ื•ื ื›ื“ืœืงืžืŸ:

image: traherom/kustomize-docker

before_script:
   - printenv
   - kubectl version

stages:
 - deploy

deploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s

   only:
     - master

ื›ื“ื™ ืœื”ืคืขื™ืœ ืื•ืชื• ื‘ืขืฆืžืš ืชื–ื“ืงืง ืœืืฉื›ื•ืœ, ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘-Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

ืืชื” ืฆืจื™ืš ืœื”ืชืคืฆืœ https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ื•ืœื™ืฆื•ืจ ืžืฉืชื ื” KUBECONFIG ื‘- GitlabCI, ืฉื™ื›ื™ืœ ืืช ื”ืชืฆื•ืจื” ืœื’ื™ืฉื” kubectl ืœืืฉื›ื•ืœ ืฉืœืš.

ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ื›ื™ืฆื“ ืœืงื‘ืœ ืื™ืฉื•ืจื™ื ืขื‘ื•ืจ ืืฉื›ื•ืœ (Gcloud) ื›ืืŸ.

ืชืฉืชื™ืช ื™ืžืœ

ื‘ืžืื’ืจ ื”ืชืฉืชื™ื•ืช ื™ืฉ ืœื ื• ืฉื™ืจื•ืช:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: app
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

ื•ืคืจื™ืกื” ื‘ deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: app
spec:
 replicas: 10
 selector:
   matchLabels:
     id: app
     type: main
 template:
   metadata:
     labels:
       id: app
       type: main
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

ื•ืขื•ื“ ืคืจื™ืกื” ื‘ deploy-canary.yaml:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 0
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

ืฉื™ื ืœื‘ ืฉืขื“ื™ื™ืŸ ืœื ื”ื•ื’ื“ืจื• ื”ืขืชืงื™ื ืฉืœ app-deploy.

ื‘ื™ืฆื•ืข ืคืจื™ืกื” ืจืืฉื•ื ื™ืช

ื›ื“ื™ ืœื”ืชื—ื™ืœ ืืช ื”ืคืจื™ืกื” ื”ืจืืฉื•ื ื™ืช, ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืืช ืฆื™ื ื•ืจ GitlabCI ื‘ืื•ืคืŸ ื™ื“ื ื™ ื‘ืกื ื™ืฃ ื”ืจืืฉื™. ืื—ืจื™ ื–ื” kubectl ืฆืจื™ืš ืœื”ื•ืฆื™ื ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ืื ื—ื ื• ืžื‘ื™ื ื™ื app ืคืจื™ืกื” ืขื 10 ื”ืขืชืงื™ื ื•-app-canary ืขื 0. ื™ืฉ ื’ื LoadBalancer ืฉืžืžื ื• ื ื•ื›ืœ ืœื’ืฉืช ื“ืจืš curl ื“ืจืš IP ื—ื™ืฆื•ื ื™:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ืื ื• ืจื•ืื™ื ืฉื™ื™ืฉื•ื ื”ื‘ื“ื™ืงื” ืฉืœื ื• ืžื—ื–ื™ืจ ืจืง "v1".

ื‘ื™ืฆื•ืข ืคืจื™ืกื” ืงื ืจื™ืช

ืฉืœื‘ 1: ืฉื—ืจืจ ื’ืจืกื” ื—ื“ืฉื” ืขื‘ื•ืจ ื—ืœืง ืžื”ืžืฉืชืžืฉื™ื

ื”ื’ื“ืจื ื• ืืช ืžืกืคืจ ื”ืขืชืงื™ื ืœ-1 ื‘ืงื•ื‘ืฅ deploy-canary.yaml ื•ื‘ืชืžื•ื ืช ื”ื’ืจืกื” ื”ื—ื“ืฉื”:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 1
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

ื‘ืงื•ื‘ืฅ deploy.yaml ืฉื™ื ื™ื ื• ืืช ืžืกืคืจ ื”ื”ืขืชืงื™ื ืœ-9:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

ืื ื• ื“ื•ื—ืคื™ื ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืœืœื• ืœืžืื’ืจ ืฉืžืžื ื• ืชืชื—ื™ืœ ื”ืคืจื™ืกื” (ื“ืจืš GitlabCI) ื•ืจื•ืื™ื ื›ืชื•ืฆืื” ืžื›ืš:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ื”ืฉื™ืจื•ืช ืฉืœื ื• ื™ืฆื‘ื™ืข ืขืœ ืฉืชื™ ื”ืคืจื™ืกื•ืช, ืžื›ื™ื•ื•ืŸ ืฉืœืฉืชื™ื”ืŸ ื™ืฉ ืืช ื‘ื•ืจืจ ื”ืืคืœื™ืงืฆื™ื•ืช. ืขืงื‘ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ืืงืจืื™ ืฉืœ Kubernetes, ืื ื• ืืžื•ืจื™ื ืœืจืื•ืช ืชื’ื•ื‘ื•ืช ืฉื•ื ื•ืช ืขื‘ื•ืจ ~10% ืžื”ื‘ืงืฉื•ืช:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• (GitOps, ื ืœืงื— ืž-Git as a Single Source Of Truth) ื”ื•ื ื ื•ื›ื—ื•ืช ืฉืœ ืฉืชื™ ืคืจื™ืกื•ืช ืขื ื”ืขืชืงื™ื ืคืขื™ืœื™ื, ืื—ืช ืœื›ืœ ื’ืจืกื”.

~10% ืžื”ืžืฉืชืžืฉื™ื ืžื›ื™ืจื™ื ื’ืจืกื” ื—ื“ืฉื” ื•ื‘ื•ื“ืงื™ื ืื•ืชื” ื‘ืœื™ ื›ื•ื•ื ื”. ืขื›ืฉื™ื• ื–ื” ื”ื–ืžืŸ ืœื‘ื“ื•ืง ืื ื™ืฉ ืฉื’ื™ืื•ืช ื‘ื™ื•ืžื ื™ื ื•ื‘ื ืชื•ื ื™ ื”ื ื™ื˜ื•ืจ ื›ื“ื™ ืœืžืฆื•ื ื‘ืขื™ื•ืช.

ืฉืœื‘ 2: ืฉื—ืจืจ ืืช ื”ื’ืจืกื” ื”ื—ื“ืฉื” ืœื›ืœ ื”ืžืฉืชืžืฉื™ื

ื”ื—ืœื˜ื ื• ืฉื”ื›ืœ ื‘ืกื“ืจ ื•ืขื›ืฉื™ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืคื™ืฅ ืืช ื”ื’ืจืกื” ื”ื—ื“ืฉื” ืœื›ืœ ื”ืžืฉืชืžืฉื™ื. ืœืฉื ื›ืš ืื ื• ืคืฉื•ื˜ ืžืขื“ื›ื ื™ื deploy.yaml ื”ืชืงื ืช ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ื”ืชืžื•ื ื” ื•ืžืกืคืจ ื”ืขืชืงื™ื ืฉื•ื•ื” ืœ-10. ื‘ deploy-canary.yaml ื”ื’ื“ืจื ื• ืืช ืžืกืคืจ ื”ื”ืขืชืงื™ื ื‘ื—ื–ืจื” ืœ-0. ืœืื—ืจ ื”ืคืจื™ืกื”, ื”ืชื•ืฆืื” ืชื”ื™ื” ื›ื“ืœืงืžืŸ:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #1: Gitlab CI

ื”ืกืชื›ืžื•ืช

ืขื‘ื•ืจื™, ื”ืคืขืœืช ื”ืคืจื™ืกื” ื™ื“ื ื™ืช ื‘ื“ืจืš ื–ื• ืขื•ื–ืจืช ืœื”ื‘ื™ืŸ ื‘ืื™ื–ื• ืงืœื•ืช ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืื•ืชื” ื‘ืืžืฆืขื•ืช k8s. ืžื›ื™ื•ื•ืŸ ืฉ-Kubernetes ืžืืคืฉืจืช ืœืš ืœืขื“ื›ืŸ ื”ื›ืœ ื‘ืืžืฆืขื•ืช API, ื ื™ืชืŸ ืœื”ืคื•ืš ืืช ื”ืฉืœื‘ื™ื ื”ืœืœื• ืœืื•ื˜ื•ืžื˜ื™ื™ื ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ื™ื.

ื“ื‘ืจ ื ื•ืกืฃ ืฉืฆืจื™ืš ืœื™ื™ืฉื ื”ื•ื ื ืงื•ื“ืช ื›ื ื™ืกื” ืœื‘ื•ื“ืง (LoadBalancer ืื• ื“ืจืš Ingress) ืฉื“ืจื›ื” ื ื™ืชืŸ ืœื’ืฉืช ืจืง ืœื’ืจืกื” ื”ื—ื“ืฉื”. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ืœื’ืœื™ืฉื” ื™ื“ื ื™ืช.

ื‘ืžืืžืจื™ื ืขืชื™ื“ื™ื™ื, ื ื‘ื“ื•ืง ืคืชืจื•ื ื•ืช ืื•ื˜ื•ืžื˜ื™ื™ื ืื—ืจื™ื ืฉืžื™ื™ืฉืžื™ื ืืช ืจื•ื‘ ืžื” ืฉืขืฉื™ื ื•.

ืงืจื ื’ื ืžืืžืจื™ื ืื—ืจื™ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”