αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 2: αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Argo

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Argo Rollouts ដើម k8s αž“αž·αž„ GitlabCI αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž‘αŸ… Kubernetes

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 2: αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Argo

https://unsplash.com/photos/V41PulGL1z0

αž’αžαŸ’αžαž”αž‘αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary

αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αž’αžΆαž“ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž–αž“αŸ’αž™αž›αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αž›αžΈαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž› Canary Deployments αž‚αžΊαŸ” αž™αžΎαž„αž€αŸαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αž“αž’αžΆαž“ Kubernetes αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž•αž„αžŠαŸ‚αžšαŸ”

αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Argo

Argo Rollouts αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαžΎαž˜ Kubernetes αŸ” αžœαžΆαž•αŸ’αžαž›αŸ‹ CRD (αž“αž·αž™αž˜αž“αŸαž™αž’αž“αž’αžΆαž“αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Kubernetes αŸ” αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αžœαžΆ αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž’αž„αŸ’αž‚αž—αžΆαž–αžαŸ’αž˜αžΈαŸ– RolloutαžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αžŽαŸŒαžαŸ€αžœαž”αŸƒαžαž„ αž“αž·αž„ Canary αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αŸ”

αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆ Argo Rollouts αž”αŸ’αžšαžΎαžŠαŸ„αž™αž’αž“αž’αžΆαž“αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ Rollout, αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αž“αŸ’αžαŸ‚αž˜αžŠαžΌαž…αž‡αžΆαž–αžŽαŸŒαžαŸ€αžœαž”αŸƒαžαž„ αž“αž·αž„ Canary αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Kubernetes αŸ” αž’αž“αž’αžΆαž“ Rollout αž•αŸ’αžαž›αŸ‹αž˜αž»αžαž„αžΆαžšαžŸαž˜αž˜αžΌαž› Deploymentαž˜αžΆαž“αžαŸ‚αž‡αžΆαž˜αž½αž™αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
αž’αž“αž’αžΆαž“ Deployments αž˜αžΆαž“αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž–αžΈαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ– RollingUpdate ΠΈ Recreate. αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžšαžŽαžΈαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž€αŸαžŠαŸ„αž™ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž€αŸ’αž“αž»αž„αž‘αŸ’αžšαž„αŸ‹αž‘αŸ’αžšαžΆαž™αž’αŸ† αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αžŠαžΌαž…αž‡αžΆαž–αžŽαŸŒαžαŸ€αžœ-αž”αŸƒαžαž„ ឬ Canary αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆαž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αžΈαž›αžΎαž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆ Argo Rollouts αž›αžΆαžαžαŸ’αžšαžŠαžΆαž„αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαžΆαž˜αž‰αŸ’αž‰ αž”αŸ’αžšαž€αžΆαžŸ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžΆαž“αŸ”
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

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž§αž‘αžΆαž αžšαžŽαŸ

αžœαžΆαž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αžΆαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

Kim Wuestkamp/k8s-deployment-example-app

αž“αŸαŸ‡αž‚αžΊαž‡αžΆ Python+Flask API αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ†αž•αž»αžαžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‡αžΆ 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

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš cluster αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ 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 αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αž·αž“αž€αŸ†αžŽαžαŸ‹αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αžΆαž”αŸ‹αžŠαŸαžαž‘αŸ (αžŠαžΌαž…αž‡αžΆ Canary αž“αŸ…αž‘αžΈαž“αŸαŸ‡) αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŠαžΌαž…αž‡αžΆ default rolling-update DeploymentαŸ”

αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αž–αžΈαžšαž‡αŸ†αž αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ 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 αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž—αŸαž‘αž”αž“αŸ’αžαŸ‚αž˜αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž¬αž§αž”αž€αžšαžŽαŸαž…αž˜αŸ’αž›αž„ αž”αŸ’αžαžΌαžšαž‘αž·αžŸαž…αžšαžΆαž…αžšαŸ”αž›αŸ” αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž½αž€αž‚αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžšαž›αžΌαž“αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ Argo CI αŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž˜αžΆαž“αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸαž’αŸ†αž“αŸƒ Argo CI αž“αž·αž„ Flux CI αž˜αž€αžŠαž›αŸ‹ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžαŸ’αž˜αžΈαž…αŸαž‰αž˜αž€αŸ– Argo Flux.

αžαžΎαž’αŸ’αž“αž€αž’αŸ’αž›αžΆαž”αŸ‹αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™ Argo Rollouts ឬ Argo CI αž‘αŸ?

αžŸαžΌαž˜αž’αžΆαž“αž’αžαŸ’αžαž”αž‘αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αž•αž„αžŠαŸ‚αžšαŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹