Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

CD-ն ճանաչվում է որպես ձեռնարկության ծրագրային ապահովման պրակտիկա և հանդիսանում է հաստատված CI սկզբունքների բնական էվոլյուցիայի արդյունք: Այնուամենայնիվ, CD-ն դեռ բավականին հազվադեպ է, հավանաբար կառավարման բարդության և համակարգի հասանելիության վրա ազդող ձախողված տեղակայումների վախի պատճառով:

Դրոշակավորող բաց կոդով Kubernetes օպերատոր է, որի նպատակն է վերացնել շփոթեցնող հարաբերությունները: Այն ավտոմատացնում է դեղձանիկների տեղակայման խթանումը, օգտագործելով Istio-ի երթևեկության օֆսեթը և Պրոմեթևսի չափումները՝ կառավարվող թողարկման ընթացքում հավելվածի վարքագիծը վերլուծելու համար:

Ստորև բերված է քայլ առ քայլ ուղեցույց՝ կարգավորելու և օգտագործելու Flagger-ը Google Kubernetes Engine-ում (GKE):

Kubernetes կլաստերի ստեղծում

Դուք սկսում եք ստեղծելով GKE կլաստեր Istio հավելումով (եթե չունեք GCP հաշիվ, կարող եք գրանցվել այստեղ - անվճար վարկեր ստանալու համար):

Մուտք գործեք Google Cloud, ստեղծեք նախագիծ և միացրեք դրա վճարումը: Տեղադրեք հրամանի տողի կոմունալ ծրագիրը gcloud և կարգավորեք ձեր նախագիծը gcloud init.

Սահմանեք լռելյայն նախագիծը, հաշվարկային տարածքը և գոտին (փոխարինել PROJECT_ID ձեր նախագծի համար):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

Միացրեք GKE ծառայությունը և ստեղծեք կլաստեր HPA և Istio հավելումներով.

gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio 
--cluster-version=${K8S_VERSION} 
--zone=us-central1-a 
--num-nodes=2 
--machine-type=n1-standard-2 
--disk-size=30 
--enable-autorepair 
--no-enable-cloud-logging 
--no-enable-cloud-monitoring 
--addons=HorizontalPodAutoscaling,Istio 
--istio-config=auth=MTLS_PERMISSIVE

Վերոնշյալ հրամանը կստեղծի լռելյայն հանգույց՝ ներառյալ երկու VM n1-standard-2 (vCPU՝ 2, RAM՝ 7,5 ԳԲ, սկավառակ՝ 30 ԳԲ): Իդեալում, դուք պետք է մեկուսացնեք Istio բաղադրիչները ձեր աշխատանքային ծանրաբեռնվածությունից, բայց Istio Pods-ը գործարկելու հեշտ միջոց չկա հանգույցների հատուկ լողավազանում: Istio մանիֆեստները համարվում են միայն կարդալու համար, և GKE-ն կչեղարկի ցանկացած փոփոխություն, օրինակ՝ կապել հանգույցին կամ անջատվել պատիճից:

Ստեղծեք հավատարմագրերը kubectl:

gcloud container clusters get-credentials istio

Ստեղծեք կլաստերի ադմինիստրատորի դերը պարտադիր՝

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Տեղադրեք հրամանի տողի գործիքը սաղավարտ:

brew install kubernetes-helm

Homebrew 2.0-ն այժմ հասանելի է նաև Linux.

Ստեղծեք ծառայության հաշիվ և կլաստերի դերը պարտադիր Tiller-ի համար.

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Ընդարձակեք Tiller-ը անունների տարածության մեջ kube-system:

helm init --service-account tiller

Դուք պետք է մտածեք SSL-ի օգտագործման մասին Helm-ի և Tiller-ի միջև: Ձեր Ղեկի տեղադրումը պաշտպանելու մասին լրացուցիչ տեղեկությունների համար տե՛ս docs.helm.sh

Հաստատեք կարգավորումները.

kubectl -n istio-system get svc

Մի քանի վայրկյան հետո GCP-ն պետք է արտաքին IP հասցե հատկացնի ծառայությանը istio-ingressgateway.

Istio Ingress Gateway-ի կարգավորում

Ստեղծեք ստատիկ IP հասցե անունով istio-gatewayօգտագործելով Istio դարպասի IP հասցեն.

export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip)
gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1

Այժմ ձեզ անհրաժեշտ է ինտերնետային տիրույթ և մուտք դեպի ձեր DNS գրանցող: Ավելացնել երկու A գրառում (փոխարինել example.com ձեր տիրույթում):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

Ստուգեք, որ DNS նիշը աշխատում է.

watch host test.istio.example.com

Ստեղծեք ընդհանուր Istio դարպաս՝ HTTP-ի միջոցով ծառայության ցանցից դուրս ծառայություններ մատուցելու համար.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

Պահպանեք վերը նշված ռեսուրսը որպես public-gateway.yaml և այնուհետև կիրառեք այն.

kubectl apply -f ./public-gateway.yaml

Ոչ մի արտադրական համակարգ չպետք է ծառայություններ մատուցի ինտերնետում առանց SSL-ի: Istio մուտքի դարպասը հավաստագրված մենեջերի, CloudDNS-ի և Let's Encrypt-ի միջոցով ապահովելու համար խնդրում ենք կարդալ փաստաթղթեր Դրոշակակիր Գ.Կ.Ե.

Flagger-ի տեղադրում

GKE Istio հավելումը չի ներառում Prometheus-ի օրինակ, որը մաքրում է Istio հեռաչափության ծառայությունը: Քանի որ Flagger-ը օգտագործում է Istio HTTP չափումներ կանարների վերլուծություն կատարելու համար, դուք պետք է գործադրեք Prometheus-ի հետևյալ կոնֆիգուրացիան, որը նման է Istio Helm-ի պաշտոնական սխեմային:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Ավելացնել Flagger Helm պահեստը.

helm repo add flagger [https://flagger.app](https://flagger.app/)

Ընդարձակեք Flagger-ը դեպի անվանատարածք istio-systemմիացնելով Slack ծանուցումները՝

helm upgrade -i flagger flagger/flagger 
--namespace=istio-system 
--set metricsServer=http://prometheus.istio-system:9090 
--set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID 
--set slack.channel=general 
--set slack.user=flagger

Դուք կարող եք տեղադրել Flagger-ը ցանկացած անվանատարածքում, քանի դեռ այն կարող է հաղորդակցվել Istio Prometheus ծառայության հետ 9090 նավահանգստում:

Flagger-ն ունի Grafana վահանակ դեղձանիկի վերլուծության համար: Տեղադրեք Grafana-ն անունների տարածքում istio-system:

helm upgrade -i flagger-grafana flagger/grafana 
--namespace=istio-system 
--set url=http://prometheus.istio-system:9090 
--set user=admin 
--set password=change-me

Բացահայտեք Grafana-ն բաց դարպասի միջոցով՝ ստեղծելով վիրտուալ ծառայություն (փոխարինել example.com ձեր տիրույթում):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana
  namespace: istio-system
spec:
  hosts:
    - "grafana.istio.example.com"
  gateways:
    - public-gateway.istio-system.svc.cluster.local
  http:
    - route:
        - destination:
            host: flagger-grafana

Պահպանեք վերը նշված ռեսուրսը որպես grafana-virtual-service.yaml և այնուհետև կիրառեք այն.

kubectl apply -f ./grafana-virtual-service.yaml

Երբ տեղափոխվում է http://grafana.istio.example.com զննարկիչում դուք պետք է ուղղորդվեք դեպի Grafana մուտքի էջ:

Վեբ հավելվածների տեղակայում Flagger-ով

Flagger-ը տեղակայում է Kubernetes-ը և կամայականորեն նվազեցնում է ինքնաբերաբար (HPA), այնուհետև ստեղծում է մի շարք օբյեկտներ (Kubernetes տեղակայումներ, ClusterIP ծառայություններ և Istio վիրտուալ ծառայություններ): Այս օբյեկտները ցուցադրում են հավելվածը սպասարկման ցանցին և վերահսկում են դեղձանիկի վերլուծությունը և առաջընթացը:

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Ստեղծեք թեստային անվանատարածք՝ Istio Sidecar ներարկումով միացված.

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

Ստեղծեք տեղակայում և պատիճ ավտոմատ մասշտաբային գործիք.

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

Տեղադրեք փորձնական բեռնվածության ծառայություն՝ դեղձանիկների վերլուծության ընթացքում երթևեկություն առաջացնելու համար.

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

Ստեղծեք սովորական դեղձանիկի ռեսուրս (փոխարինել example.com ձեր տիրույթում):

apiVersion: flagger.app/v1alpha3
kind: Canary
metadata:
  name: podinfo
  namespace: test
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  progressDeadlineSeconds: 60
  autoscalerRef:
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    name: podinfo
  service:
    port: 9898
    gateways:
    - public-gateway.istio-system.svc.cluster.local
    hosts:
    - app.istio.example.com
  canaryAnalysis:
    interval: 30s
    threshold: 10
    maxWeight: 50
    stepWeight: 5
    metrics:
    - name: istio_requests_total
      threshold: 99
      interval: 30s
    - name: istio_request_duration_seconds_bucket
      threshold: 500
      interval: 30s
    webhooks:
      - name: load-test
        url: http://flagger-loadtester.test/
        timeout: 5s
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/"

Պահպանեք վերը նշված ռեսուրսը որպես podinfo-canary.yaml և այնուհետև կիրառեք այն.

kubectl apply -f ./podinfo-canary.yaml

Վերոնշյալ վերլուծությունը, եթե հաջողվի, կաշխատի հինգ րոպե՝ յուրաքանչյուր կես րոպեն մեկ ստուգելով HTTP չափումները: Դուք կարող եք որոշել նվազագույն ժամանակը, որն անհրաժեշտ է դեղձանիկների տեղակայումը վավերացնելու և խթանելու համար՝ օգտագործելով հետևյալ բանաձևը. interval * (maxWeight / stepWeight). Canary CRD դաշտերը փաստաթղթավորված են այստեղ.

Մի քանի վայրկյան հետո Flagger-ը կստեղծի դեղձանիկ առարկաներ.

# applied 
deployment.apps/podinfo
horizontalpodautoscaler.autoscaling/podinfo
canary.flagger.app/podinfo
# generated 
deployment.apps/podinfo-primary
horizontalpodautoscaler.autoscaling/podinfo-primary
service/podinfo
service/podinfo-canary
service/podinfo-primary
virtualservice.networking.istio.io/podinfo

Բացեք զննարկիչը և անցեք app.istio.example.com, դուք պետք է տեսնեք տարբերակի համարը ցուցադրական հավելվածներ.

Կանարների ավտոմատ վերլուծություն և առաջխաղացում

Flagger-ն իրականացնում է կառավարման օղակ, որն աստիճանաբար տեղափոխում է երթևեկությունը դեպի դեղձանիկ՝ միաժամանակ չափելով հիմնական կատարողական ցուցանիշները, ինչպիսիք են HTTP հարցումների հաջողության մակարդակը, հարցման միջին տևողությունը և պատի առողջությունը: KPI-ի վերլուծության հիման վրա դեղձանիկը խթանվում կամ ընդհատվում է, իսկ վերլուծության արդյունքները հրապարակվում են Slack-ում:

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Canary-ի տեղակայումը սկսվում է, երբ փոխվում է հետևյալ օբյեկտներից մեկը.

  • Տեղադրեք PodSpec (կոնտեյների պատկեր, հրաման, նավահանգիստներ, env և այլն)
  • ConfigMaps-ը տեղադրվում է որպես ծավալ կամ քարտեզագրվում է շրջակա միջավայրի փոփոխականներին
  • Գաղտնիքները տեղադրվում են որպես ծավալներ կամ փոխարկվում են շրջակա միջավայրի փոփոխականների

Գործարկեք canary deploy-ը կոնտեյների պատկերը թարմացնելիս.

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger-ը հայտնաբերում է, որ տեղակայման տարբերակը փոխվել է և սկսում է վերլուծել այն.

kubectl -n test describe canary/podinfo

Events:

New revision detected podinfo.test
Scaling up podinfo.test
Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Advance podinfo.test canary weight 20
Advance podinfo.test canary weight 25
Advance podinfo.test canary weight 30
Advance podinfo.test canary weight 35
Advance podinfo.test canary weight 40
Advance podinfo.test canary weight 45
Advance podinfo.test canary weight 50
Copying podinfo.test template spec to podinfo-primary.test
Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available
Promotion completed! Scaling down podinfo.test

Վերլուծության ընթացքում դեղձանիկի արդյունքները կարելի է հետևել Grafana-ի միջոցով.

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Խնդրում ենք նկատի ունենալ, որ եթե դեղձանիկների վերլուծության ընթացքում տեղակայման համար նոր փոփոխություններ կիրառվեն, ապա Flagger-ը կվերսկսի վերլուծության փուլը:

Կազմեք ձեր կլաստերի բոլոր դեղձանիկների ցուցակը.

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Progressing   15       2019-01-16T14:05:07Z
prod        frontend  Succeeded     0        2019-01-15T16:15:07Z
prod        backend   Failed        0        2019-01-14T17:05:07Z

Եթե ​​միացրել եք Slack ծանուցումները, դուք կստանաք հետևյալ հաղորդագրությունները.

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Ավտոմատ հետ վերադարձ

Կանարյան վերլուծության ընթացքում դուք կարող եք առաջացնել սինթետիկ HTTP 500 սխալներ և բարձր արձագանքման ուշացում՝ տեսնելու, թե արդյոք Flagger-ը կդադարեցնի տեղակայումը:

Ստեղծեք թեստային պատիճ և դրանում կատարեք հետևյալը.

kubectl -n test run tester 
--image=quay.io/stefanprodan/podinfo:1.2.1 
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx sh

HTTP 500 սխալների առաջացում.

watch curl http://podinfo-canary:9898/status/500

Հետաձգման առաջացում.

watch curl http://podinfo-canary:9898/delay/1

Երբ ձախողված ստուգումների թիվը հասնում է շեմին, երթևեկությունը վերադարձվում է դեպի առաջնային ալիք, դեղձանիկը չափվում է մինչև զրոյի, և տեղակայումը նշվում է որպես ձախողված:

Կանարյան սխալները և հետաձգման գագաթնակետերը գրանցվում են որպես Kubernetes իրադարձություններ և գրանցվում են Flagger-ի կողմից JSON ձևաչափով.

kubectl -n istio-system logs deployment/flagger -f | jq .msg

Starting canary deployment for podinfo.test
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Halt podinfo.test advancement success rate 69.17% < 99%
Halt podinfo.test advancement success rate 61.39% < 99%
Halt podinfo.test advancement success rate 55.06% < 99%
Halt podinfo.test advancement success rate 47.00% < 99%
Halt podinfo.test advancement success rate 37.00% < 99%
Halt podinfo.test advancement request duration 1.515s > 500ms
Halt podinfo.test advancement request duration 1.600s > 500ms
Halt podinfo.test advancement request duration 1.915s > 500ms
Halt podinfo.test advancement request duration 2.050s > 500ms
Halt podinfo.test advancement request duration 2.515s > 500ms
Rolling back podinfo.test failed checks threshold reached 10
Canary failed! Scaling down podinfo.test

Եթե ​​դուք միացրել եք Slack-ի ծանուցումները, դուք կստանաք հաղորդագրություն, երբ վերջնաժամկետը գերազանցվի կամ վերլուծության մեջ չհաջողված ստուգումների առավելագույն թիվը հասնի.

Կանարների ավտոմատ տեղակայումներ Flagger-ի և Istio-ի հետ

Վերջում

Istio-ի նման սպասարկման ցանցի գործարկումը, բացի Kubernetes-ից, կապահովի ավտոմատ չափումներ, տեղեկամատյաններ և արձանագրություններ, սակայն ծանրաբեռնվածության տեղակայումը դեռևս կախված է արտաքին գործիքներից: Flagger-ը նպատակ ունի փոխել սա՝ ավելացնելով Istio-ի հնարավորությունները առաջադեմ առաքում.

Flagger-ը համատեղելի է ցանկացած Kubernetes CI/CD լուծույթի հետ, և դեղձանիկի վերլուծությունը հեշտությամբ կարող է երկարաձգվել վեբկեռիկներ իրականացնել համակարգի ինտեգրման/ընդունման թեստեր, բեռնվածության թեստեր կամ ցանկացած այլ մաքսային ստուգում: Քանի որ Flagger-ը դեկլարատիվ է և արձագանքում է Kubernetes-ի իրադարձություններին, այն կարող է օգտագործվել GitOps խողովակաշարերում, ինչպես նաև Հյուսվածքի հոսք կամ Enենկինս X. Եթե ​​դուք օգտագործում եք JenkinsX, կարող եք տեղադրել Flagger-ը jx հավելումներով:

Flagger-ն աջակցվում է Գործվածքներ և ապահովում է դեղձանիկների տեղակայում Weave Cloud. Նախագիծը փորձարկվում է GKE-ի, EKS-ի և մերկ մետաղի վրա kubeadm-ով:

Եթե ​​ունեք առաջարկներ՝ բարելավելու Flagger-ը, խնդրում ենք ներկայացնել խնդիր կամ PR GitHub հասցեով stefanprodan/flagger. Ներդրումները ավելի քան ողջունելի են:

Շնորհակալություն Ռեյ Ցանգ.

Source: www.habr.com

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