Automatische kanarie-implementaties met Flagger en Istio

Automatische kanarie-implementaties met Flagger en Istio

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.

Vlagger is een open source Kubernetes-operator die verwarrende relaties wil elimineren. Het automatiseert de promotie van canary-implementaties met behulp van Istio-verkeerscompensaties en Prometheus-statistieken om applicatiegedrag tijdens een beheerde implementatie te analyseren.

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 hier - om gratis credits te ontvangen).

Log in bij Google Cloud, maak een project en schakel de facturering ervoor in. Installeer het opdrachtregelhulpprogramma gwolk en configureer uw project met 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 Stuurstand:

brew install kubernetes-helm

Homebrew 2.0 is nu ook beschikbaar voor Linux.

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 docs.helm.sh

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-gatewaymet 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 de documentatie Vlagger G.K.E.

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-systemdoor 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.

Automatische kanarie-implementaties met Flagger en Istio

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 hier.

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 demo-applicaties.

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.

Automatische kanarie-implementaties met Flagger en Istio

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:

Automatische kanarie-implementaties met Flagger en Istio

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:

Automatische kanarie-implementaties met Flagger en Istio

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:

Automatische kanarie-implementaties met Flagger en Istio

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 progressieve levering.

Flagger is compatibel met elke CI/CD-oplossing voor Kubernetes, en kanarie-analyse kan eenvoudig worden uitgebreid met webhaken om systeemintegratie-/acceptatietests, belastingtests of andere aangepaste tests uit te voeren. Omdat Flagger declaratief is en reageert op Kubernetes-gebeurtenissen, kan deze samen met GitOps-pijplijnen worden gebruikt Weefflux of JenkinsX. Als u JenkinsX gebruikt, kunt u Flagger installeren met jx-add-ons.

Flagger ondersteund Weefwerk en zorgt voor kanarie-implementaties in Weefwolk. Het project is getest op GKE, EKS en blank metaal met kubeadm.

Als u suggesties heeft voor het verbeteren van Flagger, dien dan een probleem of PR in op GitHub op stefanprodan/flagger. Bijdragen zijn meer dan welkom!

Dank Ray Tsang.

Bron: www.habr.com

Voeg een reactie