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

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

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

เจ‡เจธ เจฒเฉœเฉ€ เจฆเฉ‡ เจฒเฉ‡เจ–:

  • (เจ‡เจน เจฒเฉ‡เจ–)
  • ArgoCI เจตเจฐเจค เจ•เฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€
  • เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€
  • เจœเฉ‡เจจเจ•เจฟเฉฐเจธ-เจเจ•เจธ เจ‡เจธเจŸเฉ€เจ“ เจซเจฒเฉˆเจ—เจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

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


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

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

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

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

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเฉˆเจจเจพเจคเฉ€ (เจฐเฉ‹เจฒเจฟเฉฐเจ— เจ…เฉฑเจชเจกเฉ‡เจŸ)

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

GitOps

เจ…เจธเฉ€เจ‚ เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš GitOps เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚:

  • เจธเฉฑเจš เจฆเฉ‡ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจธเจฐเฉ‹เจค เจตเจœเฉ‹เจ‚ เจ—เจฟเฉฑเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ
  • เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒเจก เจ…เจคเฉ‡ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจฒเจˆ เจ—เจฟเฉฑเจŸ เจ“เจชเจฐเฉ‡เจธเจผเจจเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ (เจ—เจฟเจŸ เจŸเฉˆเจ—/เจฎเจฐเจœ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ)

เจ‰เจฆเจพเจนเจฐเจจ:

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

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

เจ‡เจน เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ Python+Flask API เจนเฉˆ เจœเฉ‹ JSON เจตเจœเฉ‹เจ‚ เจœเจตเจพเจฌ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ GitlabCI เจฐเจพเจนเฉ€เจ‚ เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจจเฉ‚เฉฐ Gitlab เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจพเจ‚เจ—เฉ‡เฅค เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฆเฉ‹ เจตเฉฑเจ–-เจตเฉฑเจ– เจฐเฉ€เจฒเฉ€เจœเจผ เจธเฉฐเจธเจ•เจฐเจฃ เจนเจจ:

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

เจ‰เจนเจจเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเจฟเจฐเจซ เจซเจฐเจ• เจตเจพเจชเจธ เจ•เฉ€เจคเฉ€ JSON เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจœเจฟเฉฐเจจเจพ เจธเฉฐเจญเจต เจนเฉ‹ เจธเจ•เฉ‡ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ•เจฒเจชเจจเจพ เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจฟเจธ เจธเฉฐเจธเจ•เจฐเจฃ เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค

เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ เจญเฉฐเจกเจพเจฐ

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

~ 10% เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ…เจฃเจœเจพเจฃเฉ‡ เจตเจฟเฉฑเจš เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ เจฒเฉŒเจ—เจธ เจ…เจคเฉ‡ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจกเฉ‡เจŸเจพ เจตเจฟเฉฑเจš เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเจพ เจนเฉเจฃ เจธเจฎเจพเจ‚ เจนเฉˆเฅค

เจ•เจฆเจฎ 2: เจธเจพเจฐเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจœเจพเจฐเฉ€ เจ•เจฐเฉ‹

เจ…เจธเฉ€เจ‚ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจธเจพเจฐเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจฐเฉ‹เจฒ เจ†เจŠเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจฌเจธ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ deploy.yaml เจšเจฟเฉฑเจคเจฐ เจฆเจพ เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ 10 เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆ deploy-canary.yaml เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจจเฉ‚เฉฐ เจตเจพเจชเจธ 0 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจคเฉˆเจจเจพเจคเฉ€ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจจเจคเฉ€เจœเจพ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ:

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

เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš

เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ, เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจšเจฒเจพเจ‰เจฃเจพ เจ‡เจน เจธเจฎเจเจฃ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจธเจจเฉ‚เฉฐ k8s เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฟเฉฐเจจเฉ€ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจธเฉฐเจฐเจšเจฟเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเฉเจนเจพเจจเฉ‚เฉฐ API เจฐเจพเจนเฉ€เจ‚ เจนเจฐ เจšเฉ€เจœเจผ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจน เจ•เจฆเจฎ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฐเจพเจนเฉ€เจ‚ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เฉ€เจคเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ‡เจ• เจนเฉ‹เจฐ เจšเฉ€เจœเจผ เจœเจฟเจธ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ เจ‰เจน เจนเฉˆ เจŸเฉˆเจธเจŸเจฐ เจเจ‚เจŸเจฐเฉ€ เจชเฉเจ†เจ‡เฉฐเจŸ (เจฒเฉ‹เจกเจฌเฉˆเจฒเฉˆเจ‚เจธเจฐ เจœเจพเจ‚ เจ‡เฉฐเจ—เจฐเฉˆเจธ เจฐเจพเจนเฉ€เจ‚) เจœเจฟเจธ เจฐเจพเจนเฉ€เจ‚ เจธเจฟเจฐเจซ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจฌเฉเจฐเจพเจŠเจœเจผเจฟเฉฐเจ— เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค

เจญเจตเจฟเฉฑเจ– เจฆเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจนเฉ‹เจฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจนเฉฑเจฒเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจธเจพเจกเฉ‡ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ‡ เจ—เจ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจ•เฉฐเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

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

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

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