Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

E hoʻohana mākou i ka k8s-native Argo Rollouts deployment controller a me GitlabCI e holo i nā hoʻolaha Canary i Kubernetes

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

ʻatikala ma kēia moʻo

Hoʻokomo Canary

Manaʻo mākou e heluhelu ʻoe ʻāpana mua, kahi i wehewehe pōkole ai mākou i ke ʻano o Canary Deployments. Ua hōʻike pū mākou pehea e hoʻokō ai me ka hoʻohana ʻana i nā kumuwaiwai Kubernetes maʻamau.

Argo Rollouts

ʻO Argo Rollouts kahi mea hoʻokele hoʻonohonoho maoli ʻo Kubernetes. Hāʻawi ia i kahi CRD (Custom Resource Definition) no nā Kubernetes. Mahalo iā ia, hiki iā mākou ke hoʻohana i kahi hui hou: Rollout, nāna e hoʻokele i nā hoʻonohonoho ʻulaʻula uliuli a me nā canary me nā koho hoʻonohonoho like ʻole.

Hoʻohana ʻia ka mea hoʻokele Argo Rollouts e kahi kumuwaiwai maʻamau Rollout, ʻAe i nā hoʻolālā hoʻolālā hou e like me ka uliuli-'ōmaʻomaʻo a me ka canary no nā Kubernetes. Punawai Rollout hāʻawi i ka hana like Deployment, me nā hoʻolālā hoʻolaha hou aku.
mau Deployments Loaʻa i ʻelua mau hoʻolālā no ka hoʻolaha ʻana: RollingUpdate и Recreate. ʻOiai ua kūpono kēia mau hoʻolālā no ka hapa nui o nā hihia, no ka hoʻoili ʻana i nā kikowaena ma kahi ākea nui, hoʻohana ʻia nā hoʻolālā ʻē aʻe, e like me ka uliuli-'ōmaʻomaʻo a i ʻole canary, ʻaʻole i loaʻa i ka mea hoʻokele Deployment. No ka hoʻohana ʻana i kēia mau hoʻolālā ma Kubernetes, pono nā mea hoʻohana e kākau i nā palapala ma luna o kā lākou Deployments. Hōʻike ka Argo Rollouts Controller i kēia mau hoʻolālā ma ke ʻano he maʻalahi, hoʻolaha, hoʻonohonoho ʻia.
https://argoproj.github.io/argo-rollouts

Aia pū kekahi Argo CI, e hāʻawi ana i kahi kikowaena pūnaewele kūpono no ka hoʻohana ʻana me Rollouts, e nānā mākou i kēlā ma ka ʻatikala aʻe.

Ke hoʻokomo nei i nā Argo Rollouts

ʻaoʻao kikowaena

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

I loko o kā mākou mea hoʻonanea turnip (e ʻike i lalo) ua hoʻohui mākou i install.yaml e like me i/k8s/argo-rollouts/install.yaml. Ma kēia ala e hoʻokomo ai ʻo GitlabCI iā ia i loko o ka pūpū.

ʻaoʻao mea kūʻai aku (kubectl plugin)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Hoʻohana Laʻana

He hana maikaʻi ka loaʻa ʻana o nā waihona ʻokoʻa no ke code noi a me nā ʻōnaehana.

Waihona no ka noi

Kim Wuestkamp/k8s-deployment-example-app

He Python + Flask API maʻalahi kēia e hoʻihoʻi i kahi pane e like me JSON. E kūkulu mākou i ka pōʻai me ka hoʻohana ʻana iā GitlabCI a pana i ka hopena i ka Registry Gitlab. I loko o ke kākau inoa ʻelua mau mana hoʻokuʻu ʻokoʻa:

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

ʻO ka ʻokoʻa wale nō ma waena o lākou ʻo ka faila JSON i hoʻihoʻi ʻia. Hoʻohana mākou i kēia noi e ʻike maʻalahi i ka mana a mākou e kamaʻilio nei.

Hale waihona waiwai

Ma kēia waihona e hoʻohana mākou iā GitlabCI no ka hoʻouka ʻana iā Kubernetes, .gitlab-ci.yml e like me kēia:

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

No ka holo ʻana iā ʻoe iho, pono ʻoe i kahi puʻupuʻu, hiki iā ʻoe ke hoʻohana iā Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Pono ʻoe e ʻoki https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a hana i ka hoololi KUBECONFIG i GitlabCI, kahi e loaʻa ai ka config no ke komo kubectl i kāu hui.

he mea Hiki iā ʻoe ke heluhelu e pili ana i ka loaʻa ʻana o nā hōʻoia no kahi hui (Gcloud).

ʻOihana Yaml

I loko o ka waihona waiwai i loaʻa iā mākou ka lawelawe:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

a me 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 hana like me ka Deployment. Inā ʻaʻole mākou e hoʻonohonoho i kahi hoʻolālā hoʻolālā (e like me ka canary ma aneʻi) e hana ia e like me ka Deployment rolling-update Deployment.

Wehewehe mākou i ʻelua mau ʻanuʻu ma yaml no ka hoʻolaha ʻana i nā canary:

  1. 10% o ke kaʻa i ka canary (kali no ka manual OK)
  2. 50% kaʻa i ka canary (kali 2 mau minuke a laila hoʻomau i 100%)

Ke hana nei i ka hoʻolaha mua ʻana

Ma hope o ka hoʻolaha mua ʻana, e like me kēia kā mākou kumuwaiwai:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

A loaʻa iā mākou kahi pane mai ka mana mua o ka noi:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

Ke hana nei i ka Canary Deployment

KaʻAnuʻu 1: 10% kaʻahele

No ka hoʻomaka ʻana i kahi hoʻolaha canary, pono mākou e hoʻololi i ke kiʻi kiʻi e like me kā mākou hana maʻamau me nā deployments:

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
...

A ke koi nei mākou i nā loli, no laila ke kau nei ʻo Gitlab CI a ʻike mākou i nā loli:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

I kēia manawa inā komo mākou i ka lawelawe:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

Nui! Aia mākou i waenakonu o kā mākou hoʻolaha canary. Hiki iā mākou ke ʻike i ka holomua ma ka holo ʻana:

kubectl argo rollouts get rollout rollout-canary

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

KaʻAnuʻu 2: 50% kaʻahele:

I kēia manawa, e neʻe kākou i ka ʻanuʻu aʻe: hoʻihoʻi hou i 50% o ke kaʻa. Ua hoʻonohonoho mākou i kēia ʻanuʻu e holo me ka lima:

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

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

A ua hoʻihoʻi kā mākou noi i 50% o nā pane mai nā mana hou:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

A me ka loiloi hoʻolaha:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

Kupaianaha.

KaʻAnuʻu 3: 100% kaʻahele:

Hoʻonohonoho mākou iā ia ma hope o 2 mau minuke e pau ka 50% kaʻina a hoʻomaka ka 100% kaʻina:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

A me ka puka noi noi:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

A me ka loiloi hoʻolaha:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts

Ua pau ka hoʻolaha ʻana o Canary.

Nā laʻana hou aku me Argo Rollouts

Nui aʻe nā laʻana ma aneʻi, e like me ka hoʻonohonoho ʻana i nā hiʻohiʻona kaiapuni a me nā hoʻohālikelike e pili ana i ka canary:

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

Video e pili ana iā Argo Rollouts a me Argo CI

Manaʻo nui wau i kēia wikiō, e hōʻike ana pehea e hana pū ai ʻo Argo Rollouts a me Argo CI:

ʻO ka hopena

Nui koʻu makemake i ka manaʻo o ka hoʻohana ʻana i nā CRD e hoʻokele i ka hana ʻana i nā ʻano o ka hoʻopili ʻana a i ʻole replicasets, redirect traffic, etc. Holo mālie ka hana pū me lākou. A laila makemake wau e hoʻāʻo i ka hoʻohui ʻana me Argo CI.

Eia nō naʻe, ʻike ʻia kahi hui nui o Argo CI a me Flux CI e hele mai ana, no laila e kali wau a hiki i ka puka ʻana o ka hoʻokuʻu hou: Argo Flux.

Ua loaʻa iā ʻoe kekahi ʻike me Argo Rollouts a i ʻole Argo CI?

E heluhelu pū i nā ʻatikala ʻē aʻe ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka