เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ k8s-native Argo Rollouts เปเบฅเบฐ GitlabCI เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰ Canary deployment เบเบฑเบš Kubernetes.

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

https://unsplash.com/photos/V41PulGL1z0

เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบ™เบŠเบธเบ”เบ™เบตเป‰

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

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

เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

Argo Rollouts เปเบกเปˆเบ™เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡ Kubernetes. เบกเบฑเบ™เบชเบฐเบซเบ™เบญเบ‡ CRD (Custom Resource Definition) เบชเปเบฒเบฅเบฑเบš Kubernetes. เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เปƒเบซเบกเปˆ: Rollout, เป€เบŠเบดเปˆเบ‡เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เปƒเบŠเป‰เบชเบตเบŸเป‰เบฒ-เบชเบตเบ‚เบฝเบง เปเบฅเบฐ canary เบ—เบตเปˆเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เปˆเบฒเบ‡เป†.

เบ•เบปเบงเบ„เบงเบšเบ„เบธเบก Argo Rollouts เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡ Rollout, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปƒเบŠเป‰เบเบปเบ™เบฅเบฐเบเบธเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบŠเบฑเปˆเบ™: เบชเบตเบŸเป‰เบฒ-เบชเบตเบ‚เบฝเบง เปเบฅเบฐ canary เบชเปเบฒเบฅเบฑเบš Kubernetes. เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ Rollout เบชเบฐเบซเบ™เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบฝเบšเป€เบ—เบปเปˆเบฒ Deployment, เบžเบฝเบ‡เปเบ•เปˆเบกเบตเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.
เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ Deployments เบกเบตโ€‹เบชเบญเบ‡โ€‹เบเบธเบ”โ€‹เบ—เบฐโ€‹เบชเบฒเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹: RollingUpdate ะธ Recreate. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบปเบ™เบฅเบฐเบเบธเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบซเบผเบฒเบ, เบเบธเบ”เบ—เบฐเบชเบฒเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เป€เบŠเบฑเปˆเบ™: เบชเบตเบ‚เบฝเบงเบชเบตเบŸเป‰เบฒเบซเบผเบท canary, เบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ›เบฑเบšเปƒเบŠเป‰. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบเบธเบ”เบ—เบฐเบชเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบ™ Kubernetes, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบชเบฐเบ„เบฃเบดเบšเบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. Argo Rollouts Controller เป€เบ›เบตเบ”เป€เบœเบตเบเบเบธเบ”เบ—เบฐเบชเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ, เบ›เบฐเบเบฒเบ”, เบเปเบฒเบ™เบปเบ”เป„เบ”เป‰.
https://argoproj.github.io/argo-rollouts

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

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Argo Rollouts

เบ”เป‰เบฒเบ™เป€เบŠเบตเบšเป€เบงเบต

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

เปƒเบ™ turnip เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰) เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบก install.yaml เป€เบ›เบฑเบ™ i/k8s/argo-rollouts/install.yaml เปเบฅเป‰เบง. เบงเบดเบ—เบตเบ™เบตเป‰ GitlabCI เบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบก.

เบ”เป‰เบฒเบ™เบฅเบนเบเบ„เป‰เบฒ (เบ›เบฅเบฑเบเบญเบดเบ™ kubectl)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเบงเบขเปˆเบฒเบ‡

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

Repository เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ

Kim Wuestkamp/k8s-deployment-example-app

เบ™เบตเป‰เปเบกเปˆเบ™ 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-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy 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).

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

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

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

เปเบฅเบฐ rollout.yamlโ€‹:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout เป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™เบเบฑเบš Deployment. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡ (เป€เบŠเบฑเปˆเบ™ canary เบ—เบตเปˆเบ™เบตเป‰) เบกเบฑเบ™เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบทเบเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡.

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบชเบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™ yaml เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ canary:

  1. 10% เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบˆเบฐโ€‹เบฅเบฒโ€‹เบˆเบญเบ™ Canary (เบฅเปโ€‹เบ–เป‰เบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เบนเปˆโ€‹เบกเบท OKโ€‹)
  2. 50% เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เป„เบ› canary (เบฅเปเบ–เป‰เบฒ 2 เบ™เบฒเบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบทเบšเบ•เปเปˆ 100%)

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

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

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบญเบšเบฎเบฑเบšเบžเบฝเบ‡เปเบ•เปˆเบˆเบฒเบเบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบปเปˆเบ‡ Canary

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 1: 10% เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบงเบตเบŠเบฑเบ™เบฎเบนเบšเบžเบฒเบšเบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบเป€เบฎเบฑเบ”เบเบฑเบšเบเบฒเบ™เบ™เบณเปƒเบŠเป‰:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบŠเบธเบเบเบนเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ Gitlab CI เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบ”เบฝเบงเบ™เบตเป‰เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบเบดเปˆเบ‡เปƒเบซเบเปˆ! เบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™เบเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” canary เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒเป‚เบ”เบเบเบฒเบ™เปเบฅเปˆเบ™:

kubectl argo rollouts get rollout rollout-canary

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 2: 50% เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™:

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›: เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ 50% เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡:

kubectl argo rollouts promote rollout-canary # continue to step 2

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เปเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบฑเบšเบ„เบทเบ™ 50% เบ‚เบญเบ‡เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบˆเบฒเบเบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆ:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เปเบฅเบฐเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบญเบฑเบ”เบชเบฐเบˆเบฑเบ™.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 3: 100% เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™:

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ•เบฑเป‰เบ‡โ€‹เบกเบฑเบ™โ€‹เบ‚เบถเป‰เบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบงเปˆเบฒโ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบ 2 เบ™เบฒโ€‹เบ—เบตโ€‹, เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™ 50% เบˆเบฐโ€‹เบชเบดเป‰เบ™โ€‹เบชเบธเบ”โ€‹เบฅเบปเบ‡โ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹เปเบฅเบฐโ€‹เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™ 100โ€‹% เบˆเบฐโ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เปเบฅเบฐโ€‹เบœเบปเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เปเบฅเบฐเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เปƒเบ™ Kubernetes #2: เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Argo

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง.

เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเบฑเบš Argo Rollouts

เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบŠเบฑเปˆเบ™: เบงเบดเบ—เบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบฅเบฐเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ canary:

https://github.com/argoproj/argo-rollouts/tree/master/examples

เบงเบดเบ”เบตเป‚เบญเบเปˆเบฝเบงเบเบฑเบš Argo Rollouts เปเบฅเบฐ Argo CI

เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐเบ™เปเบฒเบงเบดเบ”เบตเป‚เบญเบ™เบตเป‰เปเบ—เป‰เป†, เบกเบฑเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒ Argo Rollouts เปเบฅเบฐ Argo CI เป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™เปเบ™เบงเปƒเบ”:

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเปเปˆเบกเบฑเบเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ CRDs เบ—เบตเปˆเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบซเบผเบท replicasets, redirect traffic, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบเบฑเบšโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบเป‰เบฝเบ‡โ€‹. เบ•เปเปˆเป„เบ›เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบš Argo CI.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบกเบตเบเบฒเบ™เบฅเบงเบกเบ•เบปเบงเปƒเบซเบเปˆเบ‚เบญเบ‡ Argo CI เปเบฅเบฐ Flux CI เบˆเบฐเบกเบฒเป€เบ–เบดเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบญเบฒเบ”เบˆเบฐเบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เบ›เปˆเบญเบเปƒเบซเบกเปˆเบญเบญเบเบกเบฒ: Argo Flux.

เบ—เปˆเบฒเบ™เป€เบ„เบตเบเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบเบฑเบš Argo Rollouts เบซเบผเบท Argo CI เบšเป?

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

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

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