เชซเซเชฒเซ‡เช—เชฐ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชธเชพเชฅเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

เชซเซเชฒเซ‡เช—เชฐ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชธเชพเชฅเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

CD เชจเซ‡ เชเชจเซเชŸเชฐเชชเซเชฐเชพเช‡เช เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชธเซเชฅเชพเชชเชฟเชค CI เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹เชจเซ€ เช•เซเชฆเชฐเชคเซ€ เช‰เชคเซเช•เซเชฐเชพเช‚เชคเชฟ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชธเซ€เชกเซ€ เชนเชœเซ เชชเชฃ เช–เซ‚เชฌ เชœ เชฆเซเชฐเซเชฒเชญ เช›เซ‡, เช•เชฆเชพเชš เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸเชจเซ€ เชœเชŸเชฟเชฒเชคเชพ เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เช‰เชชเชฒเชฌเซเชงเชคเชพเชจเซ‡ เช…เชธเชฐ เช•เชฐเชคเซ€ เชจเชฟเชทเซเชซเชณ เชœเชฎเชพเชตเชŸเชจเชพ เชญเชฏเชจเซ‡ เช•เชพเชฐเชฃเซ‡.

เชซเซเชฒเซ‡เช—เชฐ เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช“เชชเชฐเซ‡เชŸเชฐ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชฆเซเชฆเซ‡เชถเซเชฏ เช—เซ‚เช‚เชšเชตเชฃเชญเชฐเซเชฏเชพ เชธเช‚เชฌเช‚เชงเซ‹เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡. เชคเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เชฐเซ‹เชฒเช†เช‰เชŸ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชตเชฐเซเชคเชจเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Istio เชŸเซเชฐเชพเชซเชฟเช• เช‘เชซเชธเซ‡เชŸเซเชธ เช…เชจเซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸเชจเชพ เชชเซเชฐเชฎเซ‹เชถเชจเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

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 GB, เชกเชฟเชธเซเช•: 30 GB). เช†เชฆเชฐเซเชถ เชฐเซ€เชคเซ‡, Istio เช˜เชŸเช•เซ‹ เชคเซ‡เชฎเชจเชพ เชตเชฐเซเช•เชฒเซ‹เชกเชฅเซ€ เช…เชฒเช— เชนเซ‹เชตเชพ เชœเซ‹เชˆเช, เชชเชฐเช‚เชคเซ เชธเชฎเชฐเซเชชเชฟเชค เชจเซ‹เชก เชชเซ‚เชฒ เชชเชฐ Istio เชชเซ‹เชกเซเชธ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เชธเชฐเชณ เชฐเซ€เชค เชจเชฅเซ€. 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

เชนเซ‹เชฎเชฌเซเชฐเซ 2.0 เชนเชตเซ‡ เชฎเชพเชŸเซ‡ เชชเชฃ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ Linux.

เชŸเชฟเชฒเชฐ เชฎเชพเชŸเซ‡ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸ เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชฐเซ‹เชฒ เชฌเช‚เชงเชจเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹:

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

เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชŸเชฟเชฒเชฐ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‹ kube-system:

helm init --service-account tiller

เชคเชฎเชพเชฐเซ‡ เชนเซ‡เชฒเซเชฎ เช…เชจเซ‡ เชŸเชฟเชฒเชฐ เชตเชšเซเชšเซ‡ SSL เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชตเชฟเชšเชพเชฐเชตเซเช‚ เชœเซ‹เชˆเช. เชคเชฎเชพเชฐเชพ เชนเซ‡เชฒเซเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชฎเชพเชŸเซ‡, เชœเซเช“ docs.helm.sh

เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเซ‹:

kubectl -n istio-system get svc

เชฅเซ‹เชกเซ€เช• เชธเซ‡เช•เช‚เชก เชชเช›เซ€, GCP เช เชธเซ‡เชตเชพเชจเซ‡ เชฌเชพเชนเซเชฏ IP เชธเชฐเชจเชพเชฎเซเช‚ เชธเซ‹เช‚เชชเชตเซเช‚ เชœเซ‹เชˆเช istio-ingressgateway.

เช‡เชธเซเชŸเชฟเช“ เช‡เชจเซเช—เซเชฐเซ‡เชธ เช—เซ‡เชŸเชตเซ‡ เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชจเชพเชฎ เชธเชพเชฅเซ‡ เชธเซเชฅเชฟเชฐ 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 เชฐเชœเชฟเชธเซเชŸเซเชฐเชพเชฐเชจเซ€ เชเช•เซเชธเซ‡เชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฌเซ‡ A เชฐเซ‡เช•เซ‹เชฐเซเชก เช‰เชฎเซ‡เชฐเซ‹ (เชฌเชฆเชฒเซ‹ 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 เชตเชฟเชจเชพ เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เชธเซ‡เชตเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ-เชฎเซ‡เชจเซ‡เชœเชฐ, CloudDNS เช…เชจเซ‡ เชšเชพเชฒเซ‹ เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡ เชคเชฎเชพเชฐเชพ Istio เชชเซเชฐเชตเซ‡เชถ เช—เซ‡เชŸเชตเซ‡เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชตเชพเช‚เชšเซ‹ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชซเซเชฒเซ‡เช—เชฐ G.K.E.

เชซเซเชฒเซ‡เช—เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ

GKE Istio เชเชก-เช‘เชจเชฎเชพเช‚ Prometheus เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชคเซ‹ เชจเชฅเซ€ เชœเซ‡ Istio เชŸเซ‡เชฒเชฟเชฎเซ‡เชŸเซเชฐเซ€ เชธเซ‡เชตเชพเชจเซ‡ เชธเชพเชซ เช•เชฐเซ‡ เช›เซ‡. เชซเซเชฒเซ‡เช—เชฐ เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Istio HTTP เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เช—เซ‹เช เชตเชฃเซ€เชจเซ‡ เชœเชฎเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡ เช…เชงเชฟเช•เซƒเชค Istio Helm เชธเซเช•เซ€เชฎเชพ เชธเชพเชฅเซ‡ เช†เชตเซ‡ เช›เซ‡.

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

เชซเซเชฒเซ‡เช—เชฐ เชนเซ‡เชฒเซเชฎ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เช‰เชฎเซ‡เชฐเซ‹:

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

เชซเซเชฒเซ‡เช—เชฐเชจเซ‡ เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‹ istio-systemเชธเซเชฒเซ…เช• เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ€เชจเซ‡:

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

เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชคเซ‡ เชชเซ‹เชฐเซเชŸ 9090 เชชเชฐ Istio Prometheus เชธเซ‡เชตเชพ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชถเช•เซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชคเชฎเซ‡ เชซเซเชฒเซ‡เช—เชฐเชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชซเซเชฒเซ‡เช—เชฐ เชชเชพเชธเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซเชจเชพ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช›เซ‡. เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เช—เซเชฐเชพเชซเชจเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ 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

เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเซ‡เชตเชพ (เชฌเชฆเชฒเซ‹ 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 เชฒเซ‰เช—เชฟเชจ เชชเซƒเชทเซเช  เชชเชฐ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช.

เชซเซเชฒเซ‡เช—เชฐ เชธเชพเชฅเซ‡ เชตเซ‡เชฌ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช—

เชซเซเชฒเซ‡เช—เชฐ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡, เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เชนเซ‹เชฐเชฟเชเซ‹เชจเซเชŸเชฒ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— (HPA), เชชเช›เซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชฌเชจเชพเชตเซ‡ เช›เซ‡ (เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเซเชธ, เช•เซเชฒเชธเซเชŸเชฐเช†เชˆเชชเซ€ เชธเซ‡เชตเชพเช“ เช…เชจเซ‡ 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 เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เซƒเชค เช›เซ‡ เช…เชนเซ€เช‚.

เชฅเซ‹เชกเซ€ เชธเซ‡เช•เช‚เชก เชชเช›เซ€, เชซเซเชฒเซ‡เช—เชฐ เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชธเซเชคเซเช“ เชฌเชจเชพเชตเชถเซ‡:

# 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, เชคเชฎเชพเชฐเซ‡ เชธเช‚เชธเซเช•เชฐเชฃ เชจเช‚เชฌเชฐ เชœเซ‹เชตเซ‹ เชœเซ‹เชˆเช เชกเซ‡เชฎเซ‹ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ.

เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เชชเซเชฐเชฎเซ‹เชถเชจ

เชซเซเชฒเซ‡เช—เชฐ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฒเซ‚เชชเชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชเชšเชŸเซ€เชŸเซ€เชชเซ€ เชตเชฟเชจเช‚เชคเซ€ เชธเชซเชณเชคเชพ เชฆเชฐ, เชธเชฐเซ‡เชฐเชพเชถ เชตเชฟเชจเช‚เชคเซ€ เชธเชฎเชฏเช—เชพเชณเซ‹ เช…เชจเซ‡ เชชเซ‹เชก เชนเซ‡เชฒเซเชฅ เชœเซ‡เชตเชพ เชฎเซเช–เซเชฏ เชชเซเชฐเชฆเชฐเซเชถเชจ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹เชจเซ‡ เชฎเชพเชชเชคเซ€ เชตเช–เชคเซ‡ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชคเชฐเชซ เชฒเชˆ เชœเชพเชฏ เช›เซ‡. เช•เซ‡เชชเซ€เช†เชˆ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเชพ เช†เชงเชพเชฐเซ‡, เช•เซ‡เชจเซ‡เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เชคเซเชธเชพเชนเชจ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชธเซเชฒเซ‡เช•เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡.

เชซเซเชฒเซ‡เช—เชฐ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชธเชพเชฅเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

เชœเซเชฏเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเชพเชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆ เชเช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชฆเชฒเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡:

  • PodSpec (เช•เชจเซเชŸเซ‡เชจเชฐ เช‡เชฎเซ‡เชœ, เช•เชฎเชพเชจเซเชก, เชชเซ‹เชฐเซเชŸเซเชธ, env, เชตเช—เซ‡เชฐเซ‡) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹.
  • ConfigMaps เชตเซ‹เชฒเซเชฏเซเชฎ เชคเชฐเซ€เช•เซ‡ เชฎเชพเช‰เชจเซเชŸ เชฅเชฏเซ‡เชฒ เช›เซ‡ เช…เชฅเชตเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช›เซ‡
  • เชฐเชนเชธเซเชฏเซ‹ เชตเซ‹เชฒเซเชฏเซเชฎ เชคเชฐเซ€เช•เซ‡ เชฎเชพเช‰เชจเซเชŸ เชฅเชฏเซ‡เชฒ เช›เซ‡ เช…เชฅเชตเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡

เช•เชจเซเชŸเซ‡เชจเชฐ เช‡เชฎเซ‡เชœ เช…เชชเชกเซ‡เชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชšเชฒเชพเชตเซ‹:

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

เชซเซเชฒเซ‡เช—เชฐ เชถเซ‹เชงเซ‡ เช›เซ‡ เช•เซ‡ เชœเชฎเชพเชตเชŸ เชธเช‚เชธเซเช•เชฐเชฃ เชฌเชฆเชฒเชพเชˆ เช—เชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡:

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

เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เช—เซเชฐเชพเชซเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

เชซเซเชฒเซ‡เช—เชฐ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชธเชพเชฅเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹: เชœเซ‹ เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชœเชฎเชพเชตเชŸเชฎเชพเช‚ เชจเชตเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡, เชคเซ‹ เชซเซเชฒเซ‡เช—เชฐ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ‹ เชคเชฌเช•เซเช•เซ‹ เชซเชฐเซ€ เชถเชฐเซ‚ เช•เชฐเชถเซ‡.

เชคเชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชคเชฎเชพเชฎ เช•เซ‡เชจเซ‡เชฐเซ€เช“เชจเซ€ เชธเซ‚เชšเชฟ เชฌเชจเชพเชตเซ‹:

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 เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เช‰เชšเซเชš เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฒเซ‡เชŸเชจเซเชธเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชŸเซ‡เชธเซเชŸ เชชเซ‹เชก เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเชพ เช•เชฐเซ‹:

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

เชœเซเชฏเชพเชฐเซ‡ เชจเชฟเชทเซเชซเชณ เชคเชชเชพเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฅเซเชฐเซ‡เชถเซ‹เชฒเซเชก เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ เชชเซเชฐเชพเชฅเชฎเชฟเช• เชšเซ‡เชจเชฒ เชชเชฐ เชชเชพเช›เซเช‚ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช•เซ‡เชจเซ‡เชฐเซ€ เชถเซ‚เชจเซเชฏ เชชเชฐ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเชฎเชพเชตเชŸเชจเซ‡ เชจเชฟเชทเซเชซเชณ เชคเชฐเซ€เช•เซ‡ เชšเชฟเชนเซเชจเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซ‡เชจเซ‡เชฐเซ€ เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เชฒเซ‡เชŸเชจเซเชธเซ€ เชธเซเชชเชพเช‡เช•เซเชธ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชคเชฐเซ€เช•เซ‡ เชฒเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชซเซเชฒเซ‡เช—เชฐ เชฆเซเชตเชพเชฐเชพ 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

เชœเซ‹ เชคเชฎเซ‡ เชธเซเชฒเซ…เช• เชธเซ‚เชšเชจเชพเช“ เชธเช•เซเชทเชฎ เช•เชฐเซ€ เชนเซ‹เชฏ, เชคเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชฎเชพเช‚ เชจเชฟเชทเซเชซเชณ เชธเชฎเซ€เช•เซเชทเชพเช“เชจเซ€ เชฎเชนเชคเซเชคเชฎ เชธเช‚เช–เซเชฏเชพเชจเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพ เช…เชฅเชตเชพ เชชเชนเซ‹เช‚เชšเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเชฎเชฏเชฎเชฐเซเชฏเชพเชฆเชพ เช“เชณเช‚เช—เชพเชˆ เชœเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเชจเซ‡ เชเช• เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡:

เชซเซเชฒเซ‡เช—เชฐ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชธเชพเชฅเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ

เช…เช‚เชคเชฎเชพ

Kubernetes เชจเซ€ เชŸเซ‹เชš เชชเชฐ Istio เชœเซ‡เชตเซ€ เชธเชฐเซเชตเชฟเชธ เชฎเซ‡เชถ เชšเชฒเชพเชตเชตเชพเชฅเซ€ เช†เชชเซ‹เช†เชช เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ, เชฒเซ‹เช—เซเชธ เช…เชจเซ‡ เชฒเซ‹เช—เซเชธ เชฎเชณเชถเซ‡, เชชเชฐเช‚เชคเซ เชตเชฐเซเช•เชฒเซ‹เชกเชจเซ‡ เชœเชฎเชพเชตเชตเซเช‚ เชนเชœเซ เชชเชฃ เชฌเชพเชนเซเชฏ เชธเชพเชงเชจเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชซเซเชฒเซ‡เช—เชฐเชจเซ‹ เชนเซ‡เชคเซ Istio เช•เซเชทเชฎเชคเชพเช“ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เช†เชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ‹ เช›เซ‡ เชชเซเชฐเช—เชคเชฟเชถเซ€เชฒ เชกเชฟเชฒเชฟเชตเชฐเซ€.

เชซเซเชฒเซ‡เช—เชฐ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡เชจเชพ เช•เซ‹เชˆเชชเชฃ CI/CD เชธเซ‹เชฒเซเชฏเซเชถเชจ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชค เช›เซ‡, เช…เชจเซ‡ เช•เซ‡เชจเซ‡เชฐเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชตเซ‡เชฌเชนเซเช•เซเชธ เชธเชฟเชธเซเชŸเชฎ เชเช•เซ€เช•เชฐเชฃ/เชธเซเชตเซ€เช•เซƒเชคเชฟ เชชเชฐเซ€เช•เซเชทเชฃเซ‹, เชฒเซ‹เชก เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช…เชฅเชตเชพ เช•เซ‹เชˆเชชเชฃ เช…เชจเซเชฏ เช•เชธเซเชŸเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เชซเซเชฒเซ‡เช—เชฐ เช˜เซ‹เชทเชฃเชพเชคเซเชฎเช• เช›เซ‡ เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช‡เชตเซ‡เชจเซเชŸเซเชธเชจเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเซ‡ เช›เซ‡, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— GitOps เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธเชฎเชพเช‚ เชธเชพเชฅเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. เชตเชฃเชพเชŸ เชชเซเชฐเชตเชพเชน เช…เชฅเชตเชพ เชœเซ‡เชจเช•เชฟเชจเซเชธเชเช•เซเชธ. เชœเซ‹ เชคเชฎเซ‡ JenkinsX เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ jx เชเชก-เช“เชจเซเชธ เชธเชพเชฅเซ‡ เชซเซเชฒเซ‡เช—เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชซเซเชฒเซ‡เช—เชฐ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เชตเชฃเชพเชŸเช•เชพเชฎ เช…เชจเซ‡ เชฎเชพเช‚ เช•เซ‡เชจเซ‡เชฐเซ€ เชœเชฎเชพเชตเชŸ เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡ เชตเซ€เชต เช•เซเชฒเชพเช‰เชก. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ GKE, EKS เช…เชจเซ‡ kubeadm เชธเชพเชฅเซ‡ เชฌเซ‡เชฐ เชฎเซ‡เชŸเชฒ เชชเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชซเซเชฒเซ‡เช—เชฐเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‚เชšเชจเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ GitHub เชชเชฐ เช•เซ‹เชˆ เชฎเซเชฆเซเชฆเซ‹ เช…เชฅเชตเชพ PR เชธเชฌเชฎเชฟเชŸ เช•เชฐเซ‹ เชธเซเชŸเซ‡เชซเชจเชชเซเชฐเซ‹เชกเชจ/เชซเซเชฒเซ‡เช—เชฐ. เชฏเซ‹เช—เชฆเชพเชจ เช†เชตเช•เชพเชฐเซเชฏ เช•เชฐเชคเชพเช‚ เชตเชงเซ เช›เซ‡!

ะกะฟะฐัะธะฑะพ เชฐเซ‡ เชคเซเชธเช‚เช—.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹