CD diakuan salaku prakték parangkat lunak perusahaan sareng mangrupikeun hasil évolusi alami tina prinsip CI anu ditetepkeun. Sanajan kitu, CD masih rada langka, meureun alatan pajeulitna manajemén jeung sieun deployments gagal mangaruhan kasadiaan sistem.
Di handap ieu mangrupikeun pituduh léngkah-léngkah pikeun nyetél sareng ngagunakeun Flagger dina Google Kubernetes Engine (GKE).
Nyetél klaster Kubernetes
Anjeun ngamimitian ku nyieun klaster GKE sareng tambihan Istio (upami anjeun teu gaduh akun GCP, anjeun tiasa ngadaptarkeun
Asup ka Google Cloud, jieun proyék, sareng aktipkeun tagihanana. Pasang utilitas garis paréntah gcloud init
.
Setel proyék standar, daérah komputasi, sareng zona (ganti PROJECT_ID
pikeun proyék anjeun):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Aktipkeun jasa GKE sareng jieun klaster nganggo tambihan HPA sareng 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
Paréntah di luhur bakal nyiptakeun kolam renang titik standar kalebet dua VM n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideally, anjeun kedah ngasingkeun komponén Istio tina beban kerja anjeun, tapi teu aya cara anu gampang pikeun ngajalankeun Istio Pods dina kolam renang khusus. Manifes Istio dianggap ngan ukur dibaca sareng GKE bakal ngabatalkeun parobahan naon waé, sapertos ngaitkeun ka titik atanapi nyabut pod.
Nyetél Kapercayaan pikeun kubectl
:
gcloud container clusters get-credentials istio
Jieun peran administrator klaster mengikat:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Pasang alat baris paréntah
brew install kubernetes-helm
Homebrew 2.0 ayeuna ogé sayogi pikeun
Damel akun jasa sareng ngariung peran klaster pikeun Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Dilegakeun Tiller dina namespace kube-system
:
helm init --service-account tiller
Anjeun kedah mertimbangkeun ngagunakeun SSL antara Helm sareng Tiller. Kanggo inpo nu langkung lengkep ihwal ngajaga pamasangan Helm anjeun, tingali
Konfirmasi setélan:
kubectl -n istio-system get svc
Saatos sababaraha detik, GCP kedah masihan alamat IP éksternal pikeun jasa éta istio-ingressgateway
.
Ngonpigurasikeun Istio Ingress Gateway
Jieun alamat IP statik kalawan ngaran istio-gateway
ngagunakeun alamat IP tina 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
Ayeuna anjeun peryogi domain internét sareng aksés ka registrar DNS anjeun. Tambahkeun dua rékaman A (ganti example.com
kana domain anjeun):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Pariksa yén wildcard DNS berpungsi:
watch host test.istio.example.com
Jieun gateway Istio generik pikeun nyadiakeun layanan di luar bolong jasa ngaliwatan 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:
- "*"
Simpen sumberdaya di luhur salaku public-gateway.yaml teras terapkeun:
kubectl apply -f ./public-gateway.yaml
Henteu aya sistem produksi anu kedah nyayogikeun jasa dina Internét tanpa SSL. Pikeun ngamankeun gateway ingress Istio sareng manajer-sertipikat, CloudDNS sareng Let's Encrypt, mangga baca
Pamasangan Flagger
Tambihan GKE Istio henteu kalebet conto Prometheus anu ngabersihkeun jasa telemétri Istio. Kusabab Flagger nganggo métrik HTTP Istio pikeun ngalakukeun analisa kanaria, anjeun kedah nyebarkeun konfigurasi Prometheus di handap ieu, sami sareng anu hadir sareng skéma resmi Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Tambahkeun gudang Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Kembangkeun Flagger ka namespace istio-system
ku cara ngaktipkeun bewara 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
Anjeun tiasa masang Flagger dina ruang ngaran naon waé salami éta tiasa komunikasi sareng jasa Istio Prometheus dina port 9090.
Flagger gaduh dasbor Grafana pikeun analisis kanaria. Pasang Grafana dina 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
Ngalaan Grafana ngaliwatan gateway kabuka ku nyieun layanan virtual (ganti example.com
kana domain anjeun):
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
Simpen sumberdaya di luhur salaku grafana-virtual-service.yaml teras terapkeun:
kubectl apply -f ./grafana-virtual-service.yaml
Nalika pindah ka http://grafana.istio.example.com
dina browser, Anjeun kudu diarahkeun ka kaca login Grafana.
Nyebarkeun aplikasi wéb nganggo Flagger
Flagger nyebarkeun Kubernetes sareng sacara opsional sacara otomatis sacara otomatis (HPA), teras nyiptakeun runtuyan objék (penyebaran Kubernetes, jasa ClusterIP, sareng jasa virtual Istio). Objék ieu ngalaan aplikasi kana bolong jasa sareng kontrol kana analisa sareng kamajuan.
Nyiptakeun ruang ngaran tés nganggo suntikan Istio Sidecar diaktipkeun:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Jieun panyebaran sareng alat skala-out otomatis pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Nyebarkeun jasa beban tés pikeun ngahasilkeun lalu lintas salami analisa kanari:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Jieun sumberdaya kenari custom (ganti example.com
kana domain anjeun):
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/"
Simpen sumberdaya di luhur salaku podinfo-canary.yaml teras nerapkeun:
kubectl apply -f ./podinfo-canary.yaml
Analisis di luhur, upami sukses, bakal ngajalankeun pikeun lima menit, mariksa metrics HTTP unggal satengah menit. Anjeun tiasa nangtukeun waktos minimum anu diperyogikeun pikeun ngonfirmasi sareng ngamajukeun panyebaran kanaria nganggo rumus ieu: interval * (maxWeight / stepWeight)
. Widang Canary CRD didokumentasikeun
Saatos sababaraha detik, Flagger bakal nyiptakeun objék kanari:
# 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
Buka browser sareng angkat ka app.istio.example.com
, Anjeun kedah ningali nomer versi
Analisis kanaria otomatis sareng promosi
Flagger ngalaksanakeun loop kontrol anu laun-laun ngalihkeun lalu lintas kana kanaria bari ngukur métrik kinerja konci sapertos tingkat kasuksésan pamundut HTTP, rata-rata durasi pamundut, sareng kaséhatan pod. Dumasar kana analisa KPI, kanari dipromosikeun atanapi diganggu, sareng hasil analisa diterbitkeun ka Slack.
Panyebaran Kanaria dipicu nalika salah sahiji objék di handap ieu robih:
- Nyebarkeun PodSpec (gambar wadah, paréntah, palabuhan, env, jsb.)
- ConfigMaps dipasang salaku volume atanapi dipetakeun kana variabel lingkungan
- Rahasia dipasang salaku volume atanapi dirobih kana variabel lingkungan
Jalankeun penyebaran kenari nalika ngamutahirkeun gambar wadahna:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger ngadeteksi yén versi panyebaran parantos robih sareng ngawitan nga-parsing:
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
Salila analisa, hasil kenari tiasa dilacak nganggo Grafana:
Punten dicatet yén upami parobihan énggal diterapkeun kana panyebaran nalika analisa kanaria, maka Flagger bakal ngamimitian deui fase analisa.
Jieun daptar sadaya canaries dina klaster anjeun:
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
Upami anjeun parantos ngaktipkeun bewara Slack, anjeun bakal nampi pesen ieu:
Rollback otomatis
Salila analisa kanaria, anjeun tiasa ngahasilkeun kasalahan HTTP 500 sintétik sareng latency respon anu luhur pikeun ningali naha Flagger bakal ngeureunkeun panyebaran éta.
Jieun pod test jeung ngalakukeun di handap ieu:
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
Ngahasilkeun kasalahan HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Generasi reureuh:
watch curl http://podinfo-canary:9898/delay/1
Lamun jumlah cék gagal ngahontal bangbarung nu, lalulintas routed deui ka saluran primér, kanaria diskalakeun ka enol, sarta deployment ditandaan salaku gagal.
Kasalahan kanaria sareng lonjakan latency dilogamkeun salaku acara Kubernetes sareng dilogam ku Flagger dina format 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
Upami anjeun parantos ngaktifkeun béwara Slack, anjeun bakal nampi pesen nalika wates waktuna ngaleuwihan atanapi jumlah maksimum pamariksaan gagal dina analisa ngahontal:
dina kacindekan
Ngajalankeun bolong jasa sapertos Istio salian Kubernetes bakal nyayogikeun métrik otomatis, log, sareng protokol, tapi panyebaran beban kerja masih gumantung kana alat éksternal. Flagger boga tujuan pikeun ngarobah ieu ku nambahkeun kamampuhan Istio
Flagger cocog sareng solusi Kubernetes CI / CD, sareng analisa kanaria tiasa gampang diperpanjang
Flagger didukung
Upami anjeun gaduh saran pikeun ningkatkeun Flagger, mangga lebetkeun masalah atanapi PR dina GitHub di
Спасибо
sumber: www.habr.com