เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจธเฉ€เจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ k8s-เจจเฉ‡เจŸเจฟเจต เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจ…เจคเฉ‡ GitlabCI เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

https://unsplash.com/photos/V41PulGL1z0

เจ‡เจธ เจฒเฉœเฉ€ เจตเจฟเฉฑเจš เจฒเฉ‡เจ–

เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

เจ…เจธเฉ€เจ‚ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจชเฉœเฉเจนเจฆเฉ‡ เจนเฉ‹ เจชเจนเจฟเจฒเจพ เจญเจพเจ—, เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจฆเฉฑเจธเจฟเจ† เจนเฉˆ เจ•เจฟ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจ•เฉ€ เจนเจจเฅค เจ…เจธเฉ€เจ‚ เจ‡เจน เจตเฉ€ เจฆเจฟเจ–เจพเจ‡เจ† เจ•เจฟ เจฎเจฟเจ†เจฐเฉ€ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจŠเจŸเจธ

เจ…เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจ‡เฉฑเจ• เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเฉ‡เจŸเจฟเจต เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจนเฉˆเฅค เจ‡เจน เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจ‡เฉฑเจ• CRD (เจ•เจธเจŸเจฎ เจธเจฐเฉ‹เจค เจชเจฐเจฟเจญเจพเจธเจผเจพ) เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเจพ เจงเฉฐเจจเจตเจพเจฆ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจนเจธเจคเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚: Rollout, เจœเฉ‹ เจ•เจฟ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจจเฉ€เจฒเฉ‡-เจนเจฐเฉ‡ เจ…เจคเฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ•เจธเจŸเจฎ เจธเจฐเฉ‹เจค เจฆเฉเจ†เจฐเจพ เจตเจฐเจคเจฟเจ† Argo เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ Rollout, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจจเฉ€เจฒเฉ‡-เจนเจฐเฉ‡ เจ…เจคเฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจตเจฐเจ—เฉ€เจ†เจ‚ เจตเจพเจงเฉ‚ เจคเฉˆเจจเจพเจคเฉ€ เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจธเจฐเฉ‹เจค Rollout เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ Deployment, เจธเจฟเจฐเจซเจผ เจตเจพเจงเฉ‚ เจคเฉˆเจจเจพเจคเฉ€ เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจจเจพเจฒเฅค
เจธเจฐเฉ‹เจค Deployments เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ เจฆเฉ‹ เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจนเจจ: RollingUpdate ะธ Recreate. เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจน เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจฒเจˆ เจขเฉเจ•เจตเฉ€เจ†เจ‚ เจนเจจ, เจฌเจนเฉเจค เจตเฉฑเจกเฉ‡ เจชเฉˆเจฎเจพเจจเฉ‡ 'เจคเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ, เจ…เจคเจฟเจฐเจฟเจ•เจค เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจจเฉ€เจฒเฉ‡-เจนเจฐเฉ‡ เจœเจพเจ‚ เจ•เฉˆเจจเจฐเฉ€, เจœเฉ‹ เจ•เจฟ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจนเจจเฅค เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจ‡เจนเจจเจพเจ‚ เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฒเจฟเจ–เจฃเฉ€เจ†เจ‚ เจชเฉˆเจ‚เจฆเฉ€เจ†เจ‚ เจธเจจเฅค เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจ‡เจนเจจเจพเจ‚ เจฐเจฃเจจเฉ€เจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ, เจ˜เฉ‹เจธเจผเจฃเจพเจคเจฎเจ•, เจธเฉฐเจฐเจšเจจเจพเจฏเฉ‹เจ— เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‰เจœเจพเจ—เจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
https://argoproj.github.io/argo-rollouts

เจ†เจฐเจ—เฉ‹ เจธเฉ€เจ†เจˆ เจตเฉ€ เจนเฉˆ, เจœเฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจฆเฉ‡ เจจเจพเจฒ เจตเจฐเจคเจฃ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจตเฉˆเฉฑเจฌ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ‡เจธ 'เจคเฉ‡ เจ‡เฉฑเจ• เจจเจœเจผเจฐ เจฎเจพเจฐเจพเจ‚เจ—เฉ‡เฅค

เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ

เจธเจฐเจตเจฐ เจชเจพเจธเฉ‡

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

เจธเจพเจกเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจตเจฟเฉฑเจš (เจนเฉ‡เจ เจพเจ‚ เจฆเฉ‡เจ–เฉ‹) เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ install.yaml เจจเฉ‚เฉฐ i/k8s/argo-rollouts/install.yaml เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐ เจšเฉเฉฑเจ•เฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ GitlabCI เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเฉ‡เจ—เจพเฅค

เจ•เจฒเจพเจ‡เฉฐเจŸ เจธเจพเจˆเจก (kubectl เจชเจฒเฉฑเจ—เจ‡เจจ)

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

เจ‰เจฆเจพเจนเจฐเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เฉ‹เจก เจ…เจคเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฒเจˆ เจตเฉฑเจ–เจฐเฉ‡ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚ เจฐเฉฑเจ–เจฃเจพ เจšเฉฐเจ—เจพ เจ…เจญเจฟเจ†เจธ เจนเฉˆเฅค

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจˆ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€

Kim Wuestkamp/k8s-deployment-example-app

เจ‡เจน เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ 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-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 เจตเจฟเฉฑเจš, เจœเจฟเจธ เจตเจฟเฉฑเจš เจชเจนเฉเฉฐเจš เจฒเจˆ เจธเฉฐเจฐเจšเจจเจพ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เฉ€ 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 เจคเฉˆเจจเจพเจคเฉ€ เจตเจพเจ‚เจ— เจนเฉ€ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจ…เฉฑเจชเจกเฉ‡เจŸ เจฐเจฃเจจเฉ€เจคเฉ€ (เจœเจฟเจตเฉ‡เจ‚ เจ‡เฉฑเจฅเฉ‡ เจ•เฉˆเจจเจฐเฉ€) เจธเฉˆเจŸ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจ‡เจน เจกเจฟเจซเฉŒเจฒเจŸ เจฐเฉ‹เจฒเจฟเฉฐเจ—-เจ…เฉฑเจชเจกเฉ‡เจŸ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจตเจพเจ‚เจ— เจตเจฟเจตเจนเจพเจฐ เจ•เจฐเฉ‡เจ—เจพเฅค

เจ…เจธเฉ€เจ‚ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ yaml เจตเจฟเฉฑเจš เจฆเฉ‹ เจชเฉœเจพเจ… เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

  1. เจ•เฉˆเจจเจฐเฉ€ เจฒเจˆ 10% เจŸเฉเจฐเฉˆเจซเจฟเจ• (เจฎเฉˆเจจเฉ‚เจ…เจฒ เจ“เจ•เฉ‡ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹)
  2. เจ•เฉˆเจจเจฐเฉ€ เจฒเจˆ 50% เจŸเฉเจฐเฉˆเจซเจฟเจ• (2 เจฎเจฟเฉฐเจŸ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ เจซเจฟเจฐ 100% เจคเฉฑเจ• เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เฉ‹)

เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจธเจพเจกเฉ‡ เจธเจฐเฉ‹เจค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃเจ—เฉ‡:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉ‹เจ‚ เจนเฉ€ เจœเจตเจพเจฌ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจ•เจฐเจจเจพ

เจ•เจฆเจฎ 1: 10% เจŸเฉเจฐเฉˆเจซเจฟเจ•

เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจšเจฟเฉฑเจคเจฐ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจจเจพเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

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
...

เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚, เจ‡เจธเจฒเจˆ เจ—เจฟเจŸเจฒเฉˆเจฌ เจธเฉ€เจ†เจˆ เจคเฉˆเจจเจพเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจฌเจฆเจฒเจพเจ… เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจนเฉเจฃ เจœเฉ‡ เจ…เจธเฉ€เจ‚ เจธเฉ‡เจตเจพ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจฌเจนเฉเจค เจตเจงเฉ€เจ†! เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจ•เฉˆเจจเจฐเฉ€ เจคเจพเจ‡เจจเจพเจคเฉ€ เจฆเฉ‡ เจฎเฉฑเจง เจตเจฟเฉฑเจš เจนเจพเจ‚เฅค เจ…เจธเฉ€เจ‚ เจฆเฉŒเฉœ เจ•เฉ‡ เจคเจฐเฉฑเจ•เฉ€ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

kubectl argo rollouts get rollout rollout-canary

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ•เจฆเจฎ 2: 50% เจ†เจตเจพเจœเจพเจˆ:

เจนเฉเจฃ เจ†เจ“ เจ…เจ—เจฒเฉ‡ เจชเฉœเจพเจ… 'เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ: 50% เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเฉ‚เฉฐ เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจ•เจฐเจจเจพเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจชเจ— เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจนเฉˆ:

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

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจคเฉ‡ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‡ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจคเฉ‹เจ‚ 50% เจœเจตเจพเจฌ เจตเจพเจชเจธ เจ•เฉ€เจคเฉ‡:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจคเฉ‡ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจธเจฎเฉ€เจ–เจฟเจ†:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจธเจผเจพเจจเจฆเจพเจฐ.

เจ•เจฆเจฎ 3: 100% เจ†เจตเจพเจœเจพเจˆ:

เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉˆเจŸ เจ…เจช เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจ•เจฟ 2 เจฎเจฟเฉฐเจŸ เจฌเจพเจ…เจฆ 50% เจ•เจฆเจฎ เจ†เจชเจฃเฉ‡ เจ†เจช เจ–เจคเจฎ เจนเฉ‹ เจœเจพเจตเฉ‡ เจ…เจคเฉ‡ 100% เจ•เจฆเจฎ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจœเจพเจตเฉ‡:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ…เจคเฉ‡ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจธเจฎเฉ€เจ–เจฟเจ†:

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ #2 เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€: เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ

เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจชเฉ‚เจฐเฉ€ เจนเฉ‹ เจ—เจˆ เจนเฉˆเฅค

เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจฆเฉ‡ เจจเจพเจฒ เจนเฉ‹เจฐ เจ‰เจฆเจพเจนเจฐเจฃ

เจ‡เฉฑเจฅเฉ‡ เจนเฉ‹เจฐ เจตเฉ€ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจตเจพเจคเจพเจตเจฐเจฃ เจชเฉเจฐเฉ€เจตเจฟเจŠ เจ…เจคเฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจคเฉเจฒเจจเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพ เจนเฉˆ:

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

เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจ…เจคเฉ‡ เจ†เจฐเจ—เฉ‹ เจธเฉ€เจ†เจˆ เจฌเจพเจฐเฉ‡ เจตเฉ€เจกเฉ€เจ“

เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจ‡เจธ เจตเฉ€เจกเฉ€เจ“ เจฆเฉ€ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจ‡เจน เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจ†เจฐเจ—เฉ‹ เจฐเฉ‹เจฒเจ†เจ‰เจŸเจธ เจ…เจคเฉ‡ เจ†เจฐเจ—เฉ‹ เจธเฉ€เจ†เจˆ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจ:

เจจเจคเฉ€เจœเจพ

เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจธเฉ€เจ†เจฐเจกเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเจพ เจตเจฟเจšเจพเจฐ เจชเจธเฉฐเจฆ เจนเฉˆ เจœเฉ‹ เจตเจพเจงเฉ‚ เจ•เจฟเจธเจฎเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€เจ†เจ‚, เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจ†เจฆเจฟ เจฆเฉ€ เจฐเจšเจจเจพ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ‰เจจเฉเจนเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจธเฉเจšเจพเจฐเฉ‚ เจขเฉฐเจ— เจจเจพเจฒ เจšเฉฑเจฒเจฆเจพ เจนเฉˆเฅค เจ…เฉฑเจ—เฉ‡ เจฎเฉˆเจ‚ เจ…เจฐเจ—เฉ‹ เจธเฉ€เจ†เจˆ เจจเจพเจฒ เจเจ•เฉ€เจ•เจฐเจฃ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ.

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ†เจฐเจ—เฉ‹ เจธเฉ€เจ†เจˆ เจ…เจคเฉ‡ เจซเจฒเฉˆเจ•เจธ เจธเฉ€เจ†เจˆ เจฆเจพ เจ‡เฉฑเจ• เจตเฉฑเจกเจพ เจ…เจญเฉ‡เจฆ เจนเฉเฉฐเจฆเจพ เจœเจพเจชเจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจจเจตเฉ€เจ‚ เจฐเฉ€เจฒเฉ€เจœเจผ เจฆเฉ‡ เจธเจพเจนเจฎเจฃเฉ‡ เจ†เจ‰เจฃ เจคเฉฑเจ• เจ‡เฉฐเจคเจœเจผเจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเจพเจ‚: เจ†เจฐเจ—เฉ‹ เจซเจฒเฉˆเจ•เจธ.

เจ•เฉ€ เจคเฉเจนเจพเจจเฉ‚เฉฐ Argo Rollouts เจœเจพเจ‚ Argo CI เจจเจพเจฒ เจ•เฉ‹เจˆ เจ…เจจเฉเจญเจต เจนเฉ‹เจ‡เจ† เจนเฉˆ?

เจธเจพเจกเฉ‡ เจฌเจฒเฉŒเจ— 'เจคเฉ‡ เจนเฉ‹เจฐ เจฒเฉ‡เจ– เจตเฉ€ เจชเฉœเฉเจนเฉ‹:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹