ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื ืฉืชืžืฉ ื‘ื‘ืงืจ ื”ืคืจื™ืกื” ื”ืžืงื•ืจื™ ืฉืœ Argo Rollouts ื•ื‘-GitlabCI ื›ื“ื™ ืœื”ืคืขื™ืœ ืคืจื™ืกื•ืช ืงื ืจื™ื•ืช ืœ-Kubernetes

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

https://unsplash.com/photos/V41PulGL1z0

ืžืืžืจื™ื ื‘ืกื“ืจื” ื–ื•

ืคืจื™ืกื” ืงื ืจื™ืช

ืื ื• ืžืงื•ื•ื™ื ืฉืืชื” ืงื•ืจื ื—ืœืง ืจืืฉื•ืŸ, ืฉื ื”ืกื‘ืจื ื• ื‘ืงืฆืจื” ืžื”ืŸ ืคืจื™ืกื•ืช ืงื ืจื™ื•ืช. ื”ืจืื™ื ื• ื’ื ื›ื™ืฆื“ ืœื™ื™ืฉื ืืช ื–ื” ื‘ืืžืฆืขื•ืช ืžืฉืื‘ื™ Kubernetes ืกื˜ื ื“ืจื˜ื™ื™ื.

ื”ืฉืงื•ืช ืืจื’ื•

Argo Rollouts ื”ื•ื ื‘ืงืจ ืคืจื™ืกื” ืžืงื•ืจื™ ืฉืœ Kubernetes. ื”ื•ื ืžืกืคืง CRD (ื”ื’ื“ืจืช ืžืฉืื‘ ืžื•ืชืื ืื™ืฉื™ืช) ืขื‘ื•ืจ Kubernetes. ื”ื•ื“ื•ืช ืœื•, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ื™ืฉื•ืช ื—ื“ืฉื”: Rollout, ื”ืžื ื”ืœืช ืคืจื™ืกื•ืช ื›ื—ื•ืœ-ื™ืจื•ืง ื•ืงื ืจื™ื•ืช ืขื ืืคืฉืจื•ื™ื•ืช ืชืฆื•ืจื” ืฉื•ื ื•ืช.

ื‘ืงืจ Argo Rollouts ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ ืžืฉืื‘ ืžื•ืชืื ืื™ืฉื™ืช Rollout, ืžืืคืฉืจ ืืกื˜ืจื˜ื’ื™ื•ืช ืคืจื™ืกื” ื ื•ืกืคื•ืช ื›ื’ื•ืŸ ื›ื—ื•ืœ-ื™ืจื•ืง ื•ืงื ืจื™ ืขื‘ื•ืจ Kubernetes. ืžึทืฉืืึธื‘ Rollout ืžืกืคืง ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืฉื•ื•ื” ืขืจืš Deployment, ืจืง ืขื ืืกื˜ืจื˜ื’ื™ื•ืช ืคืจื™ืกื” ื ื•ืกืคื•ืช.
ืžืฉืื‘ Deployments ื™ืฉ ืฉืชื™ ืืกื˜ืจื˜ื’ื™ื•ืช ืœืคืจื™ืกื”: RollingUpdate ะธ Recreate. ืœืžืจื•ืช ืฉืืกื˜ืจื˜ื’ื™ื•ืช ืืœื• ืžืชืื™ืžื•ืช ืœืจื•ื‘ ื”ืžืงืจื™ื, ืœืคืจื™ืกื” ืœืฉืจืชื™ื ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ ืžืื•ื“, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืืกื˜ืจื˜ื’ื™ื•ืช ื ื•ืกืคื•ืช, ื›ื’ื•ืŸ ื›ื—ื•ืœ-ื™ืจื•ืง ืื• ืงื ืจื™, ืฉืื™ื ืŸ ื–ืžื™ื ื•ืช ื‘ื‘ืงืจ ื”ืคืจื™ืกื”. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืืกื˜ืจื˜ื’ื™ื•ืช ืืœื” ื‘-Kubernetes, ื”ืžืฉืชืžืฉื™ื ื”ื™ื• ืฆืจื™ื›ื™ื ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ื™ื ืขืœ ื”ืคืจื™ืกื” ืฉืœื”ื. ื‘ืงืจ ื”-Argo Rollouts ื—ื•ืฉืฃ ืืช ื”ืืกื˜ืจื˜ื’ื™ื•ืช ื”ืœืœื• ื›ืคืจืžื˜ืจื™ื ืคืฉื•ื˜ื™ื, ื”ืฆื”ืจืชื™ื™ื ื”ื ื™ืชื ื™ื ืœื”ื’ื“ืจื”.
https://argoproj.github.io/argo-rollouts

ื™ืฉ ื’ื Argo CI, ื”ืžืกืคืง ืžืžืฉืง ืื™ื ื˜ืจื ื˜ ื ื•ื— ืœืฉื™ืžื•ืฉ ืขื Rollouts, ื ืกืชื›ืœ ืขืœ ื–ื” ื‘ืžืืžืจ ื”ื‘ื.

ื”ืชืงื ืช ืืจื’ื• 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

ื–ื”ื• API ืคืฉื•ื˜ ืžืื•ื“ ืฉืœ Python+Flask ืฉืžื—ื–ื™ืจ ืชื’ื•ื‘ื” ื‘ืชื•ืจ 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

ื›ื“ื™ ืœื”ืคืขื™ืœ ืื•ืชื• ื‘ืขืฆืžืš ืชื–ื“ืงืง ืœืืฉื›ื•ืœ, ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘-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).

ืชืฉืชื™ืช ื™ืžืœ

ื‘ืชื•ืš ืžืื’ืจ ื”ืชืฉืชื™ื•ืช ื™ืฉ ืœื ื• ืฉื™ืจื•ืช:

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 ืขื•ื‘ื“ ื›ืžื• Deployment. ืื ืœื ื ื’ื“ื™ืจ ืืกื˜ืจื˜ื’ื™ื™ืช ืขื“ื›ื•ืŸ (ื›ืžื• Canary ื›ืืŸ) ื”ื™ื ืชืชื ื”ื’ ื›ืžื• ืคืจื™ืกืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ืขื“ื›ื•ืŸ ืžืชื’ืœื’ืœ.

ืื ื• ืžื’ื“ื™ืจื™ื ืฉื ื™ ืฉืœื‘ื™ื ื‘-yaml ืœืคืจื™ืกื” ืงื ืจื™ืช:

  1. 10% ืžื”ืชื ื•ืขื” ืœืงื ืจื™ืช (ื”ืžืชืŸ ืœืื™ืฉื•ืจ ื™ื“ื ื™)
  2. 50% ืชื ื•ืขื” ืœืงื ืจื™ (ื”ืžืชืŸ 2 ื“ืงื•ืช ื•ืื– ื”ืžืฉืš ืœ-100%)

ื‘ื™ืฆื•ืข ืคืจื™ืกื” ืจืืฉื•ื ื™ืช

ืœืื—ืจ ื”ืคืจื™ืกื” ื”ืจืืฉื•ื ื™ืช, ื”ืžืฉืื‘ื™ื ืฉืœื ื• ื™ื™ืจืื• ื›ืš:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื•ืื ื• ืžืงื‘ืœื™ื ืชืฉื•ื‘ื” ืจืง ืžื”ื’ืจืกื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #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 ืื›ืŸ ืคื•ืจืก ื•ืื ื—ื ื• ืจื•ืื™ื ืืช ื”ืฉื™ื ื•ื™ื™ื:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ืขื›ืฉื™ื• ืื ื ื™ื’ืฉื™ื ืœืฉื™ืจื•ืช:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื’ื“ื•ืœ! ืื ื—ื ื• ื‘ืืžืฆืข ื”ืคืจื™ืกื” ื”ืงื ืจื™ืช ืฉืœื ื•. ืื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช ืืช ื”ื”ืชืงื“ืžื•ืช ืขืœ ื™ื“ื™ ืจื™ืฆื”:

kubectl argo rollouts get rollout rollout-canary

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ืฉืœื‘ 2: 50% ืชื ื•ืขื”:

ื›ืขืช ื ืขื‘ื•ืจ ืœืฉืœื‘ ื”ื‘ื: ื”ืคื ื™ื™ืช 50% ืžื”ืชื ื•ืขื”. ื”ื’ื“ืจื ื• ืืช ื”ืฉืœื‘ ื”ื–ื” ืœื”ืคืขืœื” ื™ื“ื ื™ืช:

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

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื•ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ื”ื—ื–ื™ืจื” 50% ืžื”ืชื’ื•ื‘ื•ืช ืžื’ืจืกืื•ืช ื—ื“ืฉื•ืช:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื•ืกืงื™ืจืช ื”ืฉืงื”:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื‘ืกื“ืจ

ืฉืœื‘ 3: 100% ืชื ื•ืขื”:

ื”ื’ื“ืจื ื• ืืช ื–ื” ื›ืš ืฉืื—ืจื™ 2 ื“ืงื•ืช ืฉืœื‘ 50% ื™ืกืชื™ื™ื ืื•ื˜ื•ืžื˜ื™ืช ื•ืฉืœื‘ 100% ืžืชื—ื™ืœ:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื•ืคืœื˜ ื”ืืคืœื™ืงืฆื™ื”:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื•ืกืงื™ืจืช ื”ืฉืงื”:

ืคืจื™ืกื” ืงื ืจื™ืช ื‘-Kubernetes #2: ื”ืฉืงื•ืช ืืจื’ื•

ื”ืคืจื™ืกื” ื”ืงื ืจื™ืช ื”ื•ืฉืœืžื”.

ื“ื•ื’ืžืื•ืช ื ื•ืกืคื•ืช ืขื ื”ืฉืงื•ืช ืืจื’ื•

ื™ืฉ ื›ืืŸ ื“ื•ื’ืžืื•ืช ื ื•ืกืคื•ืช, ื›ื’ื•ืŸ ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืชืฆื•ื’ื•ืช ืžืงื“ื™ืžื•ืช ืฉืœ ืกื‘ื™ื‘ื” ื•ื”ืฉื•ื•ืื•ืช ืขืœ ืกืžืš ืงื ืจื™ืช:

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

ืกืจื˜ื•ืŸ ืขืœ Argo Rollouts ื•- Argo CI

ืื ื™ ื‘ืืžืช ืžืžืœื™ืฅ ืขืœ ื”ืกืจื˜ื•ืŸ ื”ื–ื”, ื”ื•ื ืžืจืื” ืื™ืš ืืจื’ื• Rollouts ื•- Argo CI ืขื•ื‘ื“ื™ื ื™ื—ื“:

ืกืš ื”ื›ืœ

ืื ื™ ืžืื•ื“ ืื•ื”ื‘ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืฉื™ืžื•ืฉ ื‘-CRD ืฉืžื ื”ืœื™ื ืืช ื”ื™ืฆื™ืจื” ืฉืœ ืกื•ื’ื™ื ื ื•ืกืคื™ื ืฉืœ ืคืจื™ืกื•ืช ืื• ืขืจื›ื•ืช ืžืฉื•ื›ืคืœื•ืช, ืชืขื‘ื•ืจืช ื”ืคื ื™ื” ืžื—ื“ืฉ ื•ื›ื•'. ื”ืขื‘ื•ื“ื” ืื™ืชื ืขื•ื‘ืจืช ื—ืœืง. ื‘ืฉืœื‘ ื”ื‘ื ืื ื™ ืจื•ืฆื” ืœื‘ื“ื•ืง ืืช ื”ืื™ื ื˜ื’ืจืฆื™ื” ืขื Argo CI.

ืขื ื–ืืช, ื ืจืื” ืฉื™ืฉ ืžื™ื–ื•ื’ ื’ื“ื•ืœ ืฉืœ Argo CI ื•-Flux CI, ืื– ืื ื™ ื™ื›ื•ืœ ืœื—ื›ื•ืช ืขื“ ืฉื”ืžื”ื“ื•ืจื” ื”ื—ื“ืฉื” ืชืฆื: ืืจื’ื• Flux.

ื”ืื ื”ื™ื” ืœืš ื ื™ืกื™ื•ืŸ ืขื Argo Rollouts ืื• Argo CI?

ืงืจื ื’ื ืžืืžืจื™ื ืื—ืจื™ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”