Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Ny CD dia ekena ho fampiharana rindrambaiko orinasa ary vokatry ny fivoarana voajanahary amin'ny fitsipika CI efa napetraka. Na izany aza, mbola tsy fahita firy ny CD, angamba noho ny fahasarotan'ny fitantanana sy ny tahotra ny fametrahana tsy nahomby izay misy fiantraikany amin'ny fisian'ny rafitra.

flagger dia mpandraharaha Kubernetes loharano misokatra izay mikendry ny hanafoana ny fifandraisana misavoritaka. Izy io dia manamboatra automatique ny fampiroboroboana ny fametrahana canary amin'ny alàlan'ny Istio traffic offset sy ny Prometheus metrics handinihana ny fitondran-tena amin'ny fampiharana mandritra ny famoahana voarindra.

Ity ambany ity ny torolalana tsikelikely amin'ny fametrahana sy fampiasana Flagger amin'ny Google Kubernetes Engine (GKE).

Fametrahana cluster Kubernetes

Manomboka amin'ny famoronana cluster GKE miaraka amin'ny add-on Istio ianao (raha tsy manana kaonty GCP ianao dia afaka misoratra anarana eto - hahazoana crédit maimaimpoana).

Midira ao amin'ny Google Cloud, mamorona tetikasa ary avelao ny faktiora ho azy. Ampidiro ny utility andalana baiko gcloud ary amboary ny tetikasanao miaraka amin'ny gcloud init.

Mametraha tetikasa default, faritra kajy ary faritra (soloina PROJECT_ID ho an'ny tetikasanao):

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

Alefaso ny serivisy GKE ary mamorona cluster miaraka amin'ny HPA sy 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

Ny baiko etsy ambony dia hamorona dobo node default misy VM roa n1-standard-2 (vCPU: 2, RAM 7,5 GB, kapila: 30 GB). Ny tsara indrindra dia tokony hanasaraka ny singa Istio amin'ny enta-mavesatrao ianao, saingy tsy misy fomba mora hampandehanana Istio Pods ao anaty dobo misy node voatokana. Heverina ho vakiana ihany ny fanehoana Istio ary hanafoana ny fanovana rehetra ny GKE, toy ny fampifandraisana amina node na fanalana amin'ny pod.

Mametraha fahazoan-dàlana ho an'ny kubectl:

gcloud container clusters get-credentials istio

Mamorona andraikitry ny mpitantana cluster:

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

Apetraho ny fitaovana andalana baiko fiarovan-doha:

brew install kubernetes-helm

Homebrew 2.0 dia azo alaina ho an'ny Linux.

Mamorona kaonty serivisy sy andraikitry ny cluster ho an'ny Tiller:

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

Expand Tiller amin'ny namespace kube-system:

helm init --service-account tiller

Tokony handinika ny fampiasana SSL eo anelanelan'ny Helm sy Tiller ianao. Raha mila fanazavana fanampiny momba ny fiarovana ny fametrahana Helm anao dia jereo docs.helm.sh

Hamafiso ny fanovana:

kubectl -n istio-system get svc

Rehefa afaka segondra vitsy, dia tokony hanome adiresy IP ivelany ho an'ny serivisy ny GCP istio-ingressgateway.

Fametrahana ny vavahadin'i Istio Ingress

Mamorona adiresy IP static misy anarana istio-gatewaymampiasa ny adiresy IP an'ny vavahadin'i 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

Mila sehatra Internet ianao izao ary miditra amin'ny rejisitra DNS anao. Ampio rakitsoratra A roa (soloina example.com ao amin'ny fonenanao):

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

Hamarino fa miasa ny DNS wildcard:

watch host test.istio.example.com

Mamorona vavahadin-tserasera Istio mba hanomezana tolotra ivelan'ny serivisy amin'ny 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:
        - "*"

Tehirizo ho public-gateway.yaml ity loharano etsy ambony ity ary ampiharo izany:

kubectl apply -f ./public-gateway.yaml

Tsy misy rafitra famokarana tokony hanome tolotra amin'ny Internet tsy misy SSL. Mba hiantohana ny vavahadin'ny Istio ingress miaraka amin'ny mpitantana fanamarinana, CloudDNS ary Let's Encrypt, vakio azafady tahirin-kevitra Flagger G.K.E.

Fametrahana Flagger

Ny add-on GKE Istio dia tsy ahitana ohatra Prometheus izay manadio ny serivisy telemetry Istio. Satria mampiasa metrika HTTP Istio i Flagger mba hanaovana famakafakana canary, dia mila mametraka ity fanamafisam-peo Prometheus manaraka ity ianao, mitovy amin'ilay miaraka amin'ny tetika ofisialy Istio Helm.

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

Ampio ny tahiry Flagger Helm:

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

Hanitatra ny Flagger mankany amin'ny namespace istio-systemamin'ny alàlan'ny fampandehanana ny fampandrenesana 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

Azonao atao ny mametraka Flagger amin'ny sehatra rehetra raha mbola afaka mifandray amin'ny serivisy Istio Prometheus amin'ny seranan-tsambo 9090.

Flagger dia manana dashboard Grafana ho an'ny famakafakana canary. Mametraka Grafana amin'ny namespace 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

Asehoy ny Grafana amin'ny alàlan'ny vavahady misokatra amin'ny alàlan'ny famoronana serivisy virtoaly (solo example.com ao amin'ny fonenanao):

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

Tehirizo ho grafana-virtual-service.yaml ity loharano etsy ambony ity ary ampiharo izany:

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

Rehefa mifindra any http://grafana.istio.example.com ao amin'ny navigateur dia tokony halefa any amin'ny pejy fidirana Grafana ianao.

Mametraka rindranasa tranonkala miaraka amin'ny Flagger

Mandefa Kubernetes ny Flagger ary manitsy ho azy (HPA), avy eo mamorona andian-javatra (fametrahana Kubernetes, serivisy ClusterIP, ary serivisy virtoaly Istio). Ireo zavatra ireo dia mampiharihary ny fampiharana amin'ny serivisy serivisy ary mitantana ny fanadihadiana sy ny fandrosoana canary.

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Mamorona toerana anaram-panadinana miaraka amin'ny tsindrona Istio Sidecar afaka:

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

Mamoròna famelarana sy fitaovana fanamafisam-peo automatique pod:

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

Mametraka serivisy entana andrana mba hiteraka fifamoivoizana mandritra ny famakafakana canary:

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

Mamorona loharano canary mahazatra (soloina example.com ao amin'ny fonenanao):

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

Tehirizo ity loharano etsy ambony ity ho podinfo-canary.yaml ary ampiharo izany:

kubectl apply -f ./podinfo-canary.yaml

Ny famakafakana etsy ambony, raha mahomby, dia haharitra dimy minitra, manamarina ny metrika HTTP isaky ny antsasaky ny minitra. Azonao atao ny mamaritra ny fotoana faran'izay kely ilaina amin'ny fanamarinana sy fampiroboroboana ny fametrahana ny canary amin'ny alàlan'ny formula manaraka: interval * (maxWeight / stepWeight). Voarakitra an-tsoratra ny saha CRD Canary eto.

Aorian'ny segondra vitsy dia hamorona zavatra canary i Flagger:

# 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

Sokafy navigateur ary mandehana any app.istio.example.com, tokony ho hitanao ny laharan'ny dikan- fampiharana demo.

Fanadihadiana sy fampiroboroboana canary mandeha ho azy

Ny Flagger dia mametraka tsipika fanaraha-maso izay mamindra tsikelikely ny fifamoivoizana mankany amin'ny canary rehefa mandrefy ireo metrika zava-bita lehibe toy ny tahan'ny fahombiazana amin'ny fangatahana HTTP, ny faharetan'ny fangatahana antonony ary ny fahasalaman'ny pod. Mifototra amin'ny famakafakana KPI, ny canary dia fampiroboroboana na tapaka, ary ny valin'ny fanadihadiana dia navoaka tamin'ny Slack.

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Ny fametrahana canary dia mipoitra rehefa miova ny iray amin'ireto zavatra manaraka ireto:

  • Ampidiro PodSpec (sary fitoeran-javatra, baiko, seranan-tsambo, env, sns.)
  • Ny ConfigMaps dia apetaka amin'ny boky na sarintany amin'ny fari-piainan'ny tontolo iainana
  • Ny tsiambaratelo dia apetraka amin'ny boky na avadika ho fari-piainan'ny tontolo iainana

Alefaso ny canary deploy rehefa manavao sary container:

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

Hitan'i Flagger fa niova ny dikan-teny fampiasa ary nanomboka namadika azy:

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

Mandritra ny famakafakana, ny vokatry ny canary dia azo jerena amin'ny fampiasana Grafana:

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Mariho fa raha misy fanovana vaovao ampiharina amin'ny fametrahana mandritra ny famakafakana canary, dia hanomboka indray ny dingana famakafakana ny Flagger.

Ataovy lisitra ny canary rehetra ao amin'ny cluster anao:

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

Raha navelanao ny fampandrenesana Slack dia hahazo ireto hafatra manaraka ireto ianao:

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Famerenana mandeha ho azy

Mandritra ny famakafakana canary, azonao atao ny miteraka lesoka HTTP 500 synthetic sy ny famaliana avo lenta hahitana raha hampiato ny fandefasana ny Flagger.

Mamorona pod fitsapana ary ataovy izao manaraka izao:

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

Mamorona hadisoana HTTP 500:

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

Famoahana fahatarana:

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

Rehefa tonga eo amin'ny tokonam-baravarana ny isan'ny fisavana tsy nahomby, dia averina any amin'ny fantsona voalohany ny fifamoivoizana, ahena ho aotra ny canary, ary voamarika ho tsy nahomby ny fandefasana.

Ny hadisoana amin'ny canary sy ny fiakaran'ny latency dia voarakitra ho hetsika Kubernetes ary nosoratan'i Flagger amin'ny endrika 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

Raha navelanao ny fampandrenesana Slack dia hahazo hafatra ianao rehefa tapitra ny fe-potoana na tratra ny isan'ny fisavana tsy nahomby tamin'ny famakafakana:

Fametrahana canary mandeha ho azy miaraka amin'ny Flagger sy Istio

Ho famaranana

Ny fampandehanana harato serivisy toa an'i Istio ho fanampin'ny Kubernetes dia hanome metrika, logs ary protocole mandeha ho azy, saingy miankina amin'ny fitaovana ivelany ny fametrahana enta-mavesatra. Ny Flagger dia mikendry ny hanova izany amin'ny alàlan'ny fampidirana ny fahaizan'i Istio famatsiana mivoatra.

Ny Flagger dia mifanaraka amin'ny vahaolana Kubernetes CI/CD rehetra, ary azo itarina mora foana ny fanadihadiana canary webhooks hanao andrana fampidirana/fanekena ny rafitra, andrana entana, na fisavana mahazatra hafa. Satria ny Flagger dia manambara ary mamaly ny hetsika Kubernetes, dia azo ampiasaina amin'ny fantsona GitOps miaraka amin'ny Weave Flux na JenkinsX. Raha mampiasa JenkinsX ianao dia afaka mametraka Flagger miaraka amin'ny jx addons.

Flagger tohanana Weaveworks ary manome deployments canary ao Weave Cloud. Ny tetikasa dia andrana amin'ny GKE, EKS, ary metaly miboridana miaraka amin'ny kubeadm.

Raha manana soso-kevitra hanatsarana ny Flagger ianao dia alefaso olana na PR ao amin'ny GitHub ao stefanprodan/flagger. Mankasitraka indrindra ny fandraisana anjara!

Спасибо Ray Tsang.

Source: www.habr.com

Add a comment