เดซเตเดฒเดพเด—เดฑเตเด‚ เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹เดฏเตเด‚ เด‰เดณเตเดณ เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ

เดซเตเดฒเดพเด—เดฑเตเด‚ เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹เดฏเตเด‚ เด‰เดณเตเดณ เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ

เดธเดฟเดกเดฟ เด’เดฐเต เดŽเดจเตเดฑเตผเดชเตเดฐเตˆเดธเต เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดชเดฐเดฟเดถเต€เดฒเดจเดฎเดพเดฏเดฟ เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดธเตเดฅเดพเดชเดฟเดคเดฎเดพเดฏ CI เดคเดคเตเดตเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดพเดญเดพเดตเดฟเด• เดชเดฐเดฟเดฃเดพเดฎเดคเตเดคเดฟเดจเตเดฑเต† เดซเดฒเดฎเดพเดฃเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดธเดฟเดกเดฟ เด‡เดชเตเดชเต‹เดดเตเด‚ เดตเดณเดฐเต† เดตเดฟเดฐเดณเดฎเดพเดฃเต, เด’เดฐเตเดชเด•เตเดทเต‡ เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเดฟเดจเตเดฑเต† เดธเด™เตเด•เต€เตผเดฃเตเดฃเดคเดฏเตเด‚ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดฒเดญเตเดฏเดคเดฏเต† เดฌเดพเดงเดฟเด•เตเด•เตเดจเตเดจ เดชเดฐเดพเดœเดฏ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดญเดฏเดตเตเด‚ เด•เดพเดฐเดฃเด‚.

เดซเตเดฒเดพเด—เตผ เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดฎเตเดฃเตเดŸเดพเด•เตเด•เตเดจเตเดจ เดฌเดจเตเดงเด™เตเด™เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเตป เดฒเด•เตเดทเตเดฏเดฎเดฟเดŸเตเดจเตเดจ เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฑเดพเดฃเต. เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดค เดฑเต‹เตพเด”เดŸเตเดŸเต เดธเดฎเดฏเดคเตเดคเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตเดตเดญเดพเดตเด‚ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด‡เดธเตเดคเดฟเดฏเต‹ เดŸเตเดฐเดพเดซเดฟเด•เต เด“เดซเตเดธเต†เดฑเตเดฑเตเด‚ เดชเตเดฐเตŠเดฎเดฟเดคเตเดฏเต‚เดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตเดธเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดฎเต‹เดทเตป เด‡เดคเต เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

Google Kubernetes Engine-เตฝ (GKE) เดซเตเดฒเดพเด—เตผ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเตเดณเตเดณ เด—เตˆเดกเต เดšเตเดตเดŸเต†เดฏเตเดฃเตเดŸเต.

เด’เดฐเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดจเดฟเด™เตเด™เตพ Istio เด†เดกเต-เด“เตบ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต GKE เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด• (เดจเดฟเด™เตเด™เตพเด•เตเด•เต GCP เด…เด•เตเด•เต—เดฃเตเดŸเต เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตˆเตป เด…เดชเตเดชเต เดšเต†เดฏเตเดฏเดพเด‚ เด‡เดตเดฟเดŸเต† - เดธเต—เดœเดจเตเดฏ เด•เตเดฐเต†เดกเดฟเดฑเตเดฑเตเด•เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต).

Google เด•เตเดฒเต—เดกเดฟเดฒเต‡เด•เตเด•เต เดธเตˆเตป เด‡เตป เดšเต†เดฏเตเดฏเตเด•, เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•, เด…เดคเดฟเดจเดพเดฏเดฟ เดฌเดฟเดฒเตเดฒเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด•. เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด• 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, เดฑเดพเด‚ 7,5 GB, เดกเดฟเดธเตเด•เต: 30 GB). เดจเดฟเด™เตเด™เดณเตเดŸเต† เดœเต‹เดฒเดฟเดญเดพเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด‡เดธเตเดคเดฟเดฏเต‹ เด˜เดŸเด•เด™เตเด™เดณเต† เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดจเต‹เดกเตเด•เดณเตเดŸเต† เดธเดฎเตผเดชเตเดชเดฟเดค เดชเต‚เดณเดฟเตฝ เด‡เดธเตเดคเดฟเดฏเต‹ เดชเต‹เดกเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดŽเดณเตเดชเตเดชเดตเดดเดฟเดฏเดฟเดฒเตเดฒ. เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดฑเต€เดกเต-เด“เตบเดฒเดฟ เด†เดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดจเต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต‹ เดชเต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต‡เตผเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเต‹ เดชเต‹เดฒเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ 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 เด‡เดชเตเดชเต‹เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต เดฒเดฟเดจเด•เตเดธเต.

เดŸเดฟเดฒเตเดฒเดฑเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดธเต‡เดตเดจ เด…เด•เตเด•เต—เดฃเตเดŸเตเด‚ เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดฑเต‹เตพ เดฌเตˆเตปเดกเดฟเด‚เด—เตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

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.

เด‡เดธเตเดคเดฟเดฏเต‹ เด‡เตปเด—เตเดฐเดธเต เด—เต‡เดฑเตเดฑเตโ€Œเดตเต‡ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด’เดฐเต เดชเต‡เดฐเดฟเดจเตŠเดชเตเดชเด‚ เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดเดชเดฟ เดตเดฟเดฒเดพเดธเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• istio-gatewayเด‡เดธเตเดคเดฟเดฏเต‹ เด—เต‡เดฑเตเดฑเตโ€Œเดตเต‡เดฏเตเดŸเต† 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 เดฎเตเด–เต‡เดจเดฏเตเดณเตเดณ เดธเต‡เดตเดจ เดฎเต†เดทเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดธเต‡เดตเดจเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดชเตŠเดคเต เด‡เดธเตเดคเดฟเดฏเต‹ เด—เต‡เดฑเตเดฑเตโ€Œเดตเต‡ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

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 เด‡เดฒเตเดฒเดพเดคเต† เด’เดฐเต เดชเตเดฐเตŠเดกเด•เตเดทเตป เดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚ เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เดธเต‡เดตเดจเด™เตเด™เตพ เดจเตฝเด•เดฐเตเดคเต. Cert-manager, CloudDNS, Let's Encrypt เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Istio เดชเตเดฐเดตเต‡เดถเดจ เด—เต‡เดฑเตเดฑเตโ€Œเดตเต‡ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเด•เตเด•เดพเตป, เดฆเดฏเดตเดพเดฏเดฟ เดตเดพเดฏเดฟเด•เตเด•เตเด• เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚ เดชเดคเดพเด• เดœเดฟ.เด•เต†.เด‡.

เดซเตเดฒเดพเด—เตผ เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเตป

GKE Istio เด†เดกเต-เด“เดฃเดฟเตฝ Istio เดŸเต†เดฒเดฟเดฎเต†เดŸเตเดฐเดฟ เดธเต‡เดตเดจเด‚ เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเดจเตเดจ เด’เดฐเต Prometheus เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ. เด•เดพเดจเดฑเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดจเดŸเดคเตเดคเดพเตป Flagger Istio HTTP เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด”เดฆเตเดฏเต‹เด—เดฟเด• เด‡เดธเตเดคเดฟเดฏเต‹ เดนเต†เตฝเด‚ เดธเตโ€Œเด•เต€เดฎเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเด‚ เดตเดฐเตเดจเตเดจเดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏเดฟ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดจเดฟเด™เตเด™เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

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-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 เดฌเตเดฐเต—เดธเดฑเดฟเตฝ, เดจเดฟเด™เตเด™เดณเต† เด—เตเดฐเดพเดซเดพเดจ เดฒเต‹เด—เดฟเตป เดชเต‡เดœเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เดฃเด‚.

เดซเตเดฒเดพเด—เตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเต

เดซเตเดฒเดพเด—เตผ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเด•เดณเต† เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด“เดชเตโ€Œเดทเดฃเดฒเดพเดฏเดฟ เดธเตเดตเดฏเดฎเต‡เดต เดธเตเด•เต†เดฏเดฟเตฝ เด”เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต (HPA), เดคเตเดŸเตผเดจเตเดจเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดถเตเดฐเต‡เดฃเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต (เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเดธเต เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ, เด•เตเดฒเดธเตเดฑเตเดฑเตผเดเดชเดฟ เดธเต‡เดตเดจเด™เตเด™เตพ, เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹ เดตเต†เตผเดšเตเดตเตฝ เดธเต‡เดตเดจเด™เตเด™เตพ). เดˆ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพ เดธเต‡เดตเดจ เดฎเต†เดทเดฟเดฒเต‡เด•เตเด•เต เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต† เดคเตเดฑเดจเตเดจเตเด•เดพเดŸเตเดŸเตเด•เดฏเตเด‚ เด•เดพเดจเดฑเดฟ เดตเดฟเดถเด•เดฒเดจเดตเตเด‚ เดชเตเดฐเต‹เด—เดคเดฟเดฏเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดซเตเดฒเดพเด—เดฑเตเด‚ เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹เดฏเตเด‚ เด‰เดณเตเดณ เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ

Istio Sidecar injection เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟ เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

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, เดจเดฟเด™เตเด™เตพ เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ เด•เดพเดฃเดฃเด‚ เดกเต†เดฎเต‹ เด†เดชเตเดชเตเด•เตพ.

เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดถเด•เดฒเดจเดตเตเด‚ เดชเตเดฐเดฎเต‹เดทเดจเตเด‚

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเดฟเดœเดฏ เดจเดฟเดฐเด•เตเด•เต, เดถเดฐเดพเดถเดฐเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฆเตˆเตผเด˜เตเดฏเด‚, เดชเต‹เดกเต เด†เดฐเต‹เด—เตเดฏเด‚ เดŽเดจเตเดจเดฟเดต เดชเต‹เดฒเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เดชเตเดฐเด•เดŸเดจ เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเตเด•เตพ เด…เดณเด•เตเด•เตเดฎเตเดชเต‹เตพ เด•เตเดฐเดฎเต‡เดฃ เด•เดพเดจเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดŸเตเดฐเดพเดซเดฟเด•เตเด•เดฟเดจเต† เดจเต€เด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เตบเดŸเตเดฐเต‹เตพ เดฒเต‚เดชเตเดชเต เดซเตเดฒเดพเด—เตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เด•เต†เดชเดฟเด เดตเดฟเดถเด•เดฒเดจเดคเตเดคเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ, เด•เดพเดจเดฑเดฟเดฏเต† เดชเตเดฐเต‹เดคเตเดธเดพเดนเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเต‹ เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเตเดฑเต† เดซเดฒเด™เตเด™เตพ เดธเตเดฒเดพเด•เตเด•เดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดซเตเดฒเดพเด—เดฑเตเด‚ เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹เดฏเตเด‚ เด‰เดณเตเดณ เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ

เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต เดฎเดพเดฑเตเดฎเตเดชเต‹เตพ เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŸเตเดฐเดฟเด—เตผ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต:

  • PodSpec เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด• (เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด‡เดฎเต‡เดœเต, เด•เดฎเดพเตปเดกเต, เดชเต‹เตผเดŸเตเดŸเตเด•เตพ, env เดฎเตเดคเดฒเดพเดฏเดต)
  • เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฎเดพเดชเตเดชเตเด•เตพ เดตเต‹เดณเตเดฏเด™เตเด™เดณเดพเดฏเดฟ เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดชเตเดชเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • เดฐเดนเดธเตเดฏเด™เตเด™เตพ เดตเต‹เดณเตเดฏเด™เตเด™เดณเดพเดฏเดฟ เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด‡เดฎเต‡เดœเต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

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

เดจเดฟเด™เตเด™เตพ เดธเตเดฒเดพเด•เตเด•เต เด…เดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเด‚:

เดซเตเดฒเดพเด—เดฑเตเด‚ เด‡เดธเตเดฑเตเดฑเดฟเดฏเต‹เดฏเตเด‚ เด‰เดณเตเดณ เดฏเดพเดจเตเดคเตเดฐเดฟเด• เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ

เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดฑเต‹เตพเดฌเดพเด•เตเด•เต

เด•เดพเดจเดฑเดฟ เดตเดฟเดถเด•เดฒเดจ เดธเดฎเดฏเดคเตเดคเต, เดซเตเดฒเดพเด—เตผ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดคเตเดคเตเดฎเต‹เดฏเต†เดจเตเดจเดฑเดฟเดฏเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฟเดจเตเดคเดฑเตเดฑเดฟเด•เต 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 เด•เดดเดฟเดตเตเด•เตพ เดšเต‡เตผเดคเตเดคเต เด‡เดคเต เดฎเดพเดฑเตเดฑเดพเตป เดซเตเดฒเดพเด—เตผ เดฒเด•เตเดทเตเดฏเดฎเดฟเดŸเตเดจเตเดจเต เดชเตเดฐเต‹เด—เดฎเดจเดชเดฐเดฎเดพเดฏ เดกเต†เดฒเดฟเดตเดฑเดฟ.

เดซเตเดฒเดพเด—เตผ เดเดคเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดธเดฟเด/เดธเดฟเดกเดฟ เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด•เดพเดจเดฑเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ เดตเต†เดฌเตเดนเต‚เด•เตเด•เตเด•เตพ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป/เดธเตเดตเต€เด•เดพเดฐเตเดฏเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ, เดฒเต‹เดกเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต. เดซเตเดฒเดพเด—เตผ เดกเดฟเด•เตเดฒเดฑเต‡เดฑเตเดฑเต€เดตเต เด†เดฏเดคเดฟเดจเดพเดฒเตเด‚ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด‡เดตเดจเตเดฑเตเด•เดณเต‹เดŸเต เดชเตเดฐเดคเดฟเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฒเตเด‚ เด‡เดคเต GitOps เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด•เดณเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต เดจเต†เดฏเตเดคเตเดคเต เดซเตเดฒเด•เตเดธเต เด…เดฅเดตเดพ เดœเต†เด™เตเด•เดฟเตปเดธเต เดŽเด•เตเดธเต. เดจเดฟเด™เตเด™เตพ JenkinsX เด†เดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต jx addons เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Flagger เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚.

เดซเตเดฒเดพเด—เตผ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต เดจเต†เดฏเตเดคเตเดคเตเดชเดฃเดฟเด•เตพ เด’เดชเตเดชเด‚ เด•เดพเดจเดฑเดฟ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเต เดจเต†เดฏเตเดคเตเดคเต เดฎเต‡เด˜เด‚. GKE, EKS, kubeadm เด‰เดณเตเดณ เดฌเต†เดฏเตผ เดฎเต†เดฑเตเดฑเตฝ เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต.

เดซเตเดฒเดพเด—เตผ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดฆเดฏเดตเดพเดฏเดฟ GitHub-เตฝ เด’เดฐเต เดชเตเดฐเดถเตโ€Œเดจเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PR เดธเดฎเตผเดชเตเดชเดฟเด•เตเด•เตเด• เดธเตเดฑเตเดฑเต†เดซเดพเตปเดชเตเดฐเตŠเดกเดพเตป/เดซเตเดฒเดพเด—เตผ. เดธเด‚เดญเดพเดตเดจเด•เตพ เดธเตเดตเดพเด—เดคเดพเตผเดนเดฎเดพเดฃเต!

ะกะฟะฐัะธะฑะพ เดฑเต‡ เดธเดพเด™เต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•