เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ Gitlab CI เปเบฅเบฐเบ„เบนเปˆเบกเบท GitOps เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰ Canary deployment เปƒเบ™ Kubernetes

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบšเบปเบ”เบ„เบงเบฒเบกเบˆเบฒเบเบŠเบธเบ”เบ™เบตเป‰:

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบœเปˆเบฒเบ™ GitOps เปเบฅเบฐเบชเป‰เบฒเบ‡/เปเบเป‰เป„เบ‚เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ Kubernetes เบซเบผเบฑเบ. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒ เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เปƒเบ™ Kubernetes Canary, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบ‚เบถเป‰เบ™, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰.


เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

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

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary

เบ”เป‰เบงเบเบเบธเบ”เบ—เบฐเบชเบฒเบ” Canary, เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปเบกเปˆเบ™เปƒเบŠเป‰เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบเบธเปˆเบกเบเปˆเบญเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก, เบ‚เปเป‰เบกเบนเบ™เบšเบฑเบ™เบ—เบถเบ, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ”เป‰เบงเบเบกเบท, เบซเบผเบทเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบญเบทเปˆเบ™เป†, เบเบฒเบ™เบ›เปˆเบญเบเป„เบ”เป‰เบ–เบทเบเบ—เบปเบ”เบชเบญเบšเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ›เปˆเบญเบเบญเบญเบเบกเบฒเปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Kubernetes (เบเบฒเบ™เบญเบฑเบšเป€เบ”เบ”เปเบšเบšเบกเป‰เบงเบ™)

เบเบธเบ”เบ—เบฐเบชเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบš Kubernetes Deployment เปเบกเปˆเบ™ rolling-update, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™ pods เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เป„เบ”เป‰เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเบ”เป‰เบงเบเบฎเบนเบšเบžเบฒเบšเบฎเบธเปˆเบ™เปƒเบซเบกเปˆ. เบ–เป‰เบฒเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒ, เบเบฑเบเบ—เบตเปˆเบกเบตเบฎเบนเบšเบžเบฒเบšเป€เบเบปเปˆเบฒเบ–เบทเบเบขเบธเบ”เป€เบŠเบปเบฒ, เปเบฅเบฐเบเบฑเบเปƒเบซเบกเปˆเบเปเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™.

GitOps

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ GitOps เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒ:

  • เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Git เป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เบ”เบฝเบงเบ‚เบญเบ‡เบ„เบงเบฒเบกเบˆเบดเบ‡
  • เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ Git Operations เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ (เบšเปเปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡เบญเบทเปˆเบ™เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบ git tag / merge เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™)

เบ•เบปเบงเบขเปˆเบฒเบ‡:

เบ‚เปเปƒเบซเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบต - เบกเบตเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™.

เบ„เบฑเบ‡โ€‹เป€เบเบฑเบšโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹

เบ™เบตเป‰เปเบกเปˆเบ™ API Python+Flask เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบชเบปเปˆเบ‡เบœเบปเบ™เบ•เบญเบšเปเบ—เบ™เป€เบ›เบฑเบ™ JSON. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡เบŠเบธเบ”เบœเปˆเบฒเบ™ GitlabCI เปเบฅเบฐเบŠเบธเบเบ”เบฑเบ™เปƒเบซเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป„เบ›เบซเบฒ Gitlab Registry. เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบกเบตโ€‹เบชเบญเบ‡โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบญเบญเบโ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™โ€‹:

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

เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบžเบฝเบ‡เปเบ•เปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เป„เบŸเบฅเปŒ JSON เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ™เบตเป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบขเปˆเบฒเบ‡โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบงเปˆเบฒโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเปเบฒโ€‹เบฅเบฑเบ‡โ€‹เบชเบทเปˆโ€‹เบชเบฒเบ™โ€‹เบเบฑเบšโ€‹.

เบ„เบฑเบ‡โ€‹เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™โ€‹เป‚เบ„เบ‡โ€‹เบฅเปˆเบฒเบ‡โ€‹

เปƒเบ™ turnip เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบœเปˆเบฒเบ™ 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, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบ config เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ kubectl เบเบฑเบšเบเบธเปˆเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบงเบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบก (Gcloud) right here.

เบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡ Yaml

เปƒเบ™เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบšเปเบฅเบดเบเบฒเบ™:

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 เบšเปเปˆเบกเบต replicas เปƒเบ”เบเปเบฒเบ™เบปเบ”เป€เบ—เบทเปˆเบญ.

เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เปเปˆ GitlabCI เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปƒเบ™เบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™ kubectl เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เบญเบญเบโ€‹เปเบšเบšโ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡ app deployment with 10 replicas and app-canary with 0. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบต LoadBalancer เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™. curl เบœเปˆเบฒเบ™ IP เบžเบฒเบเบ™เบญเบ:

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

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเบ„เบทเบ™เบกเบฒ "v1".

เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ Canaryโ€‹

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 1: เบ›เปˆเบญเบเป€เบงเบตเบŠเบฑเบ™เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบšเบฒเบ‡เบ„เบปเบ™

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบˆเปเบฒเบ™เบงเบ™ replicas เป€เบ›เบฑเบ™ 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 เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡ replicas เบเบฑเบš 9โ€‹:

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

เบžเบงเบเป€เบฎเบปเบฒเบเบนเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ›เบซเบฒเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ (เบœเปˆเบฒเบ™ GitlabCI) เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ—เบฑเบ‡เบชเบญเบ‡เบกเบตเบ•เบปเบงเป€เบฅเบทเบญเบ app. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบธเปˆเบกเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡ Kubernetes, เบžเบงเบเป€เบฎเบปเบฒเบ„เบงเบ™เบˆเบฐเป€เบซเบฑเบ™เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบš ~10% เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เบชเบฐเบ–เบฒเบ™เบฐเบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (GitOps, เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบ Git เป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เบ„เบงเบฒเบกเบˆเบดเบ‡เบ”เบฝเบง) เปเบกเปˆเบ™เบเบฒเบ™เบกเบตเบชเบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบกเบต replicas เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฐเบšเบฑเบš.

~10% เบ‚เบญเบ‡โ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบเบฒเบโ€‹เป€เบ›เบฑเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบ„เบธเป‰เบ™โ€‹เป€เบ„เบตเบโ€‹เบเบฑเบšโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เปƒเบซเบกเปˆโ€‹เปเบฅเบฐโ€‹เบšเปเปˆโ€‹เบ•เบฑเป‰เบ‡โ€‹เปƒเบˆโ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบกเบฑเบ™โ€‹. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบšเบฑเบ™เบ—เบถเบเปเบฅเบฐเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ‚เปเป‰เบกเบนเบ™เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบšเบฑเบ™เบซเบฒ.

เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบต 2โ€‹: เบ›เปˆเบญเบโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เปƒเบซเบกเปˆโ€‹เบเบฑเบšโ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบ•เบฑเบ”โ€‹เบชเบดเบ™โ€‹เปƒเบˆโ€‹เบงเปˆเบฒโ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เบ”เป‰เบงเบโ€‹เบ”เบตโ€‹เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบญเบญเบโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เปƒเบซเบกเปˆโ€‹เปƒเบซเป‰โ€‹เบœเบนเป‰โ€‹เบŠเบปเบกโ€‹เปƒเบŠเป‰โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ›เบฑเบšเบ›เบธเบ‡ deploy.yaml เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ replicas เป€เบ—เบปเปˆเบฒเบเบฑเบš 10. เปƒเบ™ deploy-canary.yaml เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ replicas เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ 0. เบซเบผเบฑเบ‡เบˆเบฒเบ deployment, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #1: Gitlab CI

เป€เบžเบทเปˆเบญเบชเบฐเบซเบผเบธเบš

เบชเบณ เบฅเบฑเบšเบ‚เป‰เบญเบ, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฒเบ™ เบ™เบณ เปƒเบŠเป‰เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป‰เบ‡เปˆเบฒเบเป‚เบ”เบเปƒเบŠเป‰ k8s. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ Kubernetes เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบญเบฑเบšเป€เบ”เบ”เบ—เบธเบเบขเปˆเบฒเบ‡เบœเปˆเบฒเบ™ API, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบœเปˆเบฒเบ™เบชเบฐเบ„เบฃเบดเบš.

เบชเบดเปˆเบ‡เบญเบทเปˆเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบกเปˆเบ™เบˆเบธเบ”เป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš (LoadBalancer เบซเบผเบทเบœเปˆเบฒเบ™ Ingress) เป‚เบ”เบเบœเปˆเบฒเบ™เบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบŠเบญเบเบซเบฒเบ„เบนเปˆเบกเบท.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฎเบฑเบ”.

เบญเปˆเบฒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบญเบทเปˆเบ™เป†เปƒเบ™ blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™