Vendosje automatike të kanarinave me Flagger dhe Istio

Vendosje automatike të kanarinave me Flagger dhe Istio

CD-ja njihet si një praktikë e softuerit të ndërmarrjes dhe është një evolucion natyror i parimeve të vendosura CI. Megjithatë, CD-ja është ende mjaft e rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga vendosjet e dështuara që ndikojnë në disponueshmërinë e sistemit.

Flamurtar është një operator Kubernetes me burim të hapur që synon të eliminojë marrëdhëniet konfuze. Ai automatizon promovimin e vendosjeve të kanarinave duke përdorur kompensimet e trafikut Istio dhe metrikat e Prometheus për të analizuar sjelljen e aplikacionit gjatë një prezantimi të menaxhuar.

Më poshtë është një udhëzues hap pas hapi për konfigurimin dhe përdorimin e Flagger në Google Kubernetes Engine (GKE).

Vendosja e një grupi Kubernetes

Ju filloni duke krijuar një grup GKE me shtesën Istio (nëse nuk keni një llogari GCP, mund të regjistroheni këtu - për të marrë kredite falas).

Identifikohu në Google Cloud, krijo një projekt dhe aktivizo faturimin për të. Instaloni programin e linjës së komandës gcloud dhe konfiguroni projektin tuaj me gcloud init.

Vendosni projektin e paracaktuar, zonën e llogaritjes dhe zonën (zëvendësoni PROJECT_ID për projektin tuaj):

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

Aktivizo shërbimin GKE dhe krijoni një grup me shtesat HPA dhe 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

Komanda e mësipërme do të krijojë një grup nyjesh të paracaktuar të përbërë nga dy VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Në mënyrë ideale, komponentët Istio duhet të izolohen nga ngarkesat e tyre të punës, por nuk ka asnjë mënyrë të lehtë për të ekzekutuar pods Istio në një grup të dedikuar nyjesh. Manifestet Istio konsiderohen vetëm për lexim dhe GKE do të rikthejë çdo ndryshim të tillë si lidhja me një nyje ose shkëputja nga një pod.

Vendosni kredencialet për kubectl:

gcloud container clusters get-credentials istio

Krijo një lidhje të rolit të administratorit të grupit:

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

Instaloni mjetin e linjës së komandës kaskë:

brew install kubernetes-helm

Homebrew 2.0 tani është gjithashtu i disponueshëm për Linux.

Krijo një llogari shërbimi dhe një lidhje të roleve grupore për Tiller:

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

Zgjero Tiller në hapësirën e emrave kube-system:

helm init --service-account tiller

Ju duhet të konsideroni përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion rreth mbrojtjes së instalimit të timonit, shihni docs.helm.sh

Konfirmo cilësimet:

kubectl -n istio-system get svc

Pas disa sekondash, GCP duhet t'i caktojë një adresë IP të jashtme shërbimit istio-ingressgateway.

Vendosja e një porte hyrëse të Istio

Krijoni një adresë IP statike me emrin istio-gatewayduke përdorur adresën IP të portës 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

Tani keni nevojë për një domen interneti dhe akses te regjistruesi juaj DNS. Shtoni dy regjistrime A (zëvendësoni example.com në domenin tuaj):

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

Verifikoni që kartoni DNS po funksionon:

watch host test.istio.example.com

Krijo një portë gjenerike Istio për të ofruar shërbime jashtë rrjetës së shërbimit mbi 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:
        - "*"

Ruani burimin e mësipërm si public-gateway.yaml dhe më pas aplikojeni:

kubectl apply -f ./public-gateway.yaml

Asnjë sistem prodhimi nuk duhet të ofrojë shërbime në internet pa SSL. Për të siguruar portën tuaj të hyrjes në Istio me menaxherin e certifikatës, CloudDNS dhe Let's Encrypt, ju lutemi lexoni dokumentacionin Flamurtari G.K.E.

Instalimi i flagerit

Shtesa GKE Istio nuk përfshin shembullin Prometheus që pastron shërbimin e telemetrisë Istio. Meqenëse Flagger përdor matjet e Istio HTTP për të kryer analizën e kanarinave, ju duhet të vendosni konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që vjen me skemën zyrtare të Istio Helm.

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

Shtoni depon e Flagger Helm:

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

Zgjero Flagger në hapësirën e emrit istio-systemduke aktivizuar njoftimet 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

Mund ta instaloni Flagger në çdo hapësirë ​​emri për sa kohë që mund të komunikojë me shërbimin Istio Prometheus në portin 9090.

Flagger ka një pult Grafana për analizat e kanarinave. Instaloni Grafana në hapësirën e emrave 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

Ekspozoni Grafana përmes një porte të hapur duke krijuar një shërbim virtual (zëvendësojeni example.com në domenin tuaj):

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

Ruani burimin e mësipërm si grafana-virtual-service.yaml dhe më pas aplikojeni:

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

Kur shkon në http://grafana.istio.example.com Shfletuesi juaj duhet t'ju ridrejtojë në faqen e hyrjes në Grafana.

Vendosja e aplikacioneve në ueb me Flagger

Flagger vendos Kubernetes dhe, nëse është e nevojshme, shkallëzimin automatik horizontal (HPA), më pas krijon një seri objektesh (vendosjet e Kubernetes, shërbimet ClusterIP dhe shërbimet virtuale Istio). Këto objekte e ekspozojnë aplikacionin ndaj rrjetës së shërbimit dhe menaxhojnë analizën dhe promovimin e kanarinave.

Vendosje automatike të kanarinave me Flagger dhe Istio

Krijo një hapësirë ​​emri testimi me implementimin Istio Sidecar të aktivizuar:

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

Krijoni një vendosje dhe një mjet automatik të shkallëzimit horizontal për podin:

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

Vendosni një shërbim testimi të ngarkesës për të gjeneruar trafik gjatë analizës së kanarinës:

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

Krijoni një burim të personalizuar të kanarinës (zëvendësoni example.com në domenin tuaj):

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

Ruani burimin e mësipërm si podinfo-canary.yaml dhe më pas aplikojeni:

kubectl apply -f ./podinfo-canary.yaml

Analiza e mësipërme, nëse është e suksesshme, do të zgjasë për pesë minuta, duke kontrolluar matjet e HTTP çdo gjysmë minutë. Ju mund të përcaktoni kohën minimale të nevojshme për të testuar dhe promovuar vendosjen e një kanarine duke përdorur formulën e mëposhtme: interval * (maxWeight / stepWeight). Fushat e CRD Kanarie janë të dokumentuara këtu.

Pas disa sekondash, Flagger do të krijojë objekte kanarinë:

# 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

Hapni shfletuesin tuaj dhe shkoni te app.istio.example.com, duhet të shihni numrin e versionit aplikacionet demo.

Analiza dhe promovim automatik i kanarinave

Flagger zbaton një qark kontrolli që lëviz gradualisht trafikun te kanarina ndërsa mat treguesit kryesorë të performancës si p.sh. shkallën e suksesit të kërkesës HTTP, kohëzgjatjen mesatare të kërkesës dhe shëndetin e pod. Bazuar në analizën e KPI, kanarina promovohet ose ndërpritet, dhe rezultatet e analizës publikohen në Slack.

Vendosje automatike të kanarinave me Flagger dhe Istio

Shpërndarja e kanarisë aktivizohet kur ndryshon një nga objektet e mëposhtme:

  • Vendosni PodSpec (imazhi i kontejnerit, komanda, portet, env, etj.)
  • ConfigMaps montohen si vëllime ose konvertohen në variabla të mjedisit
  • Sekretet montohen si vëllime ose konvertohen në variabla të mjedisit

Ekzekutoni vendosjen e kanarisë kur përditësoni imazhin e kontejnerit:

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

Flagger zbulon se versioni i vendosjes ka ndryshuar dhe fillon ta analizojë atë:

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

Gjatë analizës, rezultatet e kanarinës mund të monitorohen duke përdorur Grafana:

Vendosje automatike të kanarinave me Flagger dhe Istio

Ju lutemi vini re: nëse zbatohen ndryshime të reja në vendosjen gjatë analizës së kanarinave, Flagger do të rifillojë fazën e analizës.

Bëni një listë të të gjitha kanarinave në grupin tuaj:

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

Nëse keni aktivizuar njoftimet Slack, do të merrni mesazhet e mëposhtme:

Vendosje automatike të kanarinave me Flagger dhe Istio

Rikthim automatik

Gjatë analizës së kanarisë, mund të gjeneroni gabime sintetike HTTP 500 dhe vonesë të lartë të përgjigjes për të kontrolluar nëse Flagger do të ndalojë vendosjen.

Krijoni një pod testimi dhe bëni sa më poshtë në të:

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

Gjenerimi i gabimeve HTTP 500:

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

Gjenerimi i vonesës:

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

Kur numri i kontrolleve të dështuara arrin një prag, trafiku drejtohet përsëri në kanalin kryesor, kanarina shkallëzohet në zero dhe vendosja shënohet si e dështuar.

Gabimet e kanarisë dhe pikat e vonesës regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në formatin 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

Nëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur afati i fundit për plotësimin ose arritjen e numrit maksimal të rishikimeve të dështuara në një analizë është tejkaluar:

Vendosje automatike të kanarinave me Flagger dhe Istio

Në përfundim

Drejtimi i një rrjeti shërbimi si Istio në krye të Kubernetes do të sigurojë metrikë, regjistra dhe regjistra automatikë, por vendosja e ngarkesave të punës ende varet nga mjetet e jashtme. Flagger synon ta ndryshojë këtë duke shtuar aftësitë Istio shpërndarje progresive.

Flagger është i pajtueshëm me çdo zgjidhje CI/CD për Kubernetes, dhe analiza e kanarinës mund të zgjerohet lehtësisht me webhooks për të kryer testet e integrimit/pranimit të sistemit, testet e ngarkesës ose çdo test tjetër me porosi. Për shkak se Flagger është deklarativ dhe u përgjigjet ngjarjeve të Kubernetes, ai mund të përdoret në tubacionet GitOps së bashku me Fluksi i endjes ose JenkinsX. Nëse jeni duke përdorur JenkinsX, mund të instaloni Flagger me shtesa jx.

Flagger i mbështetur Punime endëse dhe ofron vendosje të kanarinave në Weave Cloud. Projekti është testuar në GKE, EKS dhe metal të zhveshur me kubeadm.

Nëse keni sugjerime për përmirësimin e Flagger, ju lutemi paraqisni një problem ose PR në GitHub në stefanprodan / flamurtar. Kontributet janë më se të mirëseardhura!

Falënderim Ray Tsang.

Burimi: www.habr.com

Shto një koment