рд╕реАрдбреА рд╣реА рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдкреНрд░реЕрдХреНрдЯрд┐рд╕ рдореНрд╣рдгреВрди рдУрд│рдЦрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕реНрдерд╛рдкрд┐рдд рд╕реАрдЖрдп рддрддреНрддреНрд╡рд╛рдВрдЪреА рдиреИрд╕рд░реНрдЧрд┐рдХ рдЙрддреНрдХреНрд░рд╛рдВрддреА рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рд╕реАрдбреА рдЕрдЬреВрдирд╣реА рджреБрд░реНрдорд┐рд│ рдЖрд╣реЗ, рдХрджрд╛рдЪрд┐рдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рдЪреНрдпрд╛ рдЬрдЯрд┐рд▓рддреЗрдореБрд│реЗ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрд▓рдмреНрдзрддреЗрд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рдгрд╛рд▒реНрдпрд╛ рдЕрдпрд╢рд╕реНрд╡реА рддреИрдирд╛рддреАрдЪреНрдпрд╛ рднреАрддреАрдореБрд│реЗ.
рдЦрд╛рд▓реА Google Kubernetes Engine (GKE) рд╡рд░ рдлреНрд▓реЕрдЧрд░ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдЖрд╣реЗ.
Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ
рддреБрдореНрд╣реА Istio рдЕреЕрдб-рдСрдирд╕рд╣ GKE рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рддрд╛ (рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ GCP рдЦрд╛рддреЗ рдирд╕реЗрд▓, рддрд░ рддреБрдореНрд╣реА рд╕рд╛рдЗрди рдЕрдк рдХрд░реВ рд╢рдХрддрд╛.
Google Cloud рдордзреНрдпреЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рд╛, рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд╕рд╛рдареА рдмрд┐рд▓рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рд╛. рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ 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 рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рддреБрдордЪреНрдпрд╛ рд╣реЗрд▓реНрдо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рдирдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, рдкрд╣рд╛
рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдЪреА рдкреБрд╖реНрдЯреА рдХрд░рд╛:
kubectl -n istio-system get svc
рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдирдВрддрд░, GCP рдиреЗ рд╕реЗрд╡реЗрд▓рд╛ рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ istio-ingressgateway
.
Istio Ingress рдЧреЗрдЯрд╡реЗ рд╕реЗрдЯ рдХрд░рдгреЗ
рдирд╛рд╡рд╛рд╕рд╣ рдПрдХ рд╕реНрдерд┐рд░ IP рдкрддреНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛ istio-gateway
Istio рдЧреЗрдЯрд╡реЗ IP рдкрддреНрддрд╛ рд╡рд╛рдкрд░реВрди:
export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip)
gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1
рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдбреЛрдореЗрди рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ DNS рд░рдЬрд┐рд╕реНрдЯреНрд░рд╛рд░рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рджреЛрди рдП рд░реЗрдХреЙрд░реНрдб рдЬреЛрдбрд╛ (рдмрджрд▓рд╛ example.com
рддреБрдордЪреНрдпрд╛ рдбреЛрдореЗрдирд╡рд░):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
DNS рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛рд░реНрдпрд░рдд рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рд╛:
watch host test.istio.example.com
HTTP рд╡рд░ рд╕реЗрд╡рд╛ рдЬрд╛рд│реАрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп Istio рдЧреЗрдЯрд╡реЗ рддрдпрд╛рд░ рдХрд░рд╛:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: public-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
рд╡рд░реАрд▓ рд╕реНрддреНрд░реЛрдд public-gateway.yaml рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХрд░рд╛ рдЖрдгрд┐ рдирдВрддрд░ рддреЗ рд▓рд╛рдЧреВ рдХрд░рд╛:
kubectl apply -f ./public-gateway.yaml
рдХреЛрдгрддреНрдпрд╛рд╣реА рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реАрдиреЗ SSL рд╢рд┐рд╡рд╛рдп рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рд╕реЗрд╡рд╛ рджреЗрдК рдирдпреЗ. рдкреНрд░рдорд╛рдгрдкрддреНрд░-рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ, рдХреНрд▓рд╛рдЙрдбрдбреАрдПрдирдПрд╕ рдЖрдгрд┐ рд▓реЗрдЯреНрд╕ рдПрдирдХреНрд░рд┐рдкреНрдЯрд╕рд╣ рддреБрдордЪрд╛ Istio рдкреНрд░рд╡реЗрд╢ рдЧреЗрдЯрд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХреГрдкрдпрд╛ рд╡рд╛рдЪрд╛
рдлреНрд▓реЕрдЧрд░ рд╕реНрдерд╛рдкрдирд╛
GKE Istio рдНрдб-рдСрди рдордзреНрдпреЗ Prometheus рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдирд╛рд╣реА рдЬреЗ Istio рдЯреЗрд▓рд┐рдореЗрдЯреНрд░реА рд╕реЗрд╡рд╛ рд╕рд╛рдл рдХрд░рддреЗ. рдлреНрд▓реЕрдЧрд░ рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Istio HTTP рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ Prometheus рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддреИрдирд╛рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗ рдЕрдзрд┐рдХреГрдд 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
, рддреБрдореНрд╣реА рдЖрд╡реГрддреНрддреА рдХреНрд░рдорд╛рдВрдХ рдкрд╣рд╛рд╡рд╛
рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рдЬрд╛рд╣рд┐рд░рд╛рдд
рдлреНрд▓реЕрдЧрд░ рдПрдХ рдХрдВрдЯреНрд░реЛрд▓ рд▓реВрдк рд▓рд╛рдЧреВ рдХрд░рддреЛ рдЬреЗ HTTP рд╡рд┐рдирдВрддреА рдпрд╢ рджрд░, рд╕рд░рд╛рд╕рд░реА рд╡рд┐рдирдВрддреА рдХрд╛рд▓рд╛рд╡рдзреА рдЖрдгрд┐ рдкреЙрдб рд╣реЗрд▓реНрде рдпрд╛рд╕рд╛рд░рдЦреЗ рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдирд┐рд░реНрджреЗрд╢рдХ рдореЛрдЬрддрд╛рдирд╛ рд╣рд│реВрд╣рд│реВ рдХреЕрдирд░реАрдХрдбреЗ рд░рд╣рджрд╛рд░реА рд╣рд▓рд╡рддреЗ. KPI рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рдХреЕрдирд░реАрд▓рд╛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рджрд┐рд▓реЗ рдЬрд╛рддреЗ рдХрд┐рдВрд╡рд╛ рд╕рдВрдкреБрд╖реНрдЯрд╛рдд рдЖрдгрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рд╕реНрд▓реЕрдХрдордзреНрдпреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.
рдЦрд╛рд▓реАрд▓рдкреИрдХреА рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдмрджрд▓рддреЗ рддреЗрд╡реНрд╣рд╛ рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:
- рдкреЙрдбрд╕реНрдкреЗрдХ рддреИрдирд╛рдд рдХрд░рд╛ (рдХрдВрдЯреЗрдирд░ рдЗрдореЗрдЬ, рдХрдорд╛рдВрдб, рдкреЛрд░реНрдЯреНрд╕, рдПрдирд╡реНрд╣реА, рдЗ.)
- рдХреЙрдиреНрдлрд┐рдЧрдореЕрдкреНрд╕ рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореНрд╣рдгреВрди рдорд╛рдЙрдВрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд
- рд╕рд┐рдХреНрд░реЗрдЯреНрд╕ рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореНрд╣рдгреВрди рдорд╛рдЙрдВрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд
рдХрдВрдЯреЗрдирд░ рдЗрдореЗрдЬ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛рдирд╛ рдХреЕрдирд░реА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдЪрд╛рд▓рд╡рд╛:
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
рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди, Grafana рд╡рд╛рдкрд░реВрди рдХреЕрдирд░реА рдкрд░рд┐рдгрд╛рдорд╛рдВрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:
рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛: рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рдЙрдкрдпреЛрдЬрдирд╛рдордзреНрдпреЗ рдирд╡реАрди рдмрджрд▓ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рд╕, рдлреНрд▓реЕрдЧрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪрд╛ рдЯрдкреНрдкрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реЗрд▓.
рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡ рдХреЕрдирд░реАрдВрдЪреА рдпрд╛рджреА рдмрдирд╡рд╛:
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 рдХреНрд╖рдорддрд╛ рдЬреЛрдбреВрди рд╣реЗ рдмрджрд▓рдгреНрдпрд╛рдЪреЗ рдлреНрд▓реЕрдЧрд░рдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдЖрд╣реЗ
рдлреНрд▓реЕрдЧрд░ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рд╛рдареА рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реАрдЖрдп/рд╕реАрдбреА рд╕реЛрд▓реНрдпреВрд╢рдирд╢реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ рдЖрдгрд┐ рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рд╣рдЬрдкрдгреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ
рдлреНрд▓реЕрдЧрд░ рд╕рдорд░реНрдерд┐рдд
рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдлреНрд▓реЕрдЧрд░ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реВрдЪрдирд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рдпреЗрдереЗ GitHub рд╡рд░ рд╕рдорд╕реНрдпрд╛ рдХрд┐рдВрд╡рд╛ PR рд╕рдмрдорд┐рдЯ рдХрд░рд╛
╨б╨┐╨░╤Б╨╕╨▒╨╛
рд╕реНрддреНрд░реЛрдд: www.habr.com