Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Մենք կօգտագործենք k8s-ի տեղական Argo Rollouts տեղակայման վերահսկիչը և GitlabCI-ն՝ Canary տեղակայումները Kubernetes-ում գործարկելու համար:

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Այս շարքի հոդվածները

Canary տեղակայում

Հուսով ենք, որ դուք կարդաք առաջին մաս, որտեղ մենք հակիրճ բացատրեցինք, թե ինչ են Canary Deployments-ը: Մենք նաև ցույց տվեցինք, թե ինչպես կարելի է այն իրականացնել՝ օգտագործելով Kubernetes ստանդարտ ռեսուրսները:

Argo Rollouts

Argo Rollouts-ը Kubernetes-ի տեղական տեղակայման վերահսկիչ է: Այն ապահովում է CRD (Custom Resource Definition) Kubernetes-ի համար: Դրա շնորհիվ մենք կարող ենք օգտագործել նոր էություն. Rollout, որը կառավարում է կապտականաչ և դեղձանիկի տեղակայումները տարբեր կոնֆիգուրացիայի տարբերակներով:

Argo Rollouts վերահսկիչ, որն օգտագործվում է հատուկ ռեսուրսի կողմից Rollout, Թույլ է տալիս լրացուցիչ տեղակայման ռազմավարություններ, ինչպիսիք են՝ կապույտ-կանաչ և դեղձանիկ Kubernetes-ի համար: Ռեսուրս Rollout ապահովում է ֆունկցիոնալությունը համարժեք Deployment, միայն տեղակայման լրացուցիչ ռազմավարություններով:
ռեսուրսը Deployments ունի տեղակայման երկու ռազմավարություն. RollingUpdate и Recreate. Չնայած այս ռազմավարությունները հարմար են շատ դեպքերում, շատ մեծ մասշտաբով սերվերների վրա տեղակայման համար օգտագործվում են լրացուցիչ ռազմավարություններ, ինչպիսիք են կապույտ-կանաչ կամ դեղձանիկ, որոնք հասանելի չեն Deployment կարգավորիչում: Kubernetes-ում այս ռազմավարություններն օգտագործելու համար օգտատերերը պետք է գրեին սցենարներ իրենց տեղակայումների վերևում: Argo Rollouts Controller-ը բացահայտում է այս ռազմավարությունները որպես պարզ, դեկլարատիվ, կարգավորելի պարամետրեր:
https://argoproj.github.io/argo-rollouts

Կա նաև Argo CI-ն, որն ապահովում է հարմար վեբ ինտերֆեյս Rollouts-ի հետ օգտագործելու համար, մենք դրան կանդրադառնանք հաջորդ հոդվածում:

Argo 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 plugin)

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

Դիմումի օրինակ

Լավ պրակտիկա է ունենալ կիրառական կոդի և ենթակառուցվածքի առանձին պահեստներ:

Դիմումի համար նախատեսված պահեստ

Kim Wuestkamp/k8s-deployment-example-app

Սա շատ պարզ Python+Flask API է, որը պատասխան է տալիս որպես JSON: Մենք կկառուցենք փաթեթը GitlabCI-ի միջոցով և արդյունքը կմղենք Gitlab ռեգիստր: Ռեեստրում մենք ունենք երկու տարբեր թողարկման տարբերակներ.

  • 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

and 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 աշխատում է նույնը, ինչ տեղակայումը: Եթե ​​մենք չսահմանենք թարմացման ռազմավարություն (ինչպես այստեղ կանարին), այն կվարվի այնպես, ինչպես կանխադրված շարժական թարմացման տեղակայումը:

Յամլում մենք սահմանում ենք երկու քայլ դեղձանիկի տեղակայման համար.

  1. Երթևեկության 10%-ը դեպի դեղձանիկ (սպասեք ձեռքով OK)
  2. 50% երթևեկություն դեպի դեղձանիկ (սպասեք 2 րոպե, ապա շարունակեք մինչև 100%)

Նախնական տեղակայման կատարում

Նախնական տեղակայումից հետո մեր ռեսուրսները կունենան հետևյալ տեսքը.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Եվ մենք պատասխան ենք ստանում միայն հավելվածի առաջին տարբերակից.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Կատարում է Canary Deployment

Քայլ 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-ն տեղակայվում է, և մենք տեսնում ենք փոփոխությունները.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Այժմ, եթե մենք մուտք գործենք ծառայություն.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Հիանալի Մենք մեր դեղձանիկների տեղակայման կեսին ենք: Մենք կարող ենք տեսնել առաջընթացը՝ վազելով.

kubectl argo rollouts get rollout rollout-canary

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Քայլ 2. 50% տրաֆիկ.

Այժմ եկեք անցնենք հաջորդ քայլին՝ վերահասցեավորել տրաֆիկի 50%-ը: Մենք կարգավորել ենք այս քայլը ձեռքով գործելու համար.

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

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Իսկ մեր հավելվածը վերադարձրեց նոր տարբերակների պատասխանների 50%-ը.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Եվ թողարկման ակնարկ.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Հրաշալի։

Քայլ 3. 100% տրաֆիկ.

Մենք այն կարգավորեցինք այնպես, որ 2 րոպե անց 50% քայլն ինքնաբերաբար ավարտվի, իսկ 100% քայլը սկսվի.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Իսկ հավելվածի ելքը.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Եվ թողարկման ակնարկ.

Canary-ի տեղակայում Kubernetes #2-ում. Argo Rollouts

Canary տեղակայումն ավարտված է:

Ավելի շատ օրինակներ Argo Rollouts-ի հետ

Այստեղ կան ավելի շատ օրինակներ, ինչպիսիք են, թե ինչպես կարելի է ստեղծել շրջակա միջավայրի նախադիտումներ և համեմատություններ՝ հիմնված դեղձանիկի վրա.

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

Տեսանյութ Argo Rollouts-ի և Argo CI-ի մասին

Ես իսկապես խորհուրդ եմ տալիս այս տեսանյութը, այն ցույց է տալիս, թե ինչպես են Argo Rollouts-ը և Argo CI-ն միասին աշխատում.

Լրիվ

Ինձ շատ է դուր գալիս CRD-ների օգտագործման գաղափարը, որոնք կառավարում են տեղակայումների կամ կրկնօրինակների լրացուցիչ տեսակների ստեղծումը, վերահղման տրաֆիկը և այլն: Նրանց հետ աշխատանքը սահուն է ընթանում: Հաջորդը ես կցանկանայի փորձարկել ինտեգրումը Argo CI-ի հետ:

Այնուամենայնիվ, թվում է, որ գալիս է Argo CI-ի և Flux CI-ի մեծ միաձուլում, այնպես որ ես կարող եմ սպասել մինչև նոր թողարկումը դուրս գա. Argo Flux.

Ունեցե՞լ եք որևէ փորձ Argo Rollouts-ի կամ Argo CI-ի հետ:

Կարդացեք նաև մեր բլոգի այլ հոդվածներ.

Source: www.habr.com

Добавить комментарий