Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Is-CD hija rikonoxxuta bħala prattika tas-softwer tal-intrapriża u hija evoluzzjoni naturali tal-prinċipji stabbiliti tas-CI. Madankollu, is-CD għadu pjuttost rari, forsi minħabba l-kumplessità tal-ġestjoni u l-biża 'ta' skjeramenti falluti li jaffettwaw id-disponibbiltà tas-sistema.

Bandiera huwa operatur ta' Kubernetes ta' sors miftuħ li għandu l-għan li jelimina relazzjonijiet konfużi. Jawtomatizza l-promozzjoni tal-iskjeramenti tal-kanarji billi juża l-offsets tat-traffiku Istio u l-metriċi Prometheus biex janalizza l-imġiba tal-applikazzjoni waqt it-tnedija ġestita.

Hawn taħt hawn gwida pass pass biex twaqqaf u tuża Flagger fuq Google Kubernetes Engine (GKE).

Twaqqif ta' cluster Kubernetes

Tibda billi toħloq cluster GKE bis-add-on Istio (jekk m'għandekx kont tal-GCP, tista' tiffirma hawn - li tirċievi krediti b'xejn).

Idħol f'Google Cloud, oħloq proġett, u ppermetti l-kontijiet għalih. Installa l-utilità tal-linja tal-kmand gcloud u kkonfigurat il-proġett tiegħek ma gcloud init.

Issettja l-proġett default, iż-żona tal-komputazzjoni, u ż-żona (issostitwixxi PROJECT_ID għall-proġett tiegħek):

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

Ippermetti s-servizz GKE u oħloq cluster b'HPA u Istio add-ons:

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

Il-kmand ta 'hawn fuq se joħloq ġabra ta' nodi default li tikkonsisti f'żewġ VMs n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Idealment, il-komponenti Istio għandhom ikunu iżolati mill-piżijiet tax-xogħol tagħhom, iżda m'hemm l-ebda mod faċli biex imexxu Istio pods fuq ġabra ta 'nodi ddedikata. Il-manifesti ta' Istio huma kkunsidrati bħala li jinqraw biss, u GKE se jreġġa' lura kwalunkwe tibdil bħal jorbot ma' node jew jinqala' minn pod.

Stabbilixxi kredenzjali għal kubectl:

gcloud container clusters get-credentials istio

Oħloq rabta tar-rwol tal-amministratur tal-cluster:

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

Installa l-għodda tal-linja tal-kmand Helm:

brew install kubernetes-helm

Homebrew 2.0 issa huwa wkoll disponibbli għal Linux.

Oħloq kont tas-servizz u rabta tar-rwol tal-cluster għal Tiller:

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

Jespandi Tiller fl-ispazju tal-isem kube-system:

helm init --service-account tiller

Għandek tikkunsidra li tuża SSL bejn Helm u Tiller. Għal aktar informazzjoni dwar il-protezzjoni tal-installazzjoni ta' Helm tiegħek, ara docs.helm.sh

Ikkonferma s-settings:

kubectl -n istio-system get svc

Wara ftit sekondi, GCP għandu jassenja indirizz IP estern lis-servizz istio-ingressgateway.

It-twaqqif ta' Istio Ingress Gateway

Oħloq indirizz IP statiku bl-isem istio-gatewaybilli tuża l-indirizz IP tal-portal ta' Istio:

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

Issa għandek bżonn dominju tal-internet u aċċess għar-reġistratur tad-DNS tiegħek. Żid żewġ rekords A (issostitwixxi example.com għad-dominju tiegħek):

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

Ivverifika li l-wildcard tad-DNS qed jaħdem:

watch host test.istio.example.com

Oħloq gateway Istio ġeneriku biex tipprovdi servizzi barra l-malja tas-servizz fuq 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:
        - "*"

Issejvja r-riżors ta’ hawn fuq bħala public-gateway.yaml u mbagħad applikaha:

kubectl apply -f ./public-gateway.yaml

L-ebda sistema ta' produzzjoni m'għandha tipprovdi servizzi fuq l-Internet mingħajr SSL. Biex tiżgura l-gateway tad-dħul ta' Istio tiegħek ma' cert-manager, CloudDNS u Let's Encrypt, jekk jogħġbok aqra dokumentazzjoni Flagger G.K.E.

Installazzjoni tal-bandiera

Il-GKE Istio add-on ma jinkludix l-istanza Prometheus li tnaddaf is-servizz tat-telemetrija Istio. Peress li Flagger juża metriċi Istio HTTP biex iwettaq analiżi tal-kanarji, għandek bżonn tuża l-konfigurazzjoni Prometheus li ġejja, simili għal dik li tiġi mal-iskema uffiċjali ta 'Istio Helm.

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

Żid ir-repożitorju tal-Flagger Helm:

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

Jespandi Flagger għal namespace istio-systembilli tattiva notifiki 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

Tista' tinstalla Flagger fi kwalunkwe namespace sakemm tkun tista' tikkomunika mas-servizz Istio Prometheus fuq il-port 9090.

Flagger għandu dashboard Grafana għall-analiżi tal-kanarji. Installa Grafana fl-ispazju tal-isem 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

Esponi Grafana permezz ta’ portal miftuħ billi toħloq servizz virtwali (issostitwixxi example.com għad-dominju tiegħek):

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

Ħlief ir-riżors ta' hawn fuq bħala grafana-virtual-service.yaml u mbagħad applikaha:

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

Meta tmur http://grafana.istio.example.com Il-browser tiegħek għandu jidderieġik lejn il-paġna tal-login ta' Grafana.

L-iskjerament ta' applikazzjonijiet tal-web ma' Flagger

Flagger juża Kubernetes u, jekk meħtieġ, horizontal autoscaling (HPA), imbagħad joħloq serje ta 'oġġetti (skjeramenti ta' Kubernetes, servizzi ClusterIP u servizzi virtwali Istio). Dawn l-oġġetti jesponu l-applikazzjoni għall-malji tas-servizz u jimmaniġġjaw l-analiżi u l-promozzjoni tal-kanarji.

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Oħloq spazju tal-isem tat-test bl-implimentazzjoni Istio Sidecar attivata:

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

Oħloq skjerament u għodda awtomatika ta' skalar orizzontali għall-pod:

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

Uża servizz tat-test tat-tagħbija biex tiġġenera traffiku waqt l-analiżi tal-kanarji:

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

Oħloq riżors tal-kanarju tad-dwana (issostitwixxi example.com għad-dominju tiegħek):

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/"

Ħlief ir-riżors ta' hawn fuq bħala podinfo-canary.yaml u mbagħad applikaha:

kubectl apply -f ./podinfo-canary.yaml

L-analiżi ta 'hawn fuq, jekk tirnexxi, se taħdem għal ħames minuti, u tiċċekkja l-metriċi HTTP kull nofs minuta. Tista' tiddetermina l-ħin minimu meħtieġ biex tittestja u tippromwovi skjerament tal-kanarji billi tuża l-formula li ġejja: interval * (maxWeight / stepWeight). L-oqsma tas-CRD tal-Kanarji huma dokumentati hawn.

Wara ftit sekondi, Flagger se joħloq oġġetti kanarji:

# 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

Iftaħ il-browser tiegħek u mur fuq app.istio.example.com, għandek tara n-numru tal-verżjoni applikazzjonijiet demo.

Analiżi u promozzjoni awtomatiċi tal-kanarji

Flagger jimplimenta linja ta 'kontroll li gradwalment iċċaqlaq it-traffiku lejn il-kanarju filwaqt li jkejjel l-indikaturi ewlenin tal-prestazzjoni bħar-rata ta' suċċess tat-talba HTTP, it-tul medju tat-talba, u s-saħħa tal-pods. Ibbażat fuq l-analiżi KPI, il-kanarju jiġi promoss jew mitmum, u r-riżultati tal-analiżi huma ppubblikati fi Slack.

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

L-iskjerament tal-Kanarji jinbeda meta wieħed mill-oġġetti li ġejjin jinbidel:

  • Uża PodSpec (immaġni tal-kontenitur, kmand, portijiet, env, eċċ.)
  • ConfigMaps huma mmuntati bħala volumi jew konvertiti għal varjabbli ambjentali
  • Sigrieti huma mmuntati bħala volumi jew konvertiti għal varjabbli ambjentali

Mexxi l-iskjerament tal-kanarji meta taġġorna l-immaġni tal-kontejner:

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

Flagger jiskopri li l-verżjoni tal-iskjerament inbidlet u jibda janalizzaha:

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

Waqt l-analiżi, ir-riżultati tal-kanarji jistgħu jiġu mmonitorjati bl-użu ta’ Grafana:

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Jekk jogħġbok innota: jekk jiġu applikati bidliet ġodda għall-iskjerament waqt l-analiżi tal-Canary, Flagger jerġa' jibda l-fażi tal-analiżi.

Agħmel lista tal-kanarini kollha fil-grupp tiegħek:

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

Jekk għamilt notifiki Slack, tirċievi l-messaġġi li ġejjin:

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Qlib awtomatiku

Waqt l-analiżi tal-kanarji, tista 'tiġġenera żbalji HTTP 500 sintetiċi u latenza għolja ta' rispons biex tivverifika jekk Flagger iwaqqafx l-iskjerament.

Oħloq pod tat-test u agħmel dan li ġej fih:

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

Jiġġeneraw żbalji HTTP 500:

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

Dewmien fil-ġenerazzjoni:

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

Meta n-numru ta 'kontrolli falluti jilħaq limitu, it-traffiku jiġi mgħoddi lura lejn il-kanal primarju, il-kanarju jiġi skalat għal żero, u l-iskjerament jiġi mmarkat bħala fallut.

L-iżbalji tal-Canary u l-ispikes ta' latenza huma rreġistrati bħala avvenimenti Kubernetes u rreġistrati minn Flagger fil-format 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

Jekk għamilt notifiki Slack, tirċievi messaġġ meta tinqabeż l-iskadenza biex jitlesta jew jintlaħaq in-numru massimu ta' reviżjonijiet falluti f'analiżi:

Skjeramenti awtomatiċi tal-Canary ma' Flagger u Istio

Bħala konklużjoni

It-tħaddim ta 'malji ta' servizz bħal Istio fuq Kubernetes se jipprovdi metriċi, zkuk, u zkuk awtomatiċi, iżda l-iskjerament ta 'tagħbija tax-xogħol xorta jiddependi fuq għodod esterni. Flagger għandu l-għan li jibdel dan billi jżid il-kapaċitajiet Istio twassil progressiv.

Flagger huwa kompatibbli ma 'kwalunkwe soluzzjoni CI/CD għal Kubernetes, u l-analiżi tal-kanarji tista' tiġi estiża faċilment webhooks biex iwettaq testijiet ta 'integrazzjoni/aċċettazzjoni tas-sistema, testijiet tat-tagħbija jew kwalunkwe test personalizzat ieħor. Minħabba li Flagger huwa dikjarattiv u jirrispondi għall-avvenimenti Kubernetes, jista 'jintuża fil-pipelines GitOps flimkien ma' Nisġa Fluss jew JenkinsX. Jekk qed tuża JenkinsX, tista 'tinstalla Flagger b'add-ons jx.

Flagger appoġġjat Weaveworks u jipprovdi skjeramenti tal-kanarji fi Weave Cloud. Il-proġett huwa ttestjat fuq GKE, EKS u bare metal b'kubeadm.

Jekk għandek suġġerimenti biex ittejjeb Flagger, jekk jogħġbok ibgħat kwistjoni jew PR fuq GitHub fuq stefanprodan/flagger. Il-kontribuzzjonijiet huma aktar minn milqugħa!

Grazzi Ray Tsang.

Sors: www.habr.com

Żid kumment