Flagger болон Istio-г ашиглан канарыг автоматаар байрлуулах

Flagger болон Istio-г ашиглан канарыг автоматаар байрлуулах

CD нь аж ахуйн нэгжийн програм хангамжийн практик гэж хүлээн зөвшөөрөгдсөн бөгөөд CI-ийн тогтсон зарчмуудын жам ёсны хувьсал юм. Гэсэн хэдий ч CD нь нэлээд ховор хэвээр байгаа бөгөөд энэ нь менежментийн нарийн төвөгтэй байдал, системийн хүртээмжид нөлөөлж чадахгүй байршуулалтаас айдагтай холбоотой юм.

Дарцаг нь ойлгомжгүй харилцааг арилгах зорилготой нээлттэй эхийн Kubernetes оператор юм. Энэ нь Istio замын хөдөлгөөний офсет болон Prometheus хэмжигдэхүүнийг ашиглан канар суулгацыг сурталчлах ажлыг автоматжуулж, удирдаж буй програмын үйл ажиллагаанд дүн шинжилгээ хийдэг.

Google Kubernetes Engine (GKE) дээр дарцаглагчийг тохируулах, ашиглах талаар алхам алхмаар зааварчилгааг доор харуулав.

Kubernetes кластер байгуулж байна

Та Istio нэмэлтээр GKE кластер үүсгэж эхэлнэ (хэрэв танд GCP бүртгэл байхгүй бол бүртгүүлж болно. энд - үнэгүй кредит авах).

Google Cloud-д нэвтэрч, төсөл үүсгэж, төлбөр тооцоог идэвхжүүлнэ үү. Тушаалын мөрийн хэрэгслийг суулгана уу gcloud болон төслөө тохируулна уу 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)"

Тушаалын мөрийн хэрэгслийг суулгана уу Helm:

brew install kubernetes-helm

Homebrew 2.0 одоо бас ашиглах боломжтой Linux.

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 суулгацыг хамгаалах талаар дэлгэрэнгүй мэдээллийг үзнэ үү docs.helm.sh

Тохиргоог баталгаажуулах:

kubectl -n istio-system get svc

Хэдэн секундын дараа GCP үйлчилгээнд гадаад IP хаяг өгөх ёстой istio-ingressgateway.

Istio Ingress Gateway-г тохируулж байна

Нэр бүхий статик IP хаяг үүсгэнэ үү istio-gatewayIstio гарцын 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 ашиглан хамгаалахын тулд уншина уу. баримт бичиг Тугчин G.K.E.

Дарцаг суурилуулах

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-systemSlack мэдэгдлийг идэвхжүүлснээр:

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 виртуал үйлчилгээ) үүсгэдэг. Эдгээр объектууд нь аппликешныг үйлчилгээний сүлжээнд нээж, канарын шинжилгээ, сурталчилгааг удирддаг.

Flagger болон 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-д нийтэлдэг.

Flagger болон Istio-г ашиглан канарыг автоматаар байрлуулах

Дараах объектуудын аль нэг нь өөрчлөгдөх үед 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 болон Istio-г ашиглан канарыг автоматаар байрлуулах

Анхаарна уу: хэрэв канарын шинжилгээний явцад байршуулалтад шинэ өөрчлөлт орсон бол 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 мэдэгдлийг идэвхжүүлсэн бол дараах мессежийг хүлээн авах болно:

Flagger болон Istio-г ашиглан канарыг автоматаар байрлуулах

Автомат буцаах

Канарын шинжилгээний явцад та синтетик 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 мэдэгдлийг идэвхжүүлсэн бол дүн шинжилгээ хийхдээ бүтэлгүйтсэн шүүмжийн дээд хязгаарыг дуусгах буюу дуусгах эцсийн хугацаа хэтэрсэн тохиолдолд танд мессеж ирэх болно:

Flagger болон Istio-г ашиглан канарыг автоматаар байрлуулах

Эцэст нь хэлэхэд

Kubernetes дээр Istio гэх мэт үйлчилгээний сүлжээг ажиллуулах нь автомат хэмжигдэхүүн, бүртгэл, бүртгэлээр хангах боловч ажлын ачааллыг байршуулах нь гадны хэрэглүүрээс хамаарна. Flagger нь Istio боломжуудыг нэмснээр үүнийг өөрчлөх зорилготой юм дэвшилтэт хүргэлт.

Flagger нь Kubernetes-д зориулсан ямар ч CI/CD шийдэлтэй нийцдэг бөгөөд канарын шинжилгээг хялбархан сунгаж болно. вэб дэгээ системийг нэгтгэх/хүлээн авах туршилт, ачааллын туршилт эсвэл бусад захиалгат туршилтуудыг хийх. Flagger нь тунхаглалтай бөгөөд Kubernetes-ийн үйл явдлуудад хариу үйлдэл үзүүлдэг тул үүнийг GitOps дамжуулах хоолойд ашиглаж болно. Weave Flux буюу JenkinsX. Хэрэв та JenkinsX ашиглаж байгаа бол Flagger програмыг jx нэмэлтүүдээр суулгаж болно.

Дарцаг дэмжинэ Нэхмэлийн ажил болон канарын байршуулалтыг хангадаг Weave Cloud. Төслийг GKE, EKS болон kubeadm-тай нүцгэн металл дээр туршиж үзсэн.

Хэрэв танд Flagger-ийг сайжруулах талаар санал байвал GitHub дээр асуудал эсвэл PR-аа илгээнэ үү. stefanprodan/flager. Хувь нэмэр оруулах нь таатай байна!

Спасибо Рэй Цанг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх