Automatikus canary telepítések Flaggerrel és Istióval

Automatikus canary telepítések Flaggerrel és Istióval

A CD-t a vállalati szoftvergyakorlat részeként ismerték el; ez a CI jól bevált elveinek természetes evolúciója. Ugyanakkor a CD még mindig meglehetősen ritka, valószínűleg a bonyolult irányítás és a rendszer rendelkezésre állására ható hibás telepítések miatti félelem következtében.

Flagger egy nyílt forráskódú Kubernetes operátor, amelynek célja a zavaros kapcsolatok kiküszöbölése. Automatizálja a canary telepítések előmozdítását az Istio forgalomelterelés és a Prometheus metrikák használatával, hogy elemezze az alkalmazás viselkedését a szabályozott telepítés során.

Az alábbiakban lépésről lépésre ismertetjük a Flagger beállítását és használatát a Google Kubernetes Engine (GKE) szolgáltatásban.

Kubernetes klaszter beállítása

Először is hozzon létre egy GKE klasztert Istio kiegészítővel (ha nincs GCP fiókja, itt regisztrálhat itt ingyenes kreditekért).

Jelentkezzen be a Google Cloudba, hozzon létre egy projektet és aktiválja a számlázást. Telepítse a parancssori eszközt gcloud és állítsa be projektjét a következőkkel: gcloud init.

Állítsa be az alapértelmezett projektet, a számítási régiót és a zónát (cserélje ki PROJECT_ID a saját projektjére):

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

Engedélyezze a GKE szolgáltatást és hozzon létre egy klasztert HPA és Istio kiegészítőkkel:

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

A fenti parancs létrehoz egy alapértelmezett csomópontpultot, amely két VM-t tartalmaz. n1-standard-2 (vCPU: 2, RAM 7,5 GB, lemez: 30 GB). Ideális esetben az Istio komponenseit el kellene különíteni a munkaterheléseitől, de egyszerű módja az Istio podok elkülönített csomópontban való futtatásának nem létezik. Az Istio manifesztjei csak olvashatók, és a GKE visszavonja a változtatásokat, például a csomópontra való kötést vagy a podról való leválasztást.

Állítsa be az adatokat a következőhöz: kubectl:

gcloud container clusters get-credentials istio

Hozzon létre egy klaszter adminisztrátor szerepköti kötést:

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

Telepítse a parancssori eszközt: Helm:

brew install kubernetes-helm

A Homebrew 2.0 mostantól elérhető a Linux.

Hozzon létre egy szolgáltatásfiókot és szerepköti kötést a Tiller számára:

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

Telepítse a Tiller-t a névterületen kube-system:

helm init --service-account tiller

Fontolja meg az SSL használatát a Helm és a Tiller között. További információkért a Helm telepítésének védelméről lásd: docs.helm.sh

Ellenőrizze a beállításokat:

kubectl -n istio-system get svc

Néhány másodperc múlva a GCP ki fogja osztani a külső IP-címet a szolgáltatás számára istio-ingressgateway.

Az Istio belépési átjáró beállítása

Hozzon létre egy statikus IP-címet a névvel istio-gateway, az Istio átjáró IP-címének használatával:

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

Most szüksége van egy internetes domainre és hozzáférésre a DNS regisztrátorához. Két A rekordot kell hozzáadnia (cserélje le example.com a saját domainjára):

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

Győződjön meg róla, hogy a DNS wildcard működik:

watch host test.istio.example.com

Hozzon létre egy közös Istio átjárót, hogy HTTP-n keresztül nyújtson szolgáltatásokat a service mesh-en kívül:

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

Mentse a fenti erőforrást public-gateway.yaml néven, majd alkalmazza:

kubectl apply -f ./public-gateway.yaml

Egyetlen éles rendszer sem nyújthat szolgáltatásokat az interneten SSL nélkül. Az Istio bejárati átjárójának védelméhez cert-manager, CloudDNS és Let’s Encrypt segítségével kérjük, olvassa el: a dokumentációval Flagger GKE.

Flagger telepítése

A GKE Istio frissítése nem tartalmazza a Prometheus példányt, amely az Istio telemetriai szolgáltatások törlését végzi. Mivel a Flagger az Istio HTTP metrikákat használja a canary elemzéshez, telepítenie kell a következő Prometheus konfigurációt, amely hasonló ahhoz, amely az Istio Helm hivatalos sémájával érkezik.

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

Adja hozzá a Flagger Helm tárolót:

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

Telepítse a Flaggert a névterületen istio-system, Slack értesítésekkel együtt:

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

A Flagert bármely névtérbe telepítheti, ha az képes interakcióba lépni az Istio Prometheus szolgáltatással a 9090-es porton keresztül.

A Flaggernek van egy Grafana irányítópultja a canary elemzéshez. Telepítse a Grafranát a névtérbe 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

Nyissa meg a Grafanát egy nyilvános átjárón keresztül egy virtuális szolgáltatás létrehozásával (cserélje ki example.com a saját domainjé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

Mentse el a fenti erőforrást grafana-virtual-service.yaml néven, majd alkalmazza:

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

Ha meglátogatja a http://grafana.istio.example.com böngészőben, akkor az be kell, hogy irányítsa a Grafana bejelentkezési oldalára.

Webalkalmazások telepítése Flaggel

A Flagger telepíti a Kubernetes-t, és szükség esetén vízszintes automatikus skálázást (HPA) végez, majd létrehoz egy sor objektumot (Kubernetes telepítések, ClusterIP szolgáltatások és Istio virtuális szolgáltatások). Ezek az objektumok felfedik az alkalmazást a service mesh-en, és irányítják a kanári elemzést és promóciót.

Automatikus canary telepítések Flaggerrel és Istióval

Hozzon létre egy teszt névteret az Istio Sidecar telepítéssel:

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

Hozzon létre egy telepítést és a pod automatikus vízszintes skálázási eszközét:

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

Telepítse a tesztforgalom-generáló szolgáltatást a kanári elemzés idejére:

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

Hozzon létre egy egyedi kanári erőforrást (cserélje ki example.com a saját domainjára):

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

Mentse el a fenti erőforrást podinfo-canary.yaml néven, majd alkalmazza:

kubectl apply -f ./podinfo-canary.yaml

A fenti elemzés, ha sikeres, öt percig fog futni, és HTTP metrikákat ellenőriz majd félpercenként. A következő képlettel tudja meghatározni a kanári telepítés ellenőrzéséhez és promóciójához szükséges minimális időt: interval * (maxWeight / stepWeight). A Kanári CRD mezők dokumentálva vannak. itt.

Pár másodpercen belül a Flagger létrehozza a kanári objektumokat:

# 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

Nyissa meg a böngészőt, és lépjen a következőhöz app.istio.example.com, látnia kell a verziószámot demo alkalmazás.

Automatikus canary elemzés és promóció

A Flagger megvalósít egy vezérlési ciklust, amely fokozatosan irányítja a forgalmat a canary-re, miközben méri a kulcsfontosságú teljesítménymutatókat, mint például a HTTP-kérések sikerességi aránya, a kérések átlagos időtartama és a pod elérhetősége. A KPI-k elemzése alapján a canary előléptethető vagy leállítható, és az elemzés eredményeit közzéteszi a Slack-en.

Automatikus canary telepítések Flaggerrel és Istióval

Canary telepítés indítása a következő objektumok egyikének megváltoztatásakor:

  • PodSpec telepítés (konténerkép, parancs, portok, környezeti változók stb.)
  • A ConfigMapok kötetként van felszerelve, vagy környezeti változókként felhasználhatóak
  • A titkok kötetként van felszerelve, vagy környezeti változókként felhasználhatóak

A canary telepítés indítása a konténerkép frissítésekor:

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

A Flagger észleli, hogy a telepítés verziója megváltozott, és elkezdi annak elemzését:

kubectl -n test describe canary/podinfo

Események:

Új verzió észlelve podinfo.test
Felismerés podinfo.test
Várakozás a podinfo.test alkalmazás kiadásának befejezésére: 0 a 1 frissített replikák elérhetőek
Canary súlyának növelése: 5
Canary súlyának növelése: 10
Canary súlyának növelése: 15
Canary súlyának növelése: 20
Canary súlyának növelése: 25
Canary súlyának növelése: 30
Canary súlyának növelése: 35
Canary súlyának növelése: 40
Canary súlyának növelése: 45
Canary súlyának növelése: 50
A podinfo.test sablon beállításának másolása a podinfo-primary.test-re
Várakozás a podinfo-primary.test alkalmazás kiadásának befejezésére: 1 a 2 frissített replikák elérhetőek
Promóció befejezve! A podinfo.test csökkentése

Elemzés közben a canary eredményeit a Grafana segítségével nyomon követheti:

Automatikus canary telepítések Flaggerrel és Istióval

Fontos: Ha új módosításokat alkalmaznak a telepítésre a canary elemzés során, a Flagger újraindítja az elemzési fázist.

Készítse el a canaryk listáját a klaszterében:

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Folyamatban   15       2019-01-16T14:05:07Z
prod        frontend  Sikerült     0        2019-01-15T16:15:07Z
prod        backend   Sikertelen     0        2019-01-14T17:05:07Z

Ha aktiválta a Slack értesítéseket, a következő üzeneteket érheti el:

Automatikus canary telepítések Flaggerrel és Istióval

Automatikus visszavonás

A canary elemzés alatt szintetikus HTTP 500 hibákat és magas válaszidőt generálhat, hogy ellenőrizze, hogy a Flagger megállítja-e a telepítést.

Hozzon létre egy teszt podot, és hajtsa végre a következő utasítást benne:

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

HTTP 500 hibák generálása:

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

Késleltetés generálása:

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

Amikor a sikertelen ellenőrzések száma eléri a küszöbértéket, a forgalom visszairányul az elsődleges csatornára, a canary leáll, és a telepítés sikertelenné válik.

A canary hibákat és a késleltetési csúcsokat a Kubernetes eseményeként rögzítik és a Flagger JSON formátumban naplózza:

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

Canary telepítés indítása a podinfo.test esetén
Podinfo.test canary súlyozás 5
Podinfo.test canary súlyozás 10
Podinfo.test canary súlyozás 15
Halt podinfo.test előrehaladási sikerességi arány 69.17% < 99%
Halt podinfo.test előrehaladási sikerességi arány 61.39% < 99%
Halt podinfo.test előrehaladási sikerességi arány 55.06% < 99%
Halt podinfo.test előrehaladási sikerességi arány 47.00% < 99%
Halt podinfo.test előrehaladási sikerességi arány 37.00%  500ms
Halt podinfo.test előrehaladási kérés időtartama 1.600s > 500ms
Halt podinfo.test előrehaladási kérés időtartama 1.915s > 500ms
Halt podinfo.test előrehaladási kérés időtartama 2.050s > 500ms
Halt podinfo.test előrehaladási kérés időtartama 2.515s > 500ms
Visszagörgetés podinfo.test hibás ellenőrzés küszöbérték elérve 10
Canary megbukott! A podinfo.test leállítása

Ha engedélyezted a Slack értesítéseket, akkor értesítést kapsz, amikor meghaladja a végrehajtási határidőt vagy eléri a maximális számú sikertelen ellenőrzést az elemzés során:

Automatikus canary telepítések Flaggerrel és Istióval

Végül

A szolgáltatások hálózatának, például az Istio futtatása a Kubernetes mellett automatikus metrikákat, naplókat és protokollokat biztosít, de a terhelések telepítése még mindig külső eszközöktől függ. A Flagger célja, hogy megváltoztassa ezt a helyzetet az Istio funkcióinak hozzáadásával progresív szállítás.

A Flagger kompatibilis bármilyen CI/CD megoldással a Kubernetes számára, és a canary elemzés könnyen kiterjeszthető webhookokkal rendszertesztelés, integrációs/autonóm vizsgálatok, terheléses tesztek vagy bármilyen más felhasználói ellenőrzések végrehajtásához. Mivel a Flagger deklaratív és reagál a Kubernetes eseményekre, használható GitOps munkafolyamatokban is a Weave Flux vagy JenkinsX. Ha JenkinsX-et használsz, a Flaggert jx bővítményekkel telepítheted.

A Flaggert támogatja Weaveworks és biztosítja a canary telepítéseket a Weave Cloud. A projektet a GKE, EKS és „csupasz hardver” kubeadm-jén tesztelik.

Ha van javaslatod a Flagger fejlesztésére, kérjük, küldj egy kérdést vagy PR-t a GitHubra a következő címre stefanprodan/flagger. A hozzájárulások többet üdvözölni fognak!

Köszönöm Ray Chen.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster