Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

CD wekî pratîkek nermalava pargîdaniyê tê nas kirin û encama pêşveçûnek xwezayî ya prensîbên CI-yê yên sazkirî ye. Lêbelê, CD hîn jî pir kêm e, dibe ku ji ber tevliheviya rêveberiyê û tirsa sepanên têkçûyî ku bandorê li hebûna pergalê dike.

flagger operatorek Kubernetes çavkaniyek vekirî ye ku armanc dike ku têkiliyên tevlihev ji holê rake. Ew bi karanîna vesazkirina seyrûsefera Istio û metrîkên Prometheus ve pêşvebirina danasîna kanariyan otomatîk dike da ku behreya serîlêdanê di dema vekêşana birêvebirî de analîz bike.

Li jêr rêbernameyek gav bi gav ji bo sazkirin û karanîna Flagger li ser Google Kubernetes Engine (GKE) heye.

Sazkirina komek Kubernetes

Hûn bi pêveka Istio re dest bi afirandina komek GKE-yê dikin (heke we hesabek GCP-ê tune, hûn dikarin qeyd bikin vir - ji bo ku krediyên belaş bistînin).

Têkeve Google Cloud-ê, projeyek biafirînin û ji bo wê fatûreyê çalak bikin. Karsaziya rêzika fermanê saz bikin gcloud û projeya xwe bi gcloud init.

Projeya xwerû, qada hesabkirinê, û deverê bicîh bikin (li şûna PROJECT_ID ji bo projeya we):

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

Karûbarê GKE çalak bikin û bi pêvekên HPA û Istio re komek biafirînin:

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

Fermana li jor dê hewzek girêkek xwerû ya ku du VM jî tê de ye biafirîne n1-standard-2 (vCPU: 2, RAM 7,5 GB, dîsk: 30 GB). Bi îdeal, divê hûn hêmanên Istio ji barkêşên xebata xwe veqetînin, lê rêyek hêsan tune ku hûn Istio Pods di hewzek diyarkirî ya girêkan de bimeşînin. Manîfestoyên Istio tenê-xwendewar têne hesibandin û GKE dê her guhartinan betal bike, wek mînak girêdana bi nodek an veqetandina ji podek.

Ji bo pêbaweriyan saz bikin kubectl:

gcloud container clusters get-credentials istio

Girêdana rola rêveberê komê biafirîne:

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

Amûra rêza fermanê saz bikin Bêr:

brew install kubernetes-helm

Homebrew 2.0 niha ji bo jî heye Linux.

Ji bo Tiller hesabek karûbar û girêdana rola komê biafirînin:

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

Tiller di navan de berfireh bikin kube-system:

helm init --service-account tiller

Pêdivî ye ku hûn SSL-ê di navbera Helm û Tiller de bikar bînin. Ji bo bêtir agahdarî di derbarê parastina sazkirina Helmê de, bibînin docs.helm.sh

Mîhengan piştrast bikin:

kubectl -n istio-system get svc

Piştî çend saniyan, GCP divê ji bo karûbarê navnîşanek IP-ya derveyî destnîşan bike istio-ingressgateway.

Veavakirina Deriyê Ingressê ya Istio

Navnîşanek IP-ya statîk bi navek çêbikin istio-gatewaybi karanîna navnîşana IP-ê ya dergehê 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

Naha hûn hewceyê domainek înternetê û gihîştina tomara DNS-ya xwe hewce ne. Du tomar A lê zêde bike (li şûna example.com ji domaina xwe re):

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

Piştrast bikin ku kartê çolê DNS dixebite:

watch host test.istio.example.com

Dergehek Istio ya gelemperî biafirînin da ku karûbarên li derveyî tevna karûbarê li ser HTTP peyda bikin:

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:
        - "*"

Çavkaniya jorîn wekî public-gateway.yaml hilînin û dûv re wê bicîh bikin:

kubectl apply -f ./public-gateway.yaml

Divê tu pergala hilberînê li ser Înternetê bêyî SSL karûbar peyda neke. Ji bo ewlekirina dergehê ketina Istio bi cert-rêveber, CloudDNS û Let's Encrypt, ji kerema xwe bixwînin belgekirin Flager G.K.E.

Installation Flagger

Pêveka GKE Istio mînakek Prometheus ku karûbarê telemetrîya Istio paqij dike vedihewîne. Ji ber ku Flagger metrîkên Istio HTTP bikar tîne da ku analîza canary bike, hûn hewce ne ku veavakirina Prometheus ya jêrîn, mîna ya ku bi şemaya fermî ya Istio Helm re tê, bicîh bikin.

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

Depoya Flagger Helm zêde bikin:

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

Flagger li cîhê navan berfireh bike istio-systembi çalakkirina notifications 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

Hûn dikarin Flagger di her navekî de saz bikin heya ku ew dikare bi karûbarê Istio Prometheus re li ser porta 9090 re têkilî daynin.

Flagger ji bo analîza kenarê tabloyek Grafana heye. Grafana di navan de saz bikin 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 di nav dergehek vekirî de bi afirandina karûbarek virtual (li şûna example.com ji domaina xwe re):

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

Çavkaniya jorîn wekî grafana-virtual-service.yaml hilînin û dûv re wê bicîh bikin:

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

Dema ku diçin http://grafana.istio.example.com di gerokê de, divê hûn berbi rûpela têketina Grafana ve werin rêve kirin.

Bi Flagger re serîlêdanên webê bicîh dikin

Flagger Kubernetes bi cîh dike û vebijarkî bixweber (HPA) dipîve, dûv re rêzek tiştan diafirîne (bikaranîna Kubernetes, karûbarên ClusterIP, û karûbarên virtual Istio). Van tiştan serîlêdanê li ser tevna karûbarê radixe ber çavan û analîz û pêşkeftina canaryê kontrol dike.

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Bi derzîlêdana Istio Sidecar çalakkirî navek navek ceribandinê biafirînin:

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

Veguheztinek û amûrek pîvana otomatîkî ya pod biafirînin:

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

Karûbarek barkirina ceribandinê bicîh bikin ku di dema analîza canary de seyrûseferê çêbike:

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

Çavkaniyek canary xwerû biafirînin (li şûna example.com ji domaina xwe re):

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

Çavkaniya jorîn wekî podinfo-canary.yaml hilînin û dûv re wê bicîh bikin:

kubectl apply -f ./podinfo-canary.yaml

Analîza jorîn, heke serketî be, dê pênc hûrdeman bimeşîne, her nîv hûrdem metrîkên HTTP-ê kontrol bike. Hûn dikarin dema herî hindik a ku ji bo erêkirin û pêşvebirina belavkirina kanariyê bi karanîna formula jêrîn hewce dike diyar bikin: interval * (maxWeight / stepWeight). Zeviyên CRD yên Kanaryayê têne belge kirin vir.

Piştî çend saniyeyan, Flagger dê tiştên kanaryan biafirîne:

# 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

Gerokek vekin û biçin app.istio.example.com, divê hûn jimareya guhertoyê bibînin sepanên demo.

Analîz û danasîna canaryên otomatîkî

Flagger pêleka kontrolê pêk tîne ku hêdî hêdî seyrûseferê ber bi kanariyê ve dipîve dema ku pîvanên performansa sereke yên wekî rêjeya serkeftina daxwaza HTTP, dirêjahiya daxwaziya navîn, û tenduristiya pod dipîve. Li ser bingeha analîza KPI-ê, kanar tê pêşve xistin an qut kirin, û encamên analîzê ji Slack re têne weşandin.

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Dema ku yek ji hêmanên jêrîn biguhere, belavkirina Kanaryayê tê destpêkirin:

  • PodSpec (wêneya konteyner, ferman, port, env, hwd.) bicîh bikin
  • ConfigMaps wekî cild têne danîn an jî li guhêrbarên jîngehê têne nexşandin
  • Veşartî wekî cild têne danîn an vediguhezînin guhêrbarên hawîrdorê

Dema ku wêneyek konteynerê nûve dike, danasîna canary bimeşîne:

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

Flagger destnîşan dike ku guhertoya bicîhkirinê guheriye û dest bi parskirina wê dike:

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

Di dema analîzê de, encamên canary dikare bi karanîna Grafana were şopandin:

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Ji kerema xwe bala xwe bidin ku heke di dema analîza kanaryan de guhertinên nû li ser vesazkirinê werin sepandin, wê hingê Flagger dê qonaxa analîzê ji nû ve bide destpêkirin.

Navnîşek hemî kanareyên di koma xwe de çêbikin:

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

Ger we agahdariya Slack çalak kiribe, hûn ê peyamên jêrîn bistînin:

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Vegera otomatîk

Di dema analîza canary de, hûn dikarin xeletiyên HTTP 500-a sentetîk û derengiya bersivê ya bilind biafirînin da ku bibînin ka Flagger dê bicîhkirinê rawestîne.

Pîvanek testê biafirînin û di wê de jêrîn bikin:

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

Hilberîna xeletiyên HTTP 500:

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

Nifşa derengmayînê:

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

Dema ku jimareya kontrolên têkçûyî digihîje astekê, seyrûsefer berbi kanala bingehîn ve tê rêve kirin, kanar bi sifirê tê pîvandin, û bicîhkirin wekî têkçûyî tê nîşankirin.

Çewtiyên Kanarya û pêlên derengiyê wekî bûyerên Kubernetes têne tomar kirin û ji hêla Flagger ve di formata JSON de têne tomar kirin:

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

Ger we agahdariya Slack çalak kiribe, gava ku mawe derbas bibe an jî hejmara herî zêde ya kontrolên têkçûyî di analîzê de were gihîştin dê peyamek bistînin:

Bi Flagger û Istio ve birêkûpêkkirina canaryên otomatîkî

Di encamê de

Rêvekirina tevnek karûbarê mîna Istio ji bilî Kubernetes dê metrîk, têketin û protokolên otomatîk peyda bike, lê bicîhkirina barkirina xebatê hîn jî bi amûrên derveyî ve girêdayî ye. Flagger armanc dike ku vê yekê bi zêdekirina kapasîteyên Istio biguhezîne dabînkirina pêşverû.

Flagger bi her çareseriya Kubernetes CI/CD-ê re hevaheng e, û analîza canary bi hêsanî dikare bi webhooks ji bo pêkanîna ceribandinên entegrasyonê / pejirandinê, ceribandinên barkirinê, an kontrolên xwerû yên din. Ji ber ku Flagger diyarker e û bersivê dide bûyerên Kubernetes, ew dikare di lûleyên GitOps de bi hev re were bikar anîn. Weave Flux an JenkinsX. Heke hûn JenkinsX bikar tînin hûn dikarin Flagger bi pêvekên jx saz bikin.

Flagger piştgirî kir Weaveworks û di nav de şaneyên kanariyan peyda dike Weave Cloud. Proje li ser GKE, EKS, û metal tazî bi kubeadm tê ceribandin.

Ger ji bo baştirkirina Flagger pêşniyarên we hene, ji kerema xwe pirsgirêkek an PR-ê li ser GitHub bişînin stefanprodan / flagger. Beşdariyên ji xêrhatin zêdetir in!

Sipî Ray Tsang.

Source: www.habr.com

Add a comment