เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

CD เป„เบ”เป‰เบ–เบทเบเบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบŠเบญเบšเปเบงเบงเบดเบชเบฒเบซเบฐเบเบดเบ”เปเบฅเบฐเป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบงเบดเบงเบฑเบ”เบ—เบฐเบ™เบฒเบ—เปเบฒเบกเบฐเบŠเบฒเบ”เบ‚เบญเบ‡เบซเบผเบฑเบเบเบฒเบ™ CI เบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, CD เปเบกเปˆเบ™เบเบฑเบ‡เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบซเบฒเบเบฒเบ, เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เป€เบ›เบฑเบ™เบเป‰เบญเบ™เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เปเบฅเบฐเบ„เบงเบฒเบกเบขเป‰เบฒเบ™เบเบปเบงเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบงเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบกเบตเบฅเบฐเบšเบปเบš.

เบ—เบธเบ‡ เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ” Kubernetes เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบฅเบปเบšเบฅเป‰เบฒเบ‡เบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™. เบกเบฑเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเบปเปˆเบ‡เป€เบชเบตเบกเบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ Istio traffic offset เปเบฅเบฐ Prometheus metrics เป€เบžเบทเปˆเบญเบงเบดเป€เบ„เบฒเบฐเบžเบถเบ”เบ•เบดเบเบณเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ—เบตเปˆเบกเบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™.

เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Flagger เปƒเบ™ Google Kubernetes Engine (GKE).

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Kubernetes

เบ—เปˆเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบก GKE เบ”เป‰เบงเบ Istio add-on (เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบšเบฑเบ™เบŠเบต 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 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

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบˆเบฐเบชเป‰เบฒเบ‡ node pool เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบฅเบงเบกเบ—เบฑเบ‡ VM เบชเบญเบ‡เบญเบฑเบ™ n1-standard-2 (vCPU: 2, RAM 7,5 GB, เปเบœเปˆเบ™: 30 GB). เป‚เบ”เบเบซเบฅเบฑเบเบเบฒเบ™เปเบฅเป‰เบง, เบ—เปˆเบฒเบ™เบ„เบงเบ™เปเบเบเบญเบปเบ‡เบ›เบฐเบเบญเบš Istio เบญเบญเบเบˆเบฒเบเบงเบฝเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เปเบ•เปˆเบšเปเปˆเบกเบตเบงเบดเบ—เบตเบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Istio Pods เปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบตเบ—เบตเปˆเบญเบธเบ—เบดเบ”เบ•เบปเบ™. Istio manifests เบ–เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ เปเบฅเบฐ GKE เบˆเบฐเบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป† เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš node เบซเบผเบทเบเบฒเบ™เปเบเบเบญเบญเบเบˆเบฒเบ pod.

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบงเบชเปเบฒเบฅเบฑเบš 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 เปƒเบ™ namespace kube-system:

helm init --service-account tiller

เบ—เปˆเบฒเบ™เบ„เบงเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปƒเบŠเป‰ SSL เบฅเบฐเบซเบงเปˆเบฒเบ‡ Helm เปเบฅเบฐ Tiller. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Helm เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เป€เบšเบดเปˆเบ‡ docs.helm.sh

เบขเบทเบ™เบขเบฑเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ:

kubectl -n istio-system get svc

เบซเบผเบฑเบ‡เบˆเบฒเบเบชเบญเบ‡เบชเบฒเบกเบงเบดเบ™เบฒเบ—เบต, GCP เบ„เบงเบ™เบเปเบฒเบ™เบปเบ”เบ—เบตเปˆเบขเบนเปˆ IP เบžเบฒเบเบ™เบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ istio-ingressgateway.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Istio Ingress Gateway

เบชเป‰เบฒเบ‡เบ—เบตเปˆเบขเบนเปˆ IP เปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆเบ”เป‰เบงเบเบŠเบทเปˆ istio-gatewayเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบขเบนเปˆ IP เบ‚เบญเบ‡เบ›เบฐเบ•เบน 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

เบ•เบญเบ™เบ™เบตเป‰เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ”เป€เบกเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ” เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบฐเบšเบฝเบ™ DNS เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เป€เบžเบตเปˆเบกเบšเบฑเบ™เบ—เบถเบ A เบชเบญเบ‡เบญเบฑเบ™ (เปเบ—เบ™เบ—เบตเปˆ example.com เป„เบ›เบซเบฒเป‚เบ”เป€เบกเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™):

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

เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบงเปˆเบฒโ€‹เบ•เบปเบงโ€‹เปเบ—เบ™ DNS เปเบกเปˆเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹:

watch host test.istio.example.com

เบชเป‰เบฒเบ‡เบ›เบฐเบ•เบนเบ—เบฒเบ‡ Istio เบ—เบปเปˆเบงเป„เบ›เป€เบžเบทเปˆเบญเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ™เบญเบเบ•เบฒเบ‚เปˆเบฒเบเบšเปเบฅเบดเบเบฒเบ™เบœเปˆเบฒเบ™ 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:
        - "*"

เบšเบฑเบ™เบ—เบถเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป€เบ›เบฑเบ™ public-gateway.yaml เปเบฅเป‰เบงเบ™เบณเปƒเบŠเป‰เบกเบฑเบ™:

kubectl apply -f ./public-gateway.yaml

เบšเปเปˆเบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ„เบงเบ™เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบต SSL. เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ›เบฐเบ•เบนเบ—เบฒเบ‡เป€เบ‚เบปเป‰เบฒ Istio เบเบฑเบš cert-manager, CloudDNS เปเบฅเบฐ Let's Encrypt, เบเบฐเบฅเบธเบ™เบฒเบญเปˆเบฒเบ™ เป€เบญเบเบฐเบชเบฒเบ™ เบ—เบธเบ‡ G.K.E.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบธเบ‡

เบชเปˆเบงเบ™เป€เบชเบตเบก GKE Istio เบšเปเปˆเบฅเบงเบกเป€เบญเบปเบฒเบ•เบปเบงเบขเปˆเบฒเบ‡ Prometheus เบ—เบตเปˆเบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบšเปเบฅเบดเบเบฒเบ™เป‚เบ—เบฅเบฐเป€เบฅเบ Istio. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ Flagger เปƒเบŠเป‰ Istio HTTP metrics เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Prometheus เบ•เปเปˆเป„เบ›เบ™เบตเป‰, เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบกเบฒเบžเป‰เบญเบกเบเบฑเบš Istio Helm schema เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™.

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 เป„เบ›เบซเบฒ namespace 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 เปƒเบ™ namespace เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบšเปเบฅเบดเบเบฒเบ™ Istio Prometheus เปƒเบ™เบžเบญเบ” 9090.

Flagger เบกเบต dashboard Grafana เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary. เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Grafana เปƒเบ™ 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

เป€เบ›เบตเบ”เป€เบœเบตเบ Grafana เบœเปˆเบฒเบ™เบ›เบฐเบ•เบนเป€เบ›เบตเบ”เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบšเปเบฅเบดเบเบฒเบ™ virtual (เปเบ—เบ™เบ—เบตเปˆ 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 virtual services). เบงเบฑเบ”เบ–เบธเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ›เบตเบ”เป€เบœเบตเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฑเบšเบ•เบฒเบซเบ™เปˆเบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary เปเบฅเบฐเบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒ.

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

เบชเป‰เบฒเบ‡ namespace เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบชเบตเบ” Istio Sidecar เป€เบ›เบตเบ”เปƒเบŠเป‰:

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

เบชเป‰เบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปเบฅเบฐโ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบเบปเบโ€‹เบญเบญเบโ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ” podโ€‹:

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

เบ™เบณเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เป‚เบซเบผเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary:

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

เบชเป‰เบฒเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ canary เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡ (เปเบ—เบ™เบ—เบตเปˆ 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 metrics เบ—เบธเบเป†เป€เบ„เบดเปˆเบ‡เบ™เบฒเบ—เบต. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ•เปเบฒโ€‹เปˆโ€‹เบชเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เปเบฅเบฐโ€‹เบชเบปเปˆเบ‡โ€‹เป€เบชเบตเบกโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ canary เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบชเบนเบ”โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹: interval * (maxWeight / stepWeight). เบ—เบปเปˆเบ‡เบ™เบฒ CRD Canary เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบชเบฒเบ™ เบ—เบตเปˆเบ™เบตเป‰.

เบซเบผเบฑเบ‡เบˆเบฒเบเบชเบญเบ‡เบชเบฒเบกเบงเบดเบ™เบฒเบ—เบต, Flagger เบˆเบฐเบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธ canary:

# 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, เบ—เปˆเบฒเบ™เบ„เบงเบ™เป€เบšเบดเปˆเบ‡เบ•เบปเบงเป€เบฅเบเบชเบฐเบšเบฑเบš เปเบญเบฑเบšเบชเบฒเบ—เบดเบ”.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบฅเบฐเบเบฒเบ™เบชเบปเปˆเบ‡เป€เบชเบตเบกเบเบฒเบ™ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

Flagger เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบปเบ‡เบˆเบญเบ™เบ„เบงเบšเบ„เบธเบกเบ—เบตเปˆเบ„เปˆเบญเบเป†เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เป„เบ›เบซเบฒ canary เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เป€เบŠเบฑเปˆเบ™เบญเบฑเบ”เบ•เบฒเบ„เบงเบฒเบกเบชเปเบฒเป€เบฅเบฑเบ”เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP, เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบชเบฐเป€เบฅเปˆเบ, เปเบฅเบฐเบชเบธเบ‚เบฐเบžเบฒเบšเบ‚เบญเบ‡เบเบฑเบ. เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ KPI, canary เป„เบ”เป‰เบ–เบทเบเบชเบปเปˆเบ‡เป€เบชเบตเบกเบซเบผเบทเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡, เปเบฅเบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบžเบตเบกเบกเบฒเป€เบ–เบดเบ‡ Slack.

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Canary เบˆเบฐเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เป€เบกเบทเปˆเบญเปœเบถเปˆเบ‡เปƒเบ™เบงเบฑเบ”เบ–เบธเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡:

  • เบ™เบณเปƒเบŠเป‰ PodSpec (เบฎเบนเบšเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เบ„เบณเบชเบฑเปˆเบ‡, เบžเบญเบ”, env, เปเบฅเบฐเบญเบทเปˆเบ™เป†)
  • ConfigMaps เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เบซเบผเบทเบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบเบฑเบšเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก
  • เบ„เบงเบฒเบกเบฅเบฑเบšเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เบซเบผเบทเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก

เป€เบ›เบตเบ”เปƒเบŠเป‰ canary deploy เปƒเบ™เป€เบงเบฅเบฒเบญเบฑเบšเป€เบ”เบ”เบฎเบนเบš container:

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

เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš canary เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ Grafana:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเบ–เป‰เบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเปเปˆเบ–เบทเบเบ™เบณเปƒเบŠเป‰เบเบฑเบšเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary, Flagger เบˆเบฐเป€เบฅเบตเปˆเบกเป„เบฅเบเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบทเบ™เปƒเปเปˆ.

เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ canaries เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบเบธเปˆเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™:

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, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

rollback เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” HTTP 500 เบชเบฑเบ‡เป€เบ„เบฒเบฐเปเบฅเบฐเบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบชเบนเบ‡เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบงเปˆเบฒ Flagger เบˆเบฐเบขเบธเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.

เบชเป‰เบฒเบ‡ pod เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเป€เบฎเบฑเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบ™เบกเบฑเบ™:

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

เป€เบกเบทเปˆเบญเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบงเป€เบ–เบดเบ‡เป€เบเบ™, เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเป„เบ›เบซเบฒเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ•เบปเป‰เบ™เบ•เป, canary เบˆเบฐเบ–เบทเบเบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เป€เบ›เบฑเบ™เบชเบนเบ™, เปเบฅเบฐเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ–เบทเบเบซเบกเบฒเบเบงเปˆเบฒเบฅเบปเป‰เบกเป€เบซเบฅเบง.

เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” Canary เปเบฅเบฐเบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เป€เบงเบฅเบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป€เบ›เบฑเบ™เป€เบซเบ”เบเบฒเบ™ 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, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเป€เบกเบทเปˆเบญเป€เบเบตเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบซเบผเบทเบˆเปเบฒเบ™เบงเบ™เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰:

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ canary เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ Flagger เปเบฅเบฐ Istio

เปƒเบ™เบเบฒเบ™เบชเบฐเบซเบฅเบธเบš

เบเบฒเบ™เปเบฅเปˆเบ™เบ•เบฒเปœเปˆเบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบŠเบฑเปˆเบ™: Istio เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบ Kubernetes เบˆเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบšเบฑเบ™เบ—เบถเบ, เปเบฅเบฐเป‚เบ›เป‚เบ•เบ„เป, เปเบ•เปˆเบเบฒเบ™เบ›เบฑเบšเปƒเบŠเป‰เบงเบฝเบเบเบฑเบ‡เบ‚เบถเป‰เบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบฒเบเบ™เบญเบ. Flagger เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบ›เปˆเบฝเบ™เบชเบดเปˆเบ‡เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ” Istio เบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบเป‰เบฒเบงเบซเบ™เป‰เบฒ.

Flagger เปเบกเปˆเบ™เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚ Kubernetes CI/CD, เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ canary เบชเบฒเบกเบฒเบ”เบ‚เบฐเบซเบเบฒเบเป„เบ”เป‰เบ‡เปˆเบฒเบ webhooks เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบšเบฅเบฐเบšเบปเบš / เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบš, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”, เบซเบผเบทเบเบฒเบ™เบเบงเบ”เบชเบญเบš custom เบญเบทเปˆเบ™เป†. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ Flagger เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบเบฒเบ”เปเบฅเบฐเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเป€เบซเบ”เบเบฒเบ™ Kubernetes, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบ—เปเปˆ GitOps เบžเป‰เบญเบกเบเบฑเบš Weave Flux เบซเบผเบท JenkinsX. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰ JenkinsX เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Flagger เบ”เป‰เบงเบ jx addons.

เบฎเบญเบ‡เบฎเบฑเบšเบ—เบธเบ‡ Weaveworks เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” canary เปƒเบ™ Weave Cloud. เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเปเบฒเบฅเบฑเบ‡เบ–เบทเบเบ—เบปเบ”เบชเบญเบšเบขเบนเปˆเปƒเบ™ GKE, EKS, เปเบฅเบฐเป‚เบฅเบซเบฐเป€เบ›เบปเปˆเบฒเบ—เบตเปˆเบกเบต kubeadm.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡ Flagger, เบเบฐเบฅเบธเบ™เบฒเบชเบปเปˆเบ‡เบšเบฑเบ™เบซเบฒเบซเบผเบท PR เปƒเบ™ GitHub เบ—เบตเปˆ stefanprodan/flagger. เบเบฒเบ™เบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เปเบกเปˆเบ™เบซเบผเบฒเบเบเปˆเบงเบฒเบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบš!

ะกะฟะฐัะธะฑะพ Ray Tsang.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™