เจซเจฒเฉˆเจ—เจฐ เจ…เจคเฉ‡ เจ‡เจธเจŸเฉ€เจ“ เจจเจพเจฒ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

เจซเจฒเฉˆเจ—เจฐ เจ…เจคเฉ‡ เจ‡เจธเจŸเฉ€เจ“ เจจเจพเจฒ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

CD เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจเจ‚เจŸเจฐเจชเฉเจฐเจพเจˆเจœเจผ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจ…เจญเจฟเจ†เจธ เจตเจœเฉ‹เจ‚ เจฎเจพเจจเจคเจพ เจชเฉเจฐเจพเจชเจค เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจธเจฅเจพเจชเจฟเจค 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, 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

Homebrew 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 Ingress เจ—เฉ‡เจŸเจตเฉ‡ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ

เจจเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ 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 เจ‰เฉฑเจคเฉ‡ เจธเจฐเจตเจฟเจธ เจฎเฉ‡เจธเจผ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ†เจฎ เจ‡เจธเจŸเฉ€เจ“ เจ—เฉ‡เจŸเจตเฉ‡ เจฌเจฃเจพเจ“:

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 เจ…เจคเฉ‡ Let's Encrypt เจจเจพเจฒ เจ†เจชเจฃเฉ‡ Istio เจชเฉเจฐเจตเฉ‡เจธเจผ เจ—เฉ‡เจŸเจตเฉ‡ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฒเจˆ, เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจชเฉœเฉเจนเฉ‹ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจซเจฒเฉˆเจ—เจฐ เจœเฉ€.เจ•เฉ‡.เจˆ.

เจซเจฒเฉˆเจ—เจฐ เจธเจฅเจพเจชเจจเจพ

GKE Istio เจเจก-เจ†เจจ เจตเจฟเฉฑเจš Prometheus เจ‰เจฆเจพเจนเจฐเจจ เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเฉ‹ Istio เจŸเฉˆเจฒเฉ€เจฎเฉˆเจŸเจฐเฉ€ เจธเฉ‡เจตเจพ เจจเฉ‚เฉฐ เจธเจพเจซเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจซเจฒเฉˆเจ—เจฐ เจ•เฉˆเจจเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฒเจˆ Istio HTTP เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจจเจฟเจฎเจจเจฒเจฟเจ–เจค เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจงเจฟเจ•เจพเจฐเจค Istio เจนเฉˆเจฒเจฎ เจธเจ•เฉ€เจฎเจพ เจฆเฉ‡ เจจเจพเจฒ เจ†เจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค

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 เจธเฉ‡เจตเจพ เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจซเจฒเฉˆเจ—เจฐ เจ•เฉ‹เจฒ เจ•เฉˆเจจเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจ—เฉเจฐเจพเจซเจพเจจเจพ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจนเฉˆเฅค เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš 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

เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจธเฉ‡เจตเจพ (เจฌเจฆเจฒเฉ‹ 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 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, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฐเจœเจจ เจจเฉฐเจฌเจฐ เจฆเฉ‡เจ–เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจกเฉˆเจฎเฉ‹ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ.

เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ•เฉˆเจจเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ…เจคเฉ‡ เจคเจฐเฉฑเจ•เฉ€

เจซเจฒเฉˆเจ—เจฐ เจ‡เฉฑเจ• เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจฒเฉ‚เจช เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเฉ‚เฉฐ เจนเฉŒเจฒเฉ€-เจนเฉŒเจฒเฉ€ เจ•เฉˆเจจเจฐเฉ€ เจตเฉฑเจฒ เจฒเฉˆ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจฎเฉเฉฑเจ– เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจธเฉ‚เจšเจ•เจพเจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ HTTP เจฌเฉ‡เจจเจคเฉ€ เจธเจซเจฒเจคเจพ เจฆเจฐ, เจ”เจธเจค เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจฎเจฟเจ†เจฆ, เจ…เจคเฉ‡ เจชเฉŒเจก เจธเจฟเจนเจค เจจเฉ‚เฉฐ เจฎเจพเจชเจฆเฉ‡ เจนเฉ‹เจเฅค เจ•เฉ‡เจชเฉ€เจ†เจˆ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡, เจ•เฉˆเจจเจฐเฉ€ เจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจตเจงเจพเจ‡เจ† เจœเจพเจ‚ เจธเจฎเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจธเจฒเฉˆเจ• เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค

เจซเจฒเฉˆเจ—เจฐ เจ…เจคเฉ‡ เจ‡เจธเจŸเฉ€เจ“ เจจเจพเจฒ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจ‰เจฆเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เฉ‹เจˆ เจ‡เฉฑเจ• เจฌเจฆเจฒเจฆเจพ เจนเฉˆ:

  • 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

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจธเจฒเฉˆเจ• เจธเฉ‚เจšเจจเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจฃเจ—เฉ‡:

เจซเจฒเฉˆเจ—เจฐ เจ…เจคเฉ‡ เจ‡เจธเจŸเฉ€เจ“ เจจเจพเจฒ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€

เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจฐเฉ‹เจฒเจฌเฉˆเจ•

เจ•เฉˆเจจเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจธเจฟเฉฐเจฅเฉˆเจŸเจฟเจ• 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 เจตเจฐเจ—เฉ‡ เจธเฉ‡เจตเจพ เจœเจพเจฒ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ, เจฒเฉŒเจ—เจธ เจ…เจคเฉ‡ เจฒเฉŒเจ— เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเฉ‡เจ—เจพ, เจชเจฐ เจตเจฐเจ•เจฒเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจ…เจœเฉ‡ เจตเฉ€ เจฌเจพเจนเจฐเฉ€ เจธเจพเจงเจจเจพเจ‚ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจซเจฒเฉˆเจ—เจฐ เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจ‡เจธเจŸเฉ€เจ“ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจ•เฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจนเฉˆ เจชเฉเจฐเจ—เจคเฉ€เจธเจผเฉ€เจฒ เจกเจฟเจฒเฉ€เจตเจฐเฉ€.

เจซเจฒเฉˆเจ—เจฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ CI/CD เจนเฉฑเจฒ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉˆ, เจ…เจคเฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจจเฉ‚เฉฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจตเจงเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจธเจฟเจธเจŸเจฎ เจเจ•เฉ€เจ•เจฐเจฃ/เจธเจตเฉ€เจ•เฉเจฐเจฟเจคเฉ€ เจŸเฉˆเจธเจŸ, เจฒเฉ‹เจก เจŸเฉˆเจธเจŸ เจœเจพเจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจซเจฒเฉˆเจ—เจฐ เจ˜เฉ‹เจธเจผเจฃเจพเจคเจฎเจ• เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เจตเฉˆเจ‚เจŸเจธ เจฆเจพ เจœเจตเจพเจฌ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ GitOps เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจตเฉ‡เจต เจซเจฒเฉˆเจ•เจธ เจœ เจœเฉ‡เจจเจ•เจฟเจจเจธเจเจ•เจธ. เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ JenkinsX เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจฐเจนเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ jx เจเจก-เจ†เจจ เจฆเฉ‡ เจจเจพเจฒ เจซเจฒเฉˆเจ—เจฐ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจซเจฒเฉˆเจ—เจฐ เจธเจฎเจฐเจฅเจฟเจค เจนเฉˆ เจฌเฉเจฃเจพเจˆ เจฆเจพ เจ•เฉฐเจฎ เจ…เจคเฉ‡ เจตเจฟเฉฑเจš เจ•เฉˆเจจเจฐเฉ€ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจตเฉ‡เจต เจ•เจฒเจพเจŠเจก. เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจœเจพเจ‚เจš GKE, EKS เจ…เจคเฉ‡ เจฌเฉ‡เจ…เจฐ เจฎเฉˆเจŸเจฒ 'เจคเฉ‡ kubeadm เจจเจพเจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจซเจฒเฉˆเจ—เจฐ เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเฉเจเจพเจ… เจนเจจ, เจคเจพเจ‚ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ GitHub 'เจคเฉ‡ เจ‡เฉฑเจ• เจฎเฉเฉฑเจฆเจพ เจœเจพเจ‚ PR เจฆเจฐเจœ เจ•เจฐเฉ‹ stefanprodan/flagger. เจฏเฉ‹เจ—เจฆเจพเจจ เจธเฉเจ†เจ—เจค เจจเจพเจฒเฉ‹เจ‚ เจตเฉฑเจง เจนเจจ!

ะกะฟะฐัะธะฑะพ เจฐเฉ‡ เจธเจพเจ‚เจ—.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹