เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

Kubernetes-เตฝ เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดžเด™เตเด™เตพ Gitlab CI, เดฎเดพเดจเตเดตเตฝ GitOps เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

เดˆ เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต† เดฒเต‡เด–เดจเด™เตเด™เตพ:

GitOps เดตเดดเดฟ เดžเด™เตเด™เตพ เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดธเตเดตเดฎเต‡เดงเดฏเดพ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดฐเดงเดพเดจ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚/เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดˆ เดฒเต‡เด–เดจเด‚ เดชเตเดฐเดพเดฅเดฎเดฟเด•เดฎเดพเดฏเดฟ เด†เดฎเตเด–เดคเตเดคเดฟเดจเต เดตเต‡เดฃเตเดŸเดฟเดฏเตเดณเตเดณเดคเดพเดฃเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เดพเดจเดฑเดฟเดฏเดฟเตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเตŠเดชเตเดชเด‚, เด•เต‚เดŸเตเดคเตฝ เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป เดฐเต€เดคเดฟเด•เตพ เด‰เดณเตเดณเดคเดฟเดจเดพเตฝ, เด…เดคเต เดžเด™เตเด™เตพ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเตฝ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด‚.


เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

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

เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚

เด•เดพเดจเดฑเดฟ เดธเตเดŸเตเดฐเดพเดฑเตเดฑเดœเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด…เดชเตเดกเต‡เดฑเตเดฑเตเด•เตพ เด†เดฆเตเดฏเด‚ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเตเดŸเต† เด’เดฐเต เด‰เดชเดตเดฟเดญเดพเด—เดคเตเดคเดฟเดจเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เดจเดฟเดฐเต€เด•เตเดทเดฃเด‚, เดฒเต‹เด—เต เดกเดพเดฑเตเดฑ, เดฎเดพเดจเตเดตเตฝ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเต เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดšเดพเดจเดฒเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเต‚เดŸเต†, เดŽเดฒเตเดฒเดพ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เตเด‚ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดฑเดฟเดฒเต€เดธเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดตเดฟเดจเตเดฏเดพเดธเด‚ (เดฑเต‹เดณเดฟเด‚เด—เต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต)

Kubernetes เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเตเดณเตเดณ เดกเดฟเดซเต‹เตพเดŸเตเดŸเต เดคเดจเตเดคเตเดฐเด‚ เดฑเต‹เดณเดฟเด‚เด—เต-เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเดพเดฃเต, เด…เดตเดฟเดŸเต† เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดŽเดฃเตเดฃเด‚ เดชเต‹เดกเตเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดต เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเดคเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดชเดดเดฏ เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดณเตเดณ เดชเต‹เดกเตเด•เตพ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดคเดฟเดฏ เดชเต‹เดกเตเด•เตพ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

GitOps

เดˆ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ GitOps เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เตพ:

  • เดธเดคเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเตŠเดฑเตเดฑ เด‰เดฑเดตเดฟเดŸเดฎเดพเดฏเดฟ Git เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเตเด‚ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเตเดฎเดพเดฏเดฟ เดžเด™เตเด™เตพ Git เด“เดชเตเดชเดฑเต‡เดทเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต (เดœเดฟเดฑเตเดฑเต เดŸเดพเด—เต/เดฒเดฏเดจเด‚ เด’เดดเดฟเด•เต†เดฏเตเดณเตเดณ เด•เดฎเดพเตปเดกเตเด•เตพ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ)

เด‰เดฆเดพเดนเดฐเดฃเด‚:

เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดจเดฒเตเดฒ เดถเต€เดฒเด‚ เดŽเดŸเตเด•เตเด•เดพเด‚ - เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เดกเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดถเต‡เด–เดฐเดตเตเด‚ เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดจเดพเดฏเดฟ เด’เดจเตเดจเต.

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดถเต‡เด–เดฐเด‚

เด‡เดคเต JSON เด†เดฏเดฟ เด’เดฐเต เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดจเตฝเด•เตเดจเตเดจ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต Python+Flask API เด†เดฃเต. เดžเด™เตเด™เตพ GitlabCI เดตเดดเดฟ เดชเดพเด•เตเด•เต‡เดœเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดซเดฒเด‚ Gitlab เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดคเดณเตเดณเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เดฐเดฃเตเดŸเต เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดคเดฟเดชเตเดชเตเด•เตพ เด‰เดฃเตเดŸเต:

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

เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟเดฏ JSON เดซเดฏเดฒเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด‚ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด…เดต เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดตเตเดฏเดคเตเดฏเดพเดธเด‚. เดเดคเต เดชเดคเดฟเดชเตเดชเตเดฎเดพเดฏเดพเดฃเต เดžเด™เตเด™เตพ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต†เดจเตเดจเต เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดฐ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดฆเตƒเดถเตเดฏเดตเตฝเด•เตเด•เดฐเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดˆ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ

เดˆ เดŸเต‡เดฃเดฟเดชเตเดชเดฟเตฝ เดžเด™เตเด™เตพ GitlabCI เดตเดดเดฟ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด‚, .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: Gitlab CI

เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต app 10 เดชเด•เตผเดชเตเดชเตเด•เดณเตเดณเตเดณ เดตเดฟเดจเตเดฏเดพเดธเดตเตเด‚ 0 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดชเตเดชเต-เด•เดพเดจเดฑเดฟเดฏเตเด‚. เดจเดฎเตเด•เตเด•เต เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เดฒเต‹เดกเตเดฌเดพเดฒเตปเดธเดฑเตเด‚ เด‰เดฃเตเดŸเต. curl เดฌเดพเดนเตเดฏ IP เดตเดดเดฟ:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

เดžเด™เตเด™เดณเตเดŸเต† เดŸเต†เดธเตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป "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: Gitlab CI

เดฐเดฃเตเดŸเดฟเดจเตเด‚ เด†เดชเตเดชเต เดธเต†เดฒเด•เตเดŸเตผ เด‰เดณเตเดณเดคเดฟเดจเดพเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดธเต‡เดตเดจเด‚ เดฐเดฃเตเดŸเต เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดตเดฟเดฐเตฝ เดšเต‚เดฃเตเดŸเตเด‚. เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตเดฑเต† เดกเดฟเดซเต‹เตพเดŸเตเดŸเต เดฑเดพเตปเดกเดฎเตˆเดธเต‡เดทเตป เด•เดพเดฐเดฃเด‚, ~10% เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพเด•เตเด•เต เดžเด™เตเด™เตพ เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเตเดฐเดคเดฟเด•เดฐเดฃเด™เตเด™เตพ เด•เดพเดฃเตเด‚:

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เด…เดตเดธเตเดฅ (GitOps, Git-เตฝ เดจเดฟเดจเตเดจเต เดธเดคเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เดเด• เด‰เดฑเดตเดฟเดŸเดฎเดพเดฏเดฟ เดŽเดŸเตเดคเตเดคเดคเต) เดธเดœเต€เดตเดฎเดพเดฏ เดชเด•เตผเดชเตเดชเตเด•เดณเตเดณเตเดณ เดฐเดฃเตเดŸเต เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เดณเตเดŸเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเดฎเดพเดฃเต, เด“เดฐเต‹ เดชเดคเดฟเดชเตเดชเดฟเดจเตเด‚ เด’เดจเตเดจเต.

~10% เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏเดฟเดคเตเดคเต€เดฐเตเด•เดฏเตเด‚ เด…เดตเดฟเดšเดพเดฐเดฟเดคเดฎเดพเดฏเดฟ เด…เดคเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฒเต‹เด—เตเด•เดณเดฟเดฒเต† เดชเดฟเดถเด•เตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเดจเตเด‚ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เดกเดพเดฑเตเดฑ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเดจเตเดฎเตเดณเตเดณ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต.

เด˜เดŸเตเดŸเด‚ 2: เดŽเดฒเตเดฒเดพ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเด•

เดŽเดฒเตเดฒเดพเด‚ เดจเดจเตเดจเดพเดฏเดฟ เดจเดŸเดจเตเดจเตเดตเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต, เด‡เดชเตเดชเต‹เตพ เดŽเดฒเตเดฒเดพ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดฒเดญเตเดฏเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด• deploy.yaml เดšเดฟเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต† เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด‚ 10-เดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เดชเด•เตผเดชเตเดชเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดตเตเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต deploy-canary.yaml เดžเด™เตเด™เตพ เดชเด•เตผเดชเตเดชเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ 0 เด†เดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเต. เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดซเดฒเด‚ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚:

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ #1: Gitlab CI

เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ

เดŽเดจเตเดจเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดธเตเดตเดฎเต‡เดงเดฏเดพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต k8s เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเดคเตเดฐ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต API เดตเดดเดฟ เดŽเดฒเตเดฒเดพเด‚ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป Kubernetes เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดˆ เด˜เดŸเตเดŸเด™เตเด™เตพ เดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเตเด•เดณเดฟเดฒเต‚เดŸเต† เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸ เดฎเดฑเตเดฑเตŠเดฐเต เด•เดพเดฐเตเดฏเด‚ เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเตผ เดŽเตปเดŸเตเดฐเดฟ เดชเต‹เดฏเดฟเดจเตเดฑเดพเดฃเต (LoadBalancer เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ Ingress เดตเดดเดฟ) เด…เดคเดฟเดฒเต‚เดŸเต† เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดฎเดพเดคเตเดฐเดฎเต‡ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเต‚. เด‡เดคเต เดฎเดพเดจเตเดตเตฝ เดฌเตเดฐเต—เดธเดฟเด™เตเด™เดฟเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดญเดพเดตเดฟเดฏเดฟเดฒเต† เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเตฝ, เดžเด™เตเด™เตพ เดšเต†เดฏเตเดค เดฎเดฟเด•เตเด• เด•เดพเดฐเตเดฏเด™เตเด™เดณเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจ เดฎเดฑเตเดฑเต เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚.

เดžเด™เตเด™เดณเตเดŸเต† เดฌเตเดฒเต‹เด—เดฟเดฒเต† เดฎเดฑเตเดฑเต เดฒเต‡เด–เดจเด™เตเด™เดณเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด•:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•