Deploy automatik canary me Flagger dhe Istio

Deploy automatik canary me Flagger dhe Istio

CD njihet si një praktikë e softuerit korporativ, dhe është rezultat i evolucionit të natyrshëm të parimeve të vendosura CI. Megjithatë, CD mbetet ende një fenomen relativisht i rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga implementimet e dështuara që ndikojnë në disponueshmërinë e sistemit.

Flagger është një operator Kubernetes me burim të hapur, me qëllim të eliminimit të ndërvarësive të ndërlikuara. Ai automatizon avancimin e implementimeve canary duke përdorur devijimin e trafik në Istio dhe metrikat Prometheus për të analizuar sjelljen e aplikacionit gjatë një daljeje të menaxhuar.

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

Konfigurimi i klasterit Kubernetes

Filloni me krijimin e një klasteri GKE me shtesën Istio (nëse nuk keni një llogari GCP, mund të regjistroheni këtu - për të marrë kredi falas).

Hyni në Google Cloud, krijoni një projekt dhe aktivizoni faturimin për të. Instaloni utilitarin e komandës gcloud dhe konfigurojeni projektin tuaj me gcloud init.

Caktoni projektin si më të zakonshëm, rajonin e llogaritjes dhe zonën (zëvendësoni PROJECT_ID me projektin tuaj):

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

Aktivizoni shërbimin GKE dhe krijoni një klaster me HPA dhe shtesa 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 nodash të zakonshëm, përfshirë dy VM n1-standard-2 (vCPU: 2, RAM 7.5 GB, disk: 30 GB). Idealisht, është e dëshirueshme të izoloheni komponentët e Istio nga ngarkesat tuaja, por nuk ka një mënyrë të thjeshtë për të nisur podet Istio në një grup nodash të veçantë. Manifestet e Istio konsiderohen vetëm për lexim, dhe GKE do të anulojë çdo ndryshim, si p.sh. lidhjen me një nodë ose shkëputjen nga një pod.

Konfiguroni kredencialet për kubectl:

gcloud container clusters get-credentials istio

Krijoni një lidhje roli për administrimin e klasterit:

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

Instaloni mjetin e komandës Helm:

brew install kubernetes-helm

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

Krijoni një llogari shërbimi dhe një lidhje roli për Tiller:

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

Depozitoni Tiller në hapësirën kubectl -n kube-system edit cm kubelet-config-1.16:

helm init --service-account tiller

Duhet të merrni parasysh përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion mbi mbrojtjen e instalimit të Helm, shihni docs.helm.sh

Konfirmoni konfigurimet:

kubectl -n istio-system get svc

Pas disa sekondash, GCP duhet të caktojë një adresë IP të jashtme për shërbimin istio-ingressgateway.

Konfigurimi i portës hyrëse Istio

Krijoni një adresë IP statike me emrin istio-gateway, duke 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 ju nevojitet një domen interneti dhe qasje në regjistruesin tuaj DNS. Shtoni dy regjistra A (zëvendësoni example.com me domenin tuaj):

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

Sigurohuni që wildcard DNS funksionon:

watch host test.istio.example.com

Krijoni një portë të përbashkët Istio për të ofruar shërbime përtej service mesh në 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 aplikoni atë:

kubectl apply -f ./public-gateway.yaml

AsnjĂ« sistem prodhues nuk duhet tĂ« ofrojĂ« shĂ«rbime nĂ« internet pa SSL. PĂ«r tĂ« mbrojtur portĂ«n hyrĂ«se Istio me cert-manager, CloudDNS dhe Let’s Encrypt, ju lutemi lexoni dokumentacioni Flagger GKE.

Instalimi i Flagger

Shtesa GKE Istio nuk përfshin një instancë Prometheus, e cila merret me pastrimin e shërbimeve të telemetrisë Istio. Duke qenë se Flagger përdor metrikat Istio HTTP për të kryer analizën canary, ju duhet të implementoni konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që ofrohet me diagramin zyrtar të Helm të Istio.

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

Shtoni repozitorin Flagger Helm:

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

Depozitoni Flagger në hapësirën istio-system, duke përfshirë 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ë, për sa kohë që ai mund të bashkëpunojë me shërbimin Istio Prometheus përmes portit 9090.

Flagger ka një panel monitorimi Grafana për analizën canary. Instaloni Grafana në hapësirë 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

Zbulo Grafana përmes një gateways të hapur duke krijuar një shërbim virtual (zëvendësoni example.com me domainin 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 më sipër si grafana-virtual-service.yaml dhe më pas aplikoni atë:

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

Duke kaluar tek http://grafana.istio.example.com në shfletues do të duhet t'ju drejtojë në faqen e hyrjes së Grafana.

Deployimi i aplikacioneve web me Flagger

Flagger deployon Kubernetes dhe, kur është e nevojshme, horizontale automatizim të shkallës (HPA), pastaj krijon një seri objektesh (deployime Kubernetes, shërbime ClusterIP dhe shërbime virtuale Istio). Këto objekte zbulojnë aplikacionin në service mesh dhe menaxhojnë analizën dhe përparimin e canary.

Deploy automatik canary me Flagger dhe Istio

Krijoni një hapësirë provuese me aktivizimin e Istio Sidecar:

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

Krijoni një deploy dhe mjetin e automatizuar të shkallës horizontale të pods:

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

Deployoni shërbimin e ngarkesës provuese për të gjeneruar trafik gjatë analizës canary:

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

Krijoni një burim canary të personalizuar (zëvendësoni example.com me 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 më sipër si podinfo-canary.yaml dhe më pas aplikoni atë:

kubectl apply -f ./podinfo-canary.yaml

Analiza e mësipërme, në rast suksesi, do të ekzekutohet për pesë minuta me verifikimin e metrikave HTTP çdo gjysmë minute. Mund të përcaktoni kohën minimale të nevojshme për verifikimin dhe përparimin e deploy-it canary sipas formulës së mëposhtme: interval * (maxWeight / stepWeight). Fushat e Canary CRD dokumentohen këtu.

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

# 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 një shfletues dhe shkoni në app.istio.example.com, duhet të shihni numrin e versions të aplikacionit demo.

Analiza dhe avancimi automatik kanarin

Flagger implementon një cikël menaxhimi që gradualisht zhvendos trafikun në kanarin, duke matur njëkohësisht treguesit kryesorë të performancës si niveli i suksesit të kërkesave HTTP, koha mesatare e kërkesave dhe disponueshmëria e pod-it. Bazuar në analizën e KPI-ve, kanarina promovon ose ndalet, dhe rezultatet e analizës publikohen në Slack.

Deploy automatik canary me Flagger dhe Istio

Ndërrimi i kanarin fillon me ndryshimin e një nga objekte të mëposhtme:

  • Specifikimi i ndĂ«rrimit Pod (imazhi i kontejnerit, komanda, portet, mjedisi etj.)
  • ConfigMaps montohen si volume ose transformohen nĂ« variabla mjedisi
  • Sekretet montohen si volume ose transformohen nĂ« variabla mjedisi

Fillimi i ndërrimit kanarin me përditësimin e imazhit të kontejnerit:

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

Flagger zbulohet se versioni i ndërrimit është ndryshuar dhe fillon ta analizojë atë:

kubectl -n test describe canary/podinfo

Ngjarjet:

Revision e re e zbuluar podinfo.test
Po shkallëzohet podinfo.test
Po pret për përfundimin e roll-out-it të podinfo.test: 0 nga 1 replikat e përditësuara janë të disponueshme
Avanconi peshën kanarin të podinfo.test 5
Avanconi peshën kanarin të podinfo.test 10
Avanconi peshën kanarin të podinfo.test 15
Avanconi peshën kanarin të podinfo.test 20
Avanconi peshën kanarin të podinfo.test 25
Avanconi peshën kanarin të podinfo.test 30
Avanconi peshën kanarin të podinfo.test 35
Avanconi peshën kanarin të podinfo.test 40
Avanconi peshën kanarin të podinfo.test 45
Avanconi peshën kanarin të podinfo.test 50
Duke kopjuar specifikimin e templarit të podinfo.test në podinfo-primary.test
Po pret për përfundimin e roll-out-it të podinfo-primary.test: 1 nga 2 replikat e përditësuara janë të disponueshme
Promovimi përfundoi! Po shkallëzohet podinfo.test

Gjatë analizës, rezultatet kanarin mund të ndjeken përmes Grafana:

Deploy automatik canary me Flagger dhe Istio

Kujdes: nëse ndryshimet e reja aplicohen për ndërrimin gjatë analizës kanarina, Flagger do të rifillojë fazën e analizës.

Bëni një listë të të gjitha "kanarive" në klasterin tuaj:

watch kubectl get canaries --all-namespaces
NAMESPACE   EMRI      STADI       PESHA   KOHA E KALUAR
test        podinfo   Po avancon   15       2019-01-16T14:05:07Z
prod        frontend  Suksesit     0        2019-01-15T16:15:07Z
prod        backend   Dështuar     0        2019-01-14T17:15:07Z

Nëse keni aktivizuar njoftimet Slack, do të merrni mesazhe të tilla:

Deploy automatik canary me Flagger dhe Istio

Rikthimi automatik

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

Krijoni një pod testimi dhe ekzekutoni veprimin e mëposhtëm:

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

Generimi i gabimeve HTTP 500:

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

Generimi i vonesës:

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

Kur numri i kontrolleve të dështuar arrin vlerën kufitare, trafiku kthehet në kanalin primar, canary shkallëzohet në zero, dhe deploy damkoset si i dështuar.

Gabimet canary dhe majat e vonesave regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në format JSON:

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

Duke filluar me deploy canary për podinfo.test
Avanconi peshën canary të podinfo.test 5
Avanconi peshën canary të podinfo.test 10
Avanconi peshën canary të podinfo.test 15
Ndalo avancimin e podinfo.test me shkallën e suksesit 69.17% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 61.39% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 55.06% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 47.00% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 37.00%  500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 1.600s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 1.915s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 2.050s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 2.515s > 500ms
Rivendos podinfo.test threshold dështimesh të arritura 10
Canary dështoi! Duke e shkallëzuar poshtë podinfo.test

Nëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur kaloni afatin e ekzekutimit ose arritni numrin maksimal të dështimeve gjatë analizës:

Deploy automatik canary me Flagger dhe Istio

Në përfundim

Këtu dërgohet një rrjet shërbimi, siç është Istio, përveç Kubernetes, ofron metrika automatik, log-e dhe protokolle, por depolimi i ngarkesave akoma varet nga mjete të jashtme. Flagger duhet ta ndryshojë këtë situatë duke shtuar mundësitë e Istio dërgesës progresive.

Flagger është i pajtueshëm me çdo zgjidhje CI/CD për Kubernetes, dhe analiza canary mund të zgjerohet lehtësisht me webhooks për ekzekutimin e testeve sistemike të integrimit/pranimit, teste ngarkese ose çdo kontroll tjetër përdoruesi. Si Flagger është deklerativ dhe reagon ndaj ngjarjeve Kubernetes, mund të përdoret në pipeline të GitOps së bashku me Weave Flux ose JenkinsX. Nëse përdorni JenkinsX, mund të instaloni Flagger me shtesa jx.

Flagger mbështetet nga Weaveworks dhe siguron dërgesa canary në Weave Cloud. Projekti testohet në GKE, EKS dhe "harduerin e zbrazët" me kubeadm.

Nëse keni rekomandime për përmirësimin e Flagger, ju lutemi dërgoni një pyetje ose PR në GitHub në adresën stefanprodan/flagger. Kontributet janë më se të mirëpritura!

Faleminderit Ray Tsan.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster