CD нь аж ахуйн нэгжийн програм хангамжийн практик гэж хүлээн зөвшөөрөгдсөн бөгөөд CI-ийн тогтсон зарчмуудын жам ёсны хувьсал юм. Гэсэн хэдий ч CD нь нэлээд ховор хэвээр байгаа бөгөөд энэ нь менежментийн нарийн төвөгтэй байдал, системийн хүртээмжид нөлөөлж чадахгүй байршуулалтаас айдагтай холбоотой юм.
Google Kubernetes Engine (GKE) дээр дарцаглагчийг тохируулах, ашиглах талаар алхам алхмаар зааварчилгааг доор харуулав.
Kubernetes кластер байгуулж байна
Та Istio нэмэлтээр GKE кластер үүсгэж эхэлнэ (хэрэв танд GCP бүртгэл байхгүй бол бүртгүүлж болно.
Google Cloud-д нэвтэрч, төсөл үүсгэж, төлбөр тооцоог идэвхжүүлнэ үү. Тушаалын мөрийн хэрэгслийг суулгана уу gcloud init
.
Өгөгдмөл төсөл, тооцоолох талбай, бүсийг тохируулах (солих PROJECT_ID
таны төслийн хувьд):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
GKE үйлчилгээг идэвхжүүлж, HPA болон 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
Дээрх тушаал нь хоёр VM-ээс бүрдэх анхдагч зангилааны сан үүсгэх болно n1-standard-2
(vCPU: 2, RAM 7,5 ГБ, диск: 30 ГБ). Хамгийн тохиромжтой нь Istio бүрэлдэхүүн хэсгүүдийг ажлын ачааллаас тусгаарлах ёстой, гэхдээ Istio pods-ийг тусгай зангилааны сан дээр ажиллуулах хялбар арга байхгүй. Istio манифестийг зөвхөн уншигдах боломжтой гэж үздэг бөгөөд GKE зангилаатай холбох, подоос салгах зэрэг өөрчлөлтийг буцаана.
Итгэмжлэх жуух бичгээ тохируулна уу kubectl
:
gcloud container clusters get-credentials istio
Кластерын админ үүрэг холбох:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Тушаалын мөрийн хэрэгслийг суулгана уу
brew install kubernetes-helm
Homebrew 2.0 одоо бас ашиглах боломжтой
Tiller-д зориулсан үйлчилгээний бүртгэл болон кластерийн үүрэг холбох:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Нэрийн талбарт Tiller-ийг өргөжүүлнэ үү kube-system
:
helm init --service-account tiller
Та Helm болон Tiller хооронд SSL ашиглах талаар бодох хэрэгтэй. Helm суулгацыг хамгаалах талаар дэлгэрэнгүй мэдээллийг үзнэ үү
Тохиргоог баталгаажуулах:
kubectl -n istio-system get svc
Хэдэн секундын дараа GCP үйлчилгээнд гадаад IP хаяг өгөх ёстой istio-ingressgateway
.
Istio Ingress Gateway-г тохируулж байна
Нэр бүхий статик IP хаяг үүсгэнэ үү istio-gateway
Istio гарцын IP хаягийг ашиглан:
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
Одоо танд интернет домэйн хэрэгтэй бөгөөд DNS бүртгэгч рүүгээ хандах боломжтой. Хоёр А бичлэг нэмэх (солих example.com
таны домэйнд):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
DNS орлуулагч ажиллаж байгаа эсэхийг шалгана уу:
watch host test.istio.example.com
HTTP дээр үйлчилгээний сүлжээнээс гадуур үйлчилгээ үзүүлэхийн тулд ерөнхий Istio гарцыг үүсгэнэ үү:
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:
- "*"
Дээрх эх сурвалжийг public-gateway.yaml нэрээр хадгалаад дараа нь хэрэглээрэй:
kubectl apply -f ./public-gateway.yaml
Ямар ч үйлдвэрлэлийн систем нь SSLгүйгээр интернетэд үйлчилгээ үзүүлэх ёсгүй. Istio-ийн нэвтрэх гарцыг сертификат менежер, CloudDNS болон Let's Encrypt ашиглан хамгаалахын тулд уншина уу.
Дарцаг суурилуулах
GKE Istio нэмэлт нь Istio телеметрийн үйлчилгээг цэвэрлэдэг Prometheus жишээг агуулаагүй болно. Flagger нь канарын шинжилгээ хийхдээ Istio HTTP хэмжигдэхүүнийг ашигладаг тул албан ёсны Istio Helm схемд ирдэгтэй адил дараах Prometheus тохиргоог ашиглах шаардлагатай.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Flagger Helm агуулахыг нэмнэ үү:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Flagger-г нэрийн талбар болгон өргөжүүлнэ istio-system
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
Та Flagger-ийг 9090 порт дээрх Istio Prometheus үйлчилгээтэй холбогдох боломжтой бол ямар ч нэрийн талбарт суулгаж болно.
Flagger нь канарын шинжилгээнд зориулсан Grafana хяналтын самбартай. Нэрийн талбарт Grafana суулгана уу 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
Виртуал үйлчилгээг бий болгосноор Grafana-г нээлттэй гарцаар харуулах (орлуулах example.com
таны домэйнд):
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
Дээрх нөөцийг grafana-virtual-service.yaml нэрээр хадгалаад дараа нь хэрэглээрэй:
kubectl apply -f ./grafana-virtual-service.yaml
Явахдаа http://grafana.istio.example.com
Таны хөтөч таныг Grafana нэвтрэх хуудас руу дахин чиглүүлэх ёстой.
Flagger ашиглан вэб програмуудыг байрлуулж байна
Flagger нь Kubernetes-ийг байрлуулж, шаардлагатай бол хэвтээ автомат масштабыг (HPA), дараа нь хэд хэдэн объектыг (Kubernetes байршуулалт, ClusterIP үйлчилгээ болон Istio виртуал үйлчилгээ) үүсгэдэг. Эдгээр объектууд нь аппликешныг үйлчилгээний сүлжээнд нээж, канарын шинжилгээ, сурталчилгааг удирддаг.
Istio Sidecar хэрэгжилтийг идэвхжүүлсэн тестийн нэрийн орон зайг үүсгэнэ үү:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Байршуулах болон автомат хэвтээ масштаблах хэрэгсэл үүсгэнэ үү:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Канарын шинжилгээний явцад урсгалыг үүсгэхийн тулд ачааллын туршилтын үйлчилгээг байрлуулна уу:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Канарын захиалгат нөөц үүсгэх (солих example.com
таны домэйнд):
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/"
Дээрх эх сурвалжийг podinfo-canary.yaml нэрээр хадгалаад дараа нь хэрэглээрэй:
kubectl apply -f ./podinfo-canary.yaml
Дээрх шинжилгээ амжилттай бол таван минут үргэлжлэх бөгөөд хагас минут тутамд HTTP хэмжүүрийг шалгана. Та дараах томъёог ашиглан канарын байршуулалтыг турших, дэмжихэд шаардагдах хамгийн бага хугацааг тодорхойлж болно. interval * (maxWeight / stepWeight)
. Канарын CRD талбаруудыг баримтжуулсан
Хэдэн секундын дараа Flagger нь канарын объектуудыг үүсгэх болно:
# 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
Хөтөчөө нээгээд хаяг руу очно уу app.istio.example.com
, та хувилбарын дугаарыг харах ёстой
Канарын автомат шинжилгээ, сурталчилгаа
Flagger нь HTTP хүсэлтийн амжилтын түвшин, хүсэлтийн дундаж үргэлжлэх хугацаа, хонгилын эрүүл мэнд зэрэг гүйцэтгэлийн гол үзүүлэлтүүдийг хэмжихийн зэрэгцээ урсгалыг аажмаар канар руу шилжүүлэх хяналтын гогцоо хэрэгжүүлдэг. KPI шинжилгээнд үндэслэн канарыг сурталчлах эсвэл дуусгавар болгож, шинжилгээний үр дүнг Slack-д нийтэлдэг.
Дараах объектуудын аль нэг нь өөрчлөгдөх үед Canary байршуулалт идэвхждэг.
- PodSpec (контейнерийн зураг, тушаал, порт, env гэх мэт) байршуулах.
- ConfigMaps нь эзлэхүүн хэлбэрээр суурилагдсан эсвэл орчны хувьсагч руу хөрвүүлэгддэг
- Нууцыг боть хэлбэрээр суулгаж эсвэл орчны хувьсагч болгон хувиргадаг
Контейнерийн зургийг шинэчлэх үед canary deployment-ийг ажиллуулна уу:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger нь байршуулалтын хувилбар өөрчлөгдсөнийг илрүүлж, дүн шинжилгээ хийж эхэлдэг:
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
Шинжилгээний явцад канарын үр дүнг Grafana ашиглан хянах боломжтой.
Анхаарна уу: хэрэв канарын шинжилгээний явцад байршуулалтад шинэ өөрчлөлт орсон бол Flagger шинжилгээний үе шатыг дахин эхлүүлнэ.
Өөрийн кластерт байгаа бүх канаруудын жагсаалтыг гарга:
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
Хэрэв та Slack мэдэгдлийг идэвхжүүлсэн бол дараах мессежийг хүлээн авах болно:
Автомат буцаах
Канарын шинжилгээний явцад та синтетик HTTP 500 алдаа гаргаж, Flagger байршуулалтыг зогсоох эсэхийг шалгах боломжтой.
Туршилтын самбар үүсгээд дотор нь дараах зүйлийг хийнэ үү.
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 алдаа үүсгэж байна:
watch curl http://podinfo-canary:9898/status/500
Саатал үүсгэх:
watch curl http://podinfo-canary:9898/delay/1
Амжилтгүй болсон шалгалтын тоо босгонд хүрэхэд урсгалыг анхдагч суваг руу чиглүүлж, канарын хэмжээг тэг болгож, байршуулалтыг амжилтгүй гэж тэмдэглэнэ.
Канарын алдаа болон хоцролтыг Kubernetes үйл явдал болгон бүртгэж, Flagger 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
Хэрэв та Slack мэдэгдлийг идэвхжүүлсэн бол дүн шинжилгээ хийхдээ бүтэлгүйтсэн шүүмжийн дээд хязгаарыг дуусгах буюу дуусгах эцсийн хугацаа хэтэрсэн тохиолдолд танд мессеж ирэх болно:
Эцэст нь хэлэхэд
Kubernetes дээр Istio гэх мэт үйлчилгээний сүлжээг ажиллуулах нь автомат хэмжигдэхүүн, бүртгэл, бүртгэлээр хангах боловч ажлын ачааллыг байршуулах нь гадны хэрэглүүрээс хамаарна. Flagger нь Istio боломжуудыг нэмснээр үүнийг өөрчлөх зорилготой юм
Flagger нь Kubernetes-д зориулсан ямар ч CI/CD шийдэлтэй нийцдэг бөгөөд канарын шинжилгээг хялбархан сунгаж болно.
Дарцаг дэмжинэ
Хэрэв танд Flagger-ийг сайжруулах талаар санал байвал GitHub дээр асуудал эсвэл PR-аа илгээнэ үү.
Спасибо
Эх сурвалж: www.habr.com