CD wordt erkend als een bedrijfssoftwarepraktijk en is een natuurlijke evolutie van gevestigde CI-principes. CD is echter nog steeds vrij zeldzaam, misschien vanwege de complexiteit van het beheer en de angst voor mislukte implementaties die de beschikbaarheid van het systeem aantasten.
Hieronder vindt u een stapsgewijze handleiding voor het instellen en gebruiken van Flagger op Google Kubernetes Engine (GKE).
Een Kubernetes-cluster opzetten
U begint met het maken van een GKE-cluster met de Istio-add-on (als u geen GCP-account heeft, kunt u zich aanmelden
Log in bij Google Cloud, maak een project en schakel de facturering ervoor in. Installeer het opdrachtregelhulpprogramma gcloud init
.
Stel het standaardproject, het rekengebied en de zone in (replace PROJECT_ID
voor uw project):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Schakel de GKE-service in en maak een cluster met HPA- en 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
Met de bovenstaande opdracht wordt een standaard knooppuntpool gemaakt die uit twee VM's bestaat n1-standard-2
(vCPU: 2, RAM 7,5 GB, schijf: 30 GB). Idealiter zouden Istio-componenten moeten worden geïsoleerd van hun werklast, maar er is geen eenvoudige manier om Istio-pods op een speciale knooppuntpool uit te voeren. Istio-manifesten worden als alleen-lezen beschouwd en GKE zal alle wijzigingen, zoals het binden aan een knooppunt of het loskoppelen van een pod, ongedaan maken.
Referenties instellen voor kubectl
:
gcloud container clusters get-credentials istio
Maak een clusterbeheerdersrolbinding:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Installeer het opdrachtregelprogramma
brew install kubernetes-helm
Homebrew 2.0 is nu ook beschikbaar voor
Maak een serviceaccount en clusterrolbinding voor Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Vouw Tiller uit in de naamruimte kube-system
:
helm init --service-account tiller
Overweeg het gebruik van SSL tussen Helm en Tiller. Zie voor meer informatie over het beveiligen van uw Helm-installatie
Instellingen bevestigen:
kubectl -n istio-system get svc
Na een paar seconden moet GCP een extern IP-adres aan de service toewijzen istio-ingressgateway
.
Een Istio Ingress-gateway instellen
Maak een statisch IP-adres met de naam istio-gateway
met behulp van het IP-adres van de Istio-gateway:
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
Nu hebt u een internetdomein en toegang tot uw DNS-registrar nodig. Voeg twee A-records toe (vervang example.com
naar uw domein):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Controleer of de DNS-wildcard werkt:
watch host test.istio.example.com
Maak een generieke Istio-gateway om services buiten de service mesh via HTTP te leveren:
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:
- "*"
Sla de bovenstaande bron op als public-gateway.yaml en pas deze vervolgens toe:
kubectl apply -f ./public-gateway.yaml
Geen enkel productiesysteem mag zonder SSL diensten op internet aanbieden. Lees om uw Istio-ingangsgateway te beveiligen met cert-manager, CloudDNS en Let's Encrypt
Flagger-installatie
De GKE Istio-add-on bevat niet de Prometheus-instantie die de Istio-telemetrieservice opschoont. Omdat Flagger Istio HTTP-statistieken gebruikt om kanarie-analyses uit te voeren, moet u de volgende Prometheus-configuratie implementeren, vergelijkbaar met de configuratie die bij het officiële Istio Helm-schema wordt geleverd.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Voeg de Flagger Helm-repository toe:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Vouw Flagger uit naar naamruimte istio-system
door Slack-meldingen in te schakelen:
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
U kunt Flagger in elke naamruimte installeren, zolang deze maar kan communiceren met de Istio Prometheus-service op poort 9090.
Flagger heeft een Grafana-dashboard voor kanarie-analyse. Installeer Grafana in de naamruimte 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
Stel Grafana bloot via een open gateway door een virtuele service te creëren (replace example.com
naar uw domein):
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
Sla de bovenstaande bron op als grafana-virtual-service.yaml en pas deze vervolgens toe:
kubectl apply -f ./grafana-virtual-service.yaml
Wanneer naar http://grafana.istio.example.com
Uw browser zou u moeten doorverwijzen naar de Grafana-inlogpagina.
Webapplicaties implementeren met Flagger
Flagger implementeert Kubernetes en, indien nodig, horizontale autoscaling (HPA), en creëert vervolgens een reeks objecten (Kubernetes-implementaties, ClusterIP-services en Istio virtuele services). Deze objecten stellen de applicatie bloot aan het servicegaas en beheren de canarische analyse en promotie.
Maak een testnaamruimte met Istio Sidecar-implementatie ingeschakeld:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Maak een implementatie en een hulpmiddel voor automatisch horizontaal schalen voor de pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Implementeer een belastingtestservice om verkeer te genereren tijdens canarische analyse:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Maak een aangepaste kanariebron (replace example.com
naar uw domein):
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/"
Sla de bovenstaande bron op als podinfo-canary.yaml en pas deze vervolgens toe:
kubectl apply -f ./podinfo-canary.yaml
Indien de bovenstaande analyse succesvol is, wordt deze vijf minuten uitgevoerd, waarbij elke halve minuut de HTTP-statistieken worden gecontroleerd. U kunt de minimale tijd bepalen die nodig is om een kanarie-implementatie te testen en te promoten met behulp van de volgende formule: interval * (maxWeight / stepWeight)
. Canarische CRD-velden zijn gedocumenteerd
Na een paar seconden zal Flagger kanarie-objecten maken:
# 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
Open uw browser en ga naar app.istio.example.com
, zou u het versienummer moeten zien
Automatische kanarie-analyse en promotie
Flagger implementeert een controlelus die verkeer geleidelijk naar de kanarie verplaatst, terwijl belangrijke prestatie-indicatoren worden gemeten, zoals het slagingspercentage van HTTP-verzoeken, de gemiddelde verzoekduur en de gezondheid van de pod. Op basis van de KPI-analyse wordt de kanarie gepromoveerd of beëindigd en worden de resultaten van de analyse gepubliceerd in Slack.
Kanarie-implementatie wordt geactiveerd wanneer een van de volgende objecten verandert:
- Implementeer PodSpec (containerimage, opdracht, poorten, env, enz.)
- ConfigMaps worden als volumes gemount of geconverteerd naar omgevingsvariabelen
- Geheimen worden als volumes aangekoppeld of omgezet in omgevingsvariabelen
Voer een canary-implementatie uit bij het bijwerken van de containerimage:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger detecteert dat de implementatieversie is gewijzigd en begint deze te analyseren:
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
Tijdens de analyse kunnen de kanarieresultaten worden gevolgd met behulp van Grafana:
Let op: als er tijdens de kanarie-analyse nieuwe wijzigingen worden toegepast op de implementatie, zal Flagger de analysefase opnieuw starten.
Maak een lijst van alle kanaries in je cluster:
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
Als je Slack-meldingen hebt ingeschakeld, ontvang je de volgende berichten:
Automatisch terugdraaien
Tijdens canary-analyse kunt u synthetische HTTP 500-fouten en een hoge reactielatentie genereren om te controleren of Flagger de implementatie stopt.
Maak een testpod en doe daarin het volgende:
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-fouten genereren:
watch curl http://podinfo-canary:9898/status/500
Vertraging genereren:
watch curl http://podinfo-canary:9898/delay/1
Wanneer het aantal mislukte controles een drempelwaarde bereikt, wordt het verkeer teruggestuurd naar het primaire kanaal, wordt de kanarie naar nul geschaald en wordt de implementatie als mislukt gemarkeerd.
Canarische fouten en latentiepieken worden geregistreerd als Kubernetes-gebeurtenissen en vastgelegd door Flagger in JSON-indeling:
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
Als u Slack-meldingen heeft ingeschakeld, ontvangt u een bericht wanneer de deadline voor het voltooien of bereiken van het maximale aantal mislukte beoordelingen in een analyse wordt overschreden:
Concluderend
Het uitvoeren van een servicemesh zoals Istio bovenop Kubernetes levert automatische statistieken, logboeken en logboeken op, maar de implementatie van workloads is nog steeds afhankelijk van externe tools. Flagger wil dit veranderen door Istio-mogelijkheden toe te voegen
Flagger is compatibel met elke CI/CD-oplossing voor Kubernetes, en kanarie-analyse kan eenvoudig worden uitgebreid met
Flagger ondersteund
Als u suggesties heeft voor het verbeteren van Flagger, dien dan een probleem of PR in op GitHub op
Dank
Bron: www.habr.com