Implementazioni automatiche di canari cù Flagger è Istio

Implementazioni automatiche di canari cù Flagger è Istio

U CD hè ricunnisciutu cum'è una pratica di software d'impresa è hè u risultatu di una evoluzione naturali di i principii CI stabiliti. Tuttavia, u CD hè sempre abbastanza raru, forse per via di a cumplessità di a gestione è u timore di implementazioni falluti chì afectanu a dispunibilità di u sistema.

Bandieru hè un operatore di Kubernetes open source chì hà u scopu di eliminà e relazioni confuse. Automatizza a prumuzione di implementazioni canarini utilizendu l'offset di trafficu Istio è e metriche Prometheus per analizà u cumpurtamentu di l'applicazione durante un rollout gestitu.

Quì sottu hè una guida passu à passu per stallà è aduprà Flagger in Google Kubernetes Engine (GKE).

Configurazione di un cluster Kubernetes

Cuminciate per creà un cluster GKE cù l'add-on Istio (se ùn avete micca un contu GCP, pudete iscrizzione). ccà - per uttene crediti gratuiti).

Accedi à Google Cloud, crea un prughjettu, è attivate a fatturazione per questu. Installa l'utilità di linea di cumanda gcloud è cunfigurà u vostru prughjettu cun gcloud init.

Definisce u prughjettu predeterminatu, l'area di calculu è a zona (sustituisci PROJECT_ID per u vostru prughjettu):

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

Habilita u serviziu GKE è crea un cluster cù HPA è add-ons Istio:

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

U cumandimu sopra creà una piscina di nodi predeterminati chì includenu duie VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, discu: 30 GB). Ideale, duvete isolà i cumpunenti Istio da i vostri carichi di travagliu, ma ùn ci hè micca un modu faciule per eseguisce Istio Pods in un pool dedicatu di nodi. I manifesti Istio sò cunsiderati di sola lettura è GKE annullerà ogni cambiamentu, cum'è ligame à un node o staccamentu da un pod.

Configurate credenziali per kubectl:

gcloud container clusters get-credentials istio

Crea un rolu di l'amministratore di u cluster:

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

Installa u strumentu di linea di cumanda Helm:

brew install kubernetes-helm

Homebrew 2.0 hè avà dispunibule ancu per Linux.

Crea un contu di serviziu è un rolu di cluster per Tiller:

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

Espandi Tiller in u spaziu di nomi kube-system:

helm init --service-account tiller

Duvete cunsiderà aduprà SSL trà Helm è Tiller. Per più infurmazione nantu à a prutezzione di a vostra installazione Helm, vede docs.helm.sh

Cunfirmà i paràmetri:

kubectl -n istio-system get svc

Dopu qualchì seconde, GCP deve assignà un indirizzu IP esternu per u serviziu istio-ingressgateway.

Configurazione di l'Istio Ingress Gateway

Crea un indirizzu IP staticu cù un nome istio-gatewayutilizendu l'indirizzu IP di u gateway 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

Avà avete bisognu di un duminiu internet è accessu à u vostru registratore DNS. Aghjunghjite dui record A (sustituisci example.com à u vostru duminiu):

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

Verificate chì u wildcard DNS funziona:

watch host test.istio.example.com

Crea una porta Istio generica per furnisce servizii fora di a rete di serviziu nantu à 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:
        - "*"

Salvà a risorsa sopra cum'è public-gateway.yaml è poi appricà:

kubectl apply -f ./public-gateway.yaml

Nisun sistema di produzzione ùn deve furnisce servizii in Internet senza SSL. Per assicurà a porta di entrata Istio cù cert-manager, CloudDNS è Let's Encrypt, leghjite documentazione Flagger G.K.E.

Installazione di Flagger

L'add-on GKE Istio ùn include micca una istanza di Prometheus chì pulisce u serviziu di telemetria Istio. Perchè Flagger usa e metriche Istio HTTP per realizà analisi canari, avete bisognu di implementà a seguente cunfigurazione Prometheus, simile à quella chì vene cù u schema ufficiale Istio Helm.

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

Aghjunghjite u repository Flagger Helm:

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

Espandi Flagger à u spaziu di nomi istio-systemattivendu e notificazioni 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

Pudete installà Flagger in ogni spaziu di nomi, sempre chì pò cumunicà cù u serviziu Istio Prometheus in u portu 9090.

Flagger hà un dashboard Grafana per l'analisi canari. Installa Grafana in 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

Expose Grafana attraversu una porta aperta creendu un serviziu virtuale (sustituisci example.com à u vostru duminiu):

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

Salvà a risorsa sopra cum'è grafana-virtual-service.yaml è poi appricà:

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

Quandu si move à http://grafana.istio.example.com in u navigatore, duvete esse diretta à a pagina di login Grafana.

Implementazione di applicazioni web cù Flagger

Flagger implementa Kubernetes è facoltativamente scala automaticamente (HPA), poi crea una serie di oggetti (implementazioni Kubernetes, servizii ClusterIP è servizii virtuali Istio). Questi ogetti espone l'applicazione à a rete di serviziu è cuntrollà l'analisi è u prugressu canari.

Implementazioni automatiche di canari cù Flagger è Istio

Crea un spaziu di nomi di prova cù l'iniezione Istio Sidecar attivata:

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

Crea una implementazione è un strumentu di scale-out automaticu di pod:

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

Implementa un serviziu di carica di prova per generà trafficu durante l'analisi canaria:

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

Crea una risorsa canaria persunalizata (sustituisci example.com à u vostru duminiu):

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

Salvà a risorsa sopra cum'è podinfo-canary.yaml è poi appricà:

kubectl apply -f ./podinfo-canary.yaml

L'analisi sopra, se riesciuta, duverà per cinque minuti, cuntrollendu e metriche HTTP ogni mità minuti. Pudete determinà u tempu minimu necessariu per validà è prumove una implementazione canaria cù a seguente formula: interval * (maxWeight / stepWeight). I campi CRD canari sò documentati ccà.

Dopu un paru di sicondi, Flagger creà oggetti canarini:

# 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

Aprite un navigatore è andate à app.istio.example.com, duvete vede u numeru di versione app demo.

Analisi è prumuzione automatica di canari

Flagger implementa un ciclu di cuntrollu chì si move gradualmente u trafficu à u canarinu mentre misura metriche di rendiment chjave cum'è a rata di successu di a dumanda HTTP, a durata media di a dumanda è a salute di u pod. Basatu nantu à l'analisi KPI, u canarinu hè prumuvutu o interrotta, è i risultati di l'analisi sò publicati à Slack.

Implementazioni automatiche di canari cù Flagger è Istio

A implementazione di Canary hè attivata quandu unu di l'oggetti seguenti cambia:

  • Implementa PodSpec (imaghjini di u containeru, cumandamentu, porti, env, etc.)
  • ConfigMaps sò muntati cum'è volumi o mappati à variabili di l'ambiente
  • I sicreti sò muntati cum'è volumi o cunvertiti in variabili ambientali

Eseguite canary deploy quandu aghjurnà una maghjina di cuntainer:

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

Flagger rileva chì a versione di implementazione hè cambiata è cumincia à analizà:

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

Durante l'analisi, i risultati canari ponu esse tracciati cù Grafana:

Implementazioni automatiche di canari cù Flagger è Istio

Per piacè nutate chì se novi cambiamenti sò applicati à una implementazione durante l'analisi canaria, allora Flagger riavviarà a fase di analisi.

Fate una lista di tutti i canari in u vostru 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

Se avete attivatu e notificazioni Slack, riceverete i seguenti missaghji:

Implementazioni automatiche di canari cù Flagger è Istio

Rollback automaticu

Durante l'analisi canaria, pudete generà errori sintetici HTTP 500 è alta latenza di risposta per vede se Flagger fermarà a implementazione.

Crea un pod di prova è fate u seguente in questu:

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

Generazione di errori HTTP 500:

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

Ritarda di generazione:

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

Quandu u numeru di cuntrolli falluti righjunghji u limitu, u trafficu hè rimbursatu à u canali primariu, u canarinu hè scalatu à zero, è a implementazione hè marcata cum'è falluta.

L'errori canari è i picchi di latenza sò registrati cum'è avvenimenti Kubernetes è registrati da Flagger in formatu 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

Se avete attivatu e notificazioni Slack, riceverete un missaghju quandu a scadenza hè superata o u numeru massimu di cuntrolli falluti in l'analisi hè righjuntu:

Implementazioni automatiche di canari cù Flagger è Istio

In cunclusioni

Eseguisce una maglia di serviziu cum'è Istio in più di Kubernetes furnisce metriche automatiche, logs è protokolli, ma l'implementazione di carichi di travagliu dipende sempre di strumenti esterni. Flagger hà u scopu di cambià questu aghjunghjendu capacità Istio fornitura progressiva.

Flagger hè cumpatibile cù qualsiasi suluzione Kubernetes CI / CD, è l'analisi canaria pò esse facilmente allargata webhooks per fà teste di integrazione / accettazione di u sistema, teste di carica, o qualsiasi altri cuntrolli persunalizati. Siccomu Flagger hè dichjarazione è risponde à l'avvenimenti Kubernetes, pò esse usatu in pipeline GitOps cù Weave Flux o Jenkins X. Sè vo aduprate JenkinsX pudete installà Flagger cù addons jx.

Flagger supportatu Travaglii è furnisce implementazioni canari in Weave Cloud. U prugettu hè in prova nantu à GKE, EKS, è bare metal cù kubeadm.

Sè avete suggerimenti per migliurà Flagger, mandate un prublema o PR in GitHub à stefanprodan/flagger. I cuntributi sò più chè benvenuti !

Спасибо Ray Tsang.

Source: www.habr.com

Add a comment