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

เช…เชฎเซ‡ k8s-เชจเซ‡เชŸเชฟเชต เช†เชฐเซเช—เซ‹ เชฐเซ‹เชฒเช†เช‰เชŸ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒเชฐ เช…เชจเซ‡ GitlabCI เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เชถเซเช‚.

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

https://unsplash.com/photos/V41PulGL1z0

เช† เชถเซเชฐเซ‡เชฃเซ€เชจเชพ เชฒเซ‡เช–เซ‹

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

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

เช†เชฐเซเช—เซ‹ เชฐเซ‹เชฒเช†เช‰เชŸเซเชธ

Argo Rollouts เช Kubernetes เชจเซ‡เชŸเซ€เชต เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒเชฐ เช›เซ‡. เชคเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ CRD (เช•เชธเซเชŸเชฎ เชฐเชฟเชธเซ‹เชฐเซเชธ เชกเซ‡เชซเชฟเชจเซ‡เชถเชจ) เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช†เชญเชพเชฐ, เช…เชฎเซ‡ เชเช• เชจเชตเซ€ เชเชจเซเชŸเชฟเชŸเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช: Rollout, เชœเซ‡ เชตเชฟเชตเชฟเชง เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชตเชฟเช•เชฒเซเชชเซ‹ เชธเชพเชฅเซ‡ เชตเชพเชฆเชณเซ€-เชฒเซ€เชฒเชพ เช…เชจเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเซ‡ เช›เซ‡.

เช•เชธเซเชŸเชฎ เชธเช‚เชธเชพเชงเชจ เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เช†เชฐเซเช—เซ‹ เชฐเซ‹เชฒเช†เช‰เชŸเซเชธ เช•เช‚เชŸเซเชฐเซ‹เชฒเชฐ 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

เช…เชฎเชพเชฐเชพ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชธเชฒเช—เชฎเชฎเชพเช‚ (เชจเซ€เชšเซ‡ เชœเซเช“) เช…เชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ i/k8s/argo-rollouts/install.yaml เชคเชฐเซ€เช•เซ‡ 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
...

เช…เชจเซ‡ เช…เชฎเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เช†เช—เชณ เชงเชชเชพเชตเซ€เช เช›เซ€เช, เชคเซ‡เชฅเซ€ Gitlab CI เชคเซˆเชจเชพเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชœเซ‹เชˆเช เช›เซ€เช:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ #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 เชเช•เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡:

เชชเชฐเชฟเชฃเชพเชฎ

เชฎเชจเซ‡ CRD เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชตเชฟเชšเชพเชฐ เช–เชฐเซ‡เช–เชฐ เช—เชฎเซ‡ เช›เซ‡ เชœเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เชชเซเชฐเช•เชพเชฐเชจเชพเช‚ เชœเชฎเชพเชตเชŸ เช…เชฅเชตเชพ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“, เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เชŸเซเชฐเชพเชซเชฟเช• เชตเช—เซ‡เชฐเซ‡เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เชธเชฐเชณเชคเชพเชฅเซ€ เชšเชพเชฒเซ‡ เช›เซ‡. เช†เช—เชณ เชนเซเช‚ เช†เชฐเซเช—เซ‹ เชธเซ€เช†เชˆ เชธเชพเชฅเซ‡ เชเช•เซ€เช•เชฐเชฃเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เชœเซ‹ เช•เซ‡, Argo CI เช…เชจเซ‡ Flux CIเชจเซเช‚ เชฎเซ‹เชŸเซเช‚ เชฎเชฐเซเชœเชฐ เช†เชตเซ€ เชฐเชนเซเชฏเซเช‚ เชนเซ‹เชฏ เชคเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชจเชตเซ€ เชฐเซ€เชฒเซ€เช เชฌเชนเชพเชฐ เชจ เช†เชตเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฐเชพเชน เชœเซ‹เชˆ เชถเช•เซเช‚ เช›เซเช‚: เช†เชฐเซเช—เซ‹ เชซเซเชฒเช•เซเชธ.

เชถเซเช‚ เชคเชฎเชจเซ‡ Argo Rollouts เช…เชฅเชตเชพ Argo CI เชจเซ‹ เช•เซ‹เชˆ เช…เชจเซเชญเชต เช›เซ‡?

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

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

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