Dërgesat automatike canary me Flagger dhe Istio

Dërgesat automatike canary me Flagger dhe Istio

CD është pranuar si praktikë e softuerit të korporatave, dhe është rezultat i evolucionit natyror të parimeve të konsoliduara CI. Megjithatë, CD mbetet ende një fenomen relativisht i rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga shpërndarjet me dështim që ndikojnë në disponueshmërinë e sistemit.

Flagger është një operues Kubernetes me burim të hapur, qëllimi i të cilit është të eliminojë lidhjet e ndërlikuara. Ai automatizon promovimin e shpërndarjeve canary duke përdorur zhvendosjen e trafikut Istio dhe metrikat Prometheus për të analizuar sjelljen e aplikacionit gjatë një lëshimi të kontrolluar.

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

Konfigurimi i klasterit Kubernetes

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

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

Caktoni projektin si default, 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 në default, që përfshin dy VM n1-standard-2 (vCPU: 2, RAM 7.5 GB, disk: 30 GB). Idealisht, vlen të izolohesh komponentët e Istio nga ngarkesat tuaja të punës, por nuk ka një mënyrë të thjeshtë për të ekzekutuar konteinerët e Istio në një grup nodash të dedikuar. Manifestimet e Istio konsiderohen si lexueshmëri vetëm, dhe GKE do të anuloj çdo ndryshim, si lidhja me një nodë ose ndarjen nga një kontejner.

Konfiguroni kredencialet për kubectl:

gcloud container clusters get-credentials istio

Krijoni një lidhje roli të administratorit të 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 Linux.

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

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

Shpërndani Tiller në hapësirën kube-system:

helm init --service-account tiller

Duhet të shqyrtoni përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion rreth mbrojtjes së 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ë domene interneti dhe akses te regjistruesi juaj DNS. Shtoni dy regjistrime A (zëvendësoni example.com me domenin tuaj):

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

Sigurohuni që wildcards DNS të funksionojnë:

watch host test.istio.example.com

Krijoni një portë të përbashkët Istio për të ofruar shërbime jashtë service mesh me 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 prodhimi 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 dokumentacion Flagger GKE.

Instalimi i Flagger

Ndërtesa Istio GKE nuk përfshin një instancë Prometheus e cila merret me pastrimin e shërbimit të telemetrisë Istio. Duke qenë se Flagger përdor metrika Istio HTTP për të kryer analizën canary, duhet të shpërndani konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që ofrohet 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 Flagger Helm:

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

Shpërndani Flagger në hapësirën istio-system, duke përfshirë njoftime 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ë nëse mund të interagoni 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ë porte të hapur duke krijuar një shërbim virtual (zëvendësoni example.com me 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 atë:

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

Kur të kaloni te http://grafana.istio.example.com në shfletuesin tuaj, duhet të drejtoheni në faqen e hyrjes së Grafana.

Dërgimi i aplikacioneve web me Flagger

Flagger bën deploy në Kubernetes dhe, nëse është e nevojshme, automatizimin horizontal të shkallës (HPA), pastaj krijon një seri objektesh (deployments Kubernetes, shërbime ClusterIP dhe shërbime virtuale Istio). Këto objekte zgjerojnë aplikacionin në service mesh dhe menaxhojnë analizën dhe avancimin canary.

Dërgesat automatike canary me Flagger dhe Istio

Krijoni një namespace testimi me implementimin e Istio Sidecar të aktivizuar:

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

Krijoni një deploy dhe një mjet për automatizimin horizontal të shkallës për podin:

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

Aktivizoni shërbimin e testit të ngarkesës për të gjeneruar trafik gjatë analizës canary:

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

Krijoni një burim canary personal (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 e mësipërm si podinfo-canary.yaml dhe më pas aplikojeni atë:

kubectl apply -f ./podinfo-canary.yaml

Analiza e mësipërme, në rast suksesi, do të realizohet për pesë minuta me kontrollin e metrikave HTTP çdo gjysmë minute. Mund të përcaktoni kohën minimale të nevojshme për verifikimin dhe avancimin e deploy-it canary me formulën e 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 shfletuesin dhe shkoni në app.istio.example.com, duhet të shihni numrin e versionit të aplikacionit demo.

Analizë dhe avancim automatik i canary

Flagger implementon një cikël menaxhimi, i cili gradualisht kalon trafikun në canary, duke matur njëkohësisht treguesit kryesorë të performancës, siç janë norma e suksesit të kërkesave HTTP, koha mesatare e përgjigjeve dhe vazhdimësia e pod-it. Bazuar në analizën e KPI-ve, canary avancon ose ndalet, dhe rezultatet e analizës publikohen në Slack.

Dërgesat automatike canary me Flagger dhe Istio

Deploy-i canary niset kur ndryshohet një nga objektet e mëposhtme:

  • Deploy PodSpec (imazhi i konteinerit, komanda, portet, env etj.)
  • ConfigMaps montohen si vĂ«llime ose transformohen nĂ« variabla mjedisi
  • Sekretet montohen si vĂ«llime ose transformohen nĂ« variabla mjedisi

Nisja e deploy-it canary gjatë përditësimit të imazhit të konteinerit:

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

Flagger zbulon se versioni i deploy-it është ndryshuar dhe fillon ta analizojë atë:

kubectl -n test describe canary/podinfo

Ngjarjet:

Revision e re u zbulua podinfo.test
Po shkallëzohet podinfo.test
Po pret që roll-out-i i podinfo.test të përfundojë: 0 nga 1 replikat e përditësuara janë të disponueshme
Avancimi i peshës canary për podinfo.test 5
Avancimi i peshës canary për podinfo.test 10
Avancimi i peshës canary për podinfo.test 15
Avancimi i peshës canary për podinfo.test 20
Avancimi i peshës canary për podinfo.test 25
Avancimi i peshës canary për podinfo.test 30
Avancimi i peshës canary për podinfo.test 35
Avancimi i peshës canary për podinfo.test 40
Avancimi i peshës canary për podinfo.test 45
Avancimi i peshës canary për podinfo.test 50
Duke kopjuar specifikimin e shablonit të podinfo.test në podinfo-primary.test
Po pret që roll-out-i i podinfo-primary.test të përfundojë: 1 nga 2 replikat e përditësuara janë të disponueshme
Promovimi përfundoi! Po zvogëlohet podinfo.test

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

Dërgesat automatike canary me Flagger dhe Istio

Vini re: nëse aplikoni ndryshime të reja ndaj deploy-it gjatë analizës canary, Flagger do të rinis fazën e analizës.

Krijoni një listë të të gjitha «canary» në klasterin tuaj:

watch kubectl get canaries --all-namespaces
NAMESPACE   EMRI      STATUS        Pesha   KOHA E FUNDIT
test        podinfo   Po përparon   15       2019-01-16T14:05:07Z
prod        frontend  Sukses     0        2019-01-15T16:15:07Z
prod        backend   Dështoi        0        2019-01-14T17:05:07Z

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

Dërgesat automatike canary me Flagger dhe Istio

Rikthim automatik

Gjatë analizës canary, mund të gjeneroni gabime sintetike HTTP 500 dhe vonesa të larta të përgjigjeve për të kontrolluar nëse Flagger do ta ndalë deploy-in.

Krijoni një pod testues dhe kryeni 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

Gjenerimi i gabimeve HTTP 500:

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

Gjenerimi i vonesës:

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

Kur numri i provimeve të dështuara arrin vlerën përjashtuese, trafiku kthehet në kanalin primar, canary eskalon në zero dhe deploy-i shënohet si i dështuar.

Gabimet canary dhe piket e vonesave regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në formatin JSON:

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

Duke filluar implementimin canary për podinfo.test
Rrit pesha canary podinfo.test 5
Rrit pesha canary podinfo.test 10
Rrit pesha canary podinfo.test 15
Ndalo avancimin e podinfo.test shkalla e suksesit 69.17% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 61.39% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 55.06% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 47.00% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 37.00%  500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 1.600s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 1.915s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 2.050s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 2.515s > 500ms
Po kthehet podinfo.test numri i kontrollimeve të dështuara arriti 10
Canary dështon! Duke iu zvogëluar podinfo.test

Nëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur të tejkaloni afatin e përfundimit ose të arrini numrin maksimal të dështimeve gjatë analizës:

Dërgesat automatike canary me Flagger dhe Istio

Në përfundim

Startimi i një rrjeti shërbimesh, si Istio, përveç Kubernetes do të ofrojë metrikë, loge dhe protokolle automatike, por implementimi i ngarkesave të punës ende varet nga mjetet e jashtme. Flagger ka për qëllim të ndryshojë këtë situatë duke shtuar Istio mundësi dorëzimi progresiv.

Flagger është në përputhje me çdo zgjidhje CI/CD për Kubernetes, dhe analiza canary mund të zgjerohet lehtësisht me webhooks për kryerjen e provave sistemike të integrimit/pranimit, provave nën ngarkesë ose çdo kontroll tjetër të personalizuar. Duke qenë se Flagger është deklarativ dhe reagon ndaj ngjarjeve të Kubernetes, mund të përdoret në lidhjet GitOps së bashku me Weave Flux ose JenkinsX. Nëse përdorni JenkinsX, mund të instaloni Flagger me shtesat jx.

Flagger mbështetet nga Weaveworks dhe siguron implementime canary në Weave Cloud. Projekti teston në GKE, EKS dhe "zhguni metalik" me kubeadm.

Nëse keni sugjerime 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ë shumë se të mirëpritura!

anonim kommentatorit Rey Cani.

Burimi: habr.com

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