Kanarídreifing í Kubernetes #2: Argo útfærslur

Við munum nota k8s-innfædda Argo Rollouts dreifingarstýringu og GitlabCI til að keyra Canary dreifingu á Kubernetes

Kanarídreifing í Kubernetes #2: Argo útfærslur

https://unsplash.com/photos/V41PulGL1z0

Greinar í þessari röð

Kanaríútsetning

Við vonum að þú lesir fyrri hluti, þar sem við útskýrðum stuttlega hvað Canary Deployments eru. Við sýndum líka hvernig á að innleiða það með því að nota staðlaða Kubernetes auðlindir.

Argo útgáfur

Argo Rollouts er innfæddur Kubernetes dreifingarstýring. Það veitir CRD (Custom Resource Definition) fyrir Kubernetes. Þökk sé því getum við notað nýja einingu: Rollout, sem stjórnar blágrænum og kanarí-uppfærslum með ýmsum stillingarvalkostum.

Argo Rollouts stjórnandi notaður af sérsniðnu tilfangi Rollout, Gerir ráð fyrir frekari dreifingaraðferðum eins og blágrænum og kanarí fyrir Kubernetes. Auðlind Rollout veitir samsvarandi virkni Deployment, aðeins með frekari dreifingaraðferðum.
úrræði Deployments hefur tvær aðferðir fyrir dreifingu: RollingUpdate и Recreate. Þó að þessar aðferðir henti í flestum tilfellum, til dreifingar á netþjóna í mjög stórum stíl, eru viðbótaraðferðir notaðar, eins og blágrænn eða kanarífugl, sem eru ekki tiltækar í dreifingarstýringunni. Til að nota þessar aðferðir í Kubernetes þurftu notendur að skrifa forskriftir ofan á dreifinguna sína. Argo Rollouts Controller afhjúpar þessar aðferðir sem einfaldar, lýsandi, stillanlegar færibreytur.
https://argoproj.github.io/argo-rollouts

Það er líka Argo CI, sem veitir þægilegt vefviðmót til notkunar með Rollouts, við munum skoða það í næstu grein.

Að setja upp Argo Rollouts

Server hlið

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

Í innviðarófu okkar (sjá hér að neðan) höfum við þegar bætt install.yaml við sem i/k8s/argo-rollouts/install.yaml. Þannig mun GitlabCI setja það upp í þyrpinguna.

Viðskiptavinahlið (kubectl tappi)

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

Dæmi Umsókn

Það er góð venja að hafa aðskildar geymslur fyrir forritakóða og innviði.

Geymsla fyrir forritið

Kim Wuestkamp/k8s-deployment-example-app

Þetta er mjög einfalt Python+Flask API sem skilar svari sem JSON. Við munum byggja pakkann með því að nota GitlabCI og ýta niðurstöðunni í Gitlab Registry. Í skránni höfum við tvær mismunandi útgáfur:

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

Eini munurinn á milli þeirra er JSON skráin sem skilað er. Við notum þetta forrit til að sjá eins auðveldlega og mögulegt er hvaða útgáfu við erum í samskiptum við.

Innviðageymsla

Í þessari geymslu munum við nota GitlabCI fyrir dreifingu á Kubernetes, .gitlab-ci.yml lítur svona út:

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

Til að keyra það sjálfur þarftu klasa, þú getur notað Gcloud:

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

Þú þarft að punga https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure og búa til breytu KUBECONFIG í GitlabCI, sem mun innihalda stillingar fyrir aðgang kubectl til þyrpingarinnar þinnar.

Hér Þú getur lesið um hvernig á að fá skilríki fyrir klasa (Gcloud).

Innviðir Yaml

Inni í innviðageymslunni höfum við þjónustu:

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

og 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 virkar á sama hátt og Deployment. Ef við setjum ekki uppfærslustefnu (eins og Canary hér) mun hún hegða sér eins og sjálfgefna uppfærsluuppfærslu.

Við skilgreinum tvö skref í yaml fyrir dreifingu kanarífugla:

  1. 10% af umferð til Kanarí (bíddu eftir handvirkt OK)
  2. 50% umferð til Kanarí (bíddu í 2 mínútur og haltu síðan áfram í 100%)

Framkvæmir fyrstu dreifingu

Eftir fyrstu dreifingu munu auðlindir okkar líta svona út:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Og við fáum aðeins svar frá fyrstu útgáfu forritsins:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Framkvæmir Canary Deployment

Skref 1: 10% umferð

Til að hefja dreifingu kanarífugla þurfum við bara að breyta myndútgáfunni eins og við gerum venjulega með dreifingu:

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

Og við ýtum á breytingar, svo Gitlab CI dreifist og við sjáum breytingarnar:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Nú ef við fáum aðgang að þjónustunni:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Frábært! Við erum í miðri kanaríútsetningu okkar. Við getum séð framfarirnar með því að keyra:

kubectl argo rollouts get rollout rollout-canary

Kanarídreifing í Kubernetes #2: Argo útfærslur

Skref 2: 50% umferð:

Nú skulum við halda áfram í næsta skref: að beina 50% af umferðinni áfram. Við stilltum þetta skref til að keyra handvirkt:

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

Kanarídreifing í Kubernetes #2: Argo útfærslur

Og umsókn okkar skilaði 50% af svörum frá nýjum útgáfum:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Og endurskoðun útsetningar:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Dásamlegt.

Skref 3: 100% umferð:

Við settum það upp þannig að eftir 2 mínútur lýkur 50% skrefinu sjálfkrafa og 100% skrefið byrjar:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Og úttak forritsins:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Og endurskoðun útsetningar:

Kanarídreifing í Kubernetes #2: Argo útfærslur

Dreifingu Kanarífugla er lokið.

Fleiri dæmi með Argo Rollouts

Það eru fleiri dæmi hér, eins og hvernig á að setja upp forsýningar umhverfisins og samanburð á grundvelli kanarífugla:

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

Myndband um Argo Rollouts og Argo CI

Ég mæli virkilega með þessu myndbandi, það sýnir hvernig Argo Rollouts og Argo CI vinna saman:

Samtals

Mér líkar mjög við hugmyndina um að nota CRD sem stjórna stofnun viðbótartegunda dreifingar eða afrita, endurbeina umferð osfrv. Vinna með þeim gengur snurðulaust fyrir sig. Næst langar mig að prófa samþættinguna við Argo CI.

Hins vegar virðist vera stór samruni Argo CI og Flux CI að koma, svo ég gæti beðið þar til nýja útgáfan kemur út: Argo Flux.

Hefur þú reynslu af Argo Rollouts eða Argo CI?

Lestu einnig aðrar greinar á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd