เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‹ เช…เชฎเชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ Gitlab CI เช…เชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒ GitOps เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช† เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚เชฅเซ€ เชฒเซ‡เช–เซ‹:

เช…เชฎเซ‡ GitOps เชฆเซเชตเชพเชฐเชพ เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเช‚เชธเชพเชงเชจเซ‹ เชฌเชจเชพเชตเซ€/เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเซ€เชถเซเช‚. เช† เชฒเซ‡เช– เชฎเซเช–เซเชฏเชคเซเชตเซ‡ เชชเชฐเชฟเชšเชฏ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชพเชฏเซ‡เชฒ เช›เซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซ‡เชจเซ‡เชฐเซ€เชฎเชพเช‚ เชœเชฎเชพเชตเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซเชฏเชพเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจเชจเซ€ เชตเชงเซ เช…เชธเชฐเช•เชพเชฐเช• เชชเชฆเซเชงเชคเชฟเช“ เช›เซ‡, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเชถเซเช‚.


เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

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

เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

เช•เซ‡เชจเซ‡เชฐเซ€ เชตเซเชฏเซ‚เชนเชฐเชšเชจเชพ เชธเชพเชฅเซ‡, เช…เชชเชกเซ‡เชŸเซเชธ เชชเซเชฐเชฅเชฎ เชฎเชพเชคเซเชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเชพ เชธเชฌเชธเซ‡เชŸ เชชเชฐ เชฒเชพเช—เซ เชฅเชพเชฏ เช›เซ‡. เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—, เชฒเซ‹เช— เชกเซ‡เชŸเชพ, เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชŸเซ‡เชธเซเชŸเชฟเช‚เช— เช…เชฅเชตเชพ เช…เชจเซเชฏ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชšเซ‡เชจเชฒเซ‹ เชฆเซเชตเชพเชฐเชพ, เชฌเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชฐเชฟเชฒเซ€เช เชฅเชพเชฏ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชคเซ‡เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชœเชฎเชพเชตเชŸ (เชฐเซ‹เชฒเชฟเช‚เช— เช…เชชเชกเซ‡เชŸ)

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชฎเชพเชŸเซ‡เชจเซ€ เชกเชฟเชซเซ‹เชฒเซเชŸ เชตเซเชฏเซ‚เชนเชฐเชšเชจเชพ เชฐเซ‹เชฒเชฟเช‚เช—-เช…เชชเชกเซ‡เชŸ เช›เซ‡, เชœเซเชฏเชพเช‚ เชšเซ‹เช•เซเช•เชธ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชชเซ‹เชกเซเชธ เชˆเชฎเซ‡เชœเซ‹เชจเชพ เชจเชตเชพ เชตเชฐเซเชเชจ เชธเชพเชฅเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซ‹ เชคเซ‡เช“ เชธเชฎเชธเซเชฏเชพเช“ เชตเชฟเชจเชพ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเซ‹เชฏ, เชคเซ‹ เช›เชฌเซ€เช“เชจเชพ เชœเซ‚เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชธเชพเชฅเซ‡เชจเชพ เชถเซ€เช‚เช—เซ‹ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชจเชตเชพ เชถเซ€เช‚เช—เซ‹ เชธเชฎเชพเช‚เชคเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช—เซ€เชŸเซ‹เชชเซเชธ

เช…เชฎเซ‡ เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ GitOps เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเซ‡:

  • เชธเชคเซเชฏเชจเชพ เชเช• เชธเซเชคเซเชฐเซ‹เชค เชคเชฐเซ€เช•เซ‡ เช—เชฟเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช—
  • เช…เชฎเซ‡ เชฌเชฟเชฒเซเชก เช…เชจเซ‡ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เช—เชฟเชŸ เช‘เชชเชฐเซ‡เชถเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช (เช—เชฟเชŸ เชŸเซ…เช—/เชฎเชฐเซเชœ เชธเชฟเชตเชพเชฏเชจเชพ เช•เซ‹เชˆ เช†เชฆเซ‡เชถเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€)

เช‰เชฆเชพเชนเชฐเชฃ:

เชšเชพเชฒเซ‹ เชเช• เชธเชพเชฐเซ€ เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เช•เชฐเซ€เช - เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‹เชก เชฎเชพเชŸเซ‡ เชเช• เชญเช‚เชกเชพเชฐ เช…เชจเซ‡ เชเช• เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฎเชพเชŸเซ‡.

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชญเช‚เชกเชพเชฐ

เช† เชเช• เช–เซ‚เชฌ เชœ เชธเชฐเชณ Python+Flask API เช›เซ‡ เชœเซ‡ JSON เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเซ‡ เช›เซ‡. เช…เชฎเซ‡ GitlabCI เชฎเชพเชฐเชซเชคเซ‡ เชชเซ‡เช•เซ‡เชœ เชฌเชจเชพเชตเซ€เชถเซเช‚ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเชจเซ‡ Gitlab เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชฎเซ‹เช•เชฒเซ€เชถเซเช‚. เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฌเซ‡ เช…เชฒเช— เช…เชฒเช— เชชเซเชฐเช•เชพเชถเชจ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เช›เซ‡:

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

เชคเซ‡เชฎเชจเซ€ เชตเชšเซเชšเซ‡เชจเซ‹ เชเช• เชฎเชพเชคเซเชฐ เชคเชซเชพเชตเชค เช เชชเชฐเชค เช•เชฐเซ‡เชฒเซ€ JSON เชซเชพเช‡เชฒเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช›เซ‡. เช…เชฎเซ‡ เช† เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซ€ เชธเชฐเชณเชคเชพเชฅเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเซ‡ เช•เชฏเชพ เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช.

เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชญเช‚เชกเชพเชฐ

เช† เชธเชฒเช—เชฎเชฎเชพเช‚ เช…เชฎเซ‡ GitlabCI เชฎเชพเชฐเชซเชคเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเซเชงเซ€ เชœเชฎเชพเชตเชถเซเช‚, .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) เชฎเชพเชŸเซ‡ เช“เชณเช–เชชเชคเซเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฎเซ‡เชณเชตเชตเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชคเชฎเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚ เชœ.

เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ 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

เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชเชช-เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเชพเช‚ เชนเชœเซ เชธเซเชงเซ€ เช•เซ‹เชˆ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชจเชฅเซ€.

เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชœเชฎเชพเชตเชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชœเชฎเชพเชตเชŸ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชฎเชพเชธเซเชŸเชฐ เชฌเซเชฐเชพเชจเซเชš เชชเชฐ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ GitlabCI เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชเชจเชพ เชชเช›เซ€ kubectl เชจเซ€เชšเซ‡เชจเชพ เช†เช‰เชŸเชชเซเชŸ เชœเซ‹เชˆเช:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช app 10 เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“ เชธเชพเชฅเซ‡ เชœเชฎเชพเชตเชŸ เช…เชจเซ‡ 0 เชธเชพเชฅเซ‡ เชเชช-เช•เซ‡เชจเชฐเซ€. เชคเซเชฏเชพเช‚ เชเช• เชฒเซ‹เชกเชฌเซ‡เชฒเซ‡เชจเซเชธเชฐ เชชเชฃ เช›เซ‡ เชœเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เช…เชฎเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช curl เชฌเชพเชนเซเชฏ IP เชฆเซเชตเชพเชฐเชพ:

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

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช…เชฎเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชŸเซ‡เชธเซเชŸ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชซเช•เซเชค "v1" เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸเชจเซ‹ เช…เชฎเชฒ

เชชเช—เชฒเซเช‚ 1: เช•เซ‡เชŸเชฒเชพเช• เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹

เช…เชฎเซ‡ deploy-canary.yaml เชซเชพเชˆเชฒ เช…เชจเซ‡ เชจเชตเซ€ เช†เชตเซƒเชคเซเชคเชฟ เชˆเชฎเซ‡เชœเชฎเชพเช‚ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ 1 เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ€ เช›เซ‡:

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 เชฆเซเชตเชพเชฐเชพ) เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เชœเซเช“:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช…เชฎเชพเชฐเซ€ เชธเซ‡เชตเชพ เชฌเช‚เชจเซ‡ เชœเชฎเชพเชตเชŸ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชฌเช‚เชจเซ‡ เชชเชพเชธเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเชธเช‚เชฆเช—เซ€เช•เชพเชฐ เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเชพ เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‡เชจเซเชกเชฎเชพเช‡เชเซ‡เชถเชจเชจเซ‡ เชฒเซ€เชงเซ‡, เช…เชฎเชจเซ‡ ~10% เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเชพเชŸเซ‡ เช…เชฒเช—-เช…เชฒเช— เชชเซเชฐเชคเชฟเชธเชพเชฆเซ‹ เชœเซ‹เชตเชพ เชœเซ‹เชˆเช:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช…เชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชฅเชฟเชคเชฟ (GitOps, เชธเชคเซเชฏเชจเชพ เชธเชฟเช‚เช—เชฒ เชธเซเชคเซเชฐเซ‹เชค เชคเชฐเซ€เช•เซ‡ เช—เชฟเชŸเชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ) เช เชธเช•เซเชฐเชฟเชฏ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“ เชธเชพเชฅเซ‡ เชฌเซ‡ เชœเชฎเชพเชตเชŸเชจเซ€ เชนเชพเชœเชฐเซ€ เช›เซ‡, เชฆเชฐเซ‡เช• เชธเช‚เชธเซเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชเช•.

~10% เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช…เชœเชพเชฃเชคเชพเช‚ เชคเซ‡เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‡ เช›เซ‡. เชธเชฎเชธเซเชฏเชพเช“ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชฒเซ‹เช— เช…เชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชกเซ‡เชŸเชพเชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเชพเชจเซ‹ เชนเชตเซ‡ เชธเชฎเชฏ เช›เซ‡.

เชชเช—เชฒเซเช‚ 2: เชฌเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹

เช…เชฎเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เชฅเชˆ เช—เชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชนเชตเซ‡ เช…เชฎเชพเชฐเซ‡ เชฌเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชซเช•เซเชค เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช deploy.yaml เช‡เชฎเซ‡เชœเชจเซเช‚ เชจเชตเซเช‚ เชตเชฐเซเชเชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ 10 เชœเซ‡เชŸเชฒเซ€ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ deploy-canary.yaml เช…เชฎเซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ 0 เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช. เชœเชฎเชพเชตเชŸ เชชเช›เซ€, เชชเชฐเชฟเชฃเชพเชฎ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เชนเชถเซ‡:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #1 เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ: เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€เช†เชˆ

เช…เชช เชธเชฎเชœเซ€

เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡, เช† เชฐเซ€เชคเซ‡ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เชšเชฒเชพเชตเชตเซเช‚ เช เชธเชฎเชœเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ k8s เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‡เชŸเชฒเซ€ เชธเชฐเชณเชคเชพเชฅเซ€ เช—เซ‹เช เชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชคเชฎเชจเซ‡ API เชฆเซเชตเชพเชฐเชพ เชฌเชงเซเช‚ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เช† เชชเช—เชฒเชพเช‚เช“ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชธเซเชตเชšเชพเชฒเชฟเชค เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เชฌเซ€เชœเซ€ เชตเชธเซเชคเซ เช•เซ‡ เชœเซ‡เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เช›เซ‡ เชŸเซ‡เชธเซเชŸเชฐ เชเชจเซเชŸเซเชฐเซ€ เชชเซ‹เชˆเชจเซเชŸ (เชฒเซ‹เชกเชฌเซ‡เชฒเซ‡เชจเซเชธเชฐ เช…เชฅเชตเชพ เช‡เชจเซเช—เซเชฐเซ‡เชธ เชฆเซเชตเชพเชฐเชพ) เชœเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชซเช•เซเชค เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เชœ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชฌเซเชฐเชพเช‰เชเชฟเช‚เช— เชฎเชพเชŸเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชญเชตเชฟเชทเซเชฏเชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚, เช…เชฎเซ‡ เช…เชจเซเชฏ เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เช‰เช•เซ‡เชฒเซ‹ เชคเชชเชพเชธเซ€เชถเซเช‚ เชœเซ‡ เช…เชฎเซ‡ เชœเซ‡ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ‡ เช›เซ‡.

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เช…เชจเซเชฏ เชฒเซ‡เช–เซ‹ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹