
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.
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 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 é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-aEngedé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_PERMISSIVEA 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 istioHozzon 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: :
brew install kubernetes-helmA Homebrew 2.0 mostantól elérhető a .
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:tillerTelepítse a Tiller-t a névterületen kube-system:
helm init --service-account tillerFontolja 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:
Ellenőrizze a beállításokat:
kubectl -n istio-system get svcNé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-central1Most 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.comHozzon 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.yamlEgyetlen é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: 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.yamlAdja 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=flaggerA 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-meNyissa 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-grafanaMentse el a fenti erőforrást grafana-virtual-service.yaml néven, majd alkalmazza:
kubectl apply -f ./grafana-virtual-service.yamlHa 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.
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.yamlHozzon 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.yamlTelepítse a tesztforgalom-generáló szolgáltatást a kanári elemzés idejére:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testHozzon 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.yamlA 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. .
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/podinfoNyissa 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 .
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.
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.1A 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éseElemzés közben a canary eredményeit a Grafana segítségével nyomon követheti:
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:07ZHa aktiválta a Slack értesítéseket, a következő üzeneteket érheti el:
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 shHTTP 500 hibák generálása:
watch curl http://podinfo-canary:9898/status/500Késleltetés generálása:
figyeld curl http://podinfo-canary:9898/delay/1Amikor 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ásaHa 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:
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 .
A Flagger kompatibilis bármilyen CI/CD megoldással a Kubernetes számára, és a canary elemzés könnyen kiterjeszthető 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 vagy . Ha JenkinsX-et használsz, a Flaggert jx bővítményekkel telepítheted.
A Flaggert támogatja és biztosítja a canary telepítéseket a . 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 . A hozzájárulások többet üdvözölni fognak!
Köszönöm .
Forrás: habr.com
