рд╕реАрдбреАрд▓рд╛рдИ рдЙрджреНрдпрдо рд╕рдлреНрдЯрд╡реЗрдпрд░ рдЕрднреНрдпрд╛рд╕рдХреЛ рд░реВрдкрдорд╛ рдорд╛рдиреНрдпрддрд╛ рджрд┐рдЗрдиреНрдЫ рд░ рд╕реНрдерд╛рдкрд┐рдд CI рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВрдХреЛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдХрд╛рд╕рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛред рдпрджреНрдпрдкрд┐, рд╕реАрдбреА рдЕрдЭреИ рдзреЗрд░реИ рджреБрд░реНрд▓рдн рдЫ, рд╕рд╛рдпрдж рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рд░ рдкреНрд░рдгрд╛рд▓реА рдЙрдкрд▓рдмреНрдзрддрд╛рд▓рд╛рдИ рдЕрд╕рд░ рдЧрд░реНрдиреЗ рдЕрд╕рдлрд▓ рдкрд░рд┐рдирд┐рдпреЛрдЬрдирдХреЛ рдбрд░рд▓реЗред
рддрд▓ Google Kubernetes Engine (GKE) рдорд╛ рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЪрд░рдгрдмрджреНрдз рдЧрд╛рдЗрдб рдЫред
Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ
рддрдкрд╛рдИрдВ Istio рдПрдб-рдЕрдирд╕рдБрдЧ GKE рдХреНрд▓рд╕реНрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ (рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ GCP рдЦрд╛рддрд╛ рдЫреИрди рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рд╕рд╛рдЗрди рдЕрдк рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
Google рдХреНрд▓рд╛рдЙрдбрдорд╛ рд╕рд╛рдЗрди рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдмрд┐рд▓рд┐рдЩ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН gcloud init
.
рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЧрдгрдирд╛ рдХреНрд╖реЗрддреНрд░, рд░ рдХреНрд╖реЗрддреНрд░ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдмрджрд▓реНрдиреБрд╣реЛрд╕реН PROJECT_ID
рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
GKE рд╕реЗрд╡рд╛ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ HPA рд░ Istio add-ons рдХреЛ рд╕рд╛рде рдХреНрд▓рд╕реНрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio
--cluster-version=${K8S_VERSION}
--zone=us-central1-a
--num-nodes=2
--machine-type=n1-standard-2
--disk-size=30
--enable-autorepair
--no-enable-cloud-logging
--no-enable-cloud-monitoring
--addons=HorizontalPodAutoscaling,Istio
--istio-config=auth=MTLS_PERMISSIVE
рдорд╛рдерд┐рдХреЛ рдЖрджреЗрд╢рд▓реЗ рджреБрдИ VM рд╣рд░реВ рд╕рд╣рд┐рдд рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдиреЛрдб рдкреВрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ n1-standard-2
(vCPU: 2, RAM 7,5 GB, рдбрд┐рд╕реНрдХ: 30 GB)ред рдЖрджрд░реНрд╢ рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рд╡рд░реНрдХрд▓реЛрдбрд╣рд░реВрдмрд╛рдЯ Istio рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдЕрд▓рдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ, рддрд░ рдиреЛрдбрд╣рд░реВрдХреЛ рд╕рдорд░реНрдкрд┐рдд рдкреВрд▓рдорд╛ Istio рдкреЛрдбрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗ рдХреБрдиреИ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ рдЫреИрдиред Istio manifests рд▓рд╛рдИ рдкрдвреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдорд╛рдирд┐рдиреНрдЫ рд░ 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 рдЧреЗрдЯрд╡реЗ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрджреИ
рдирд╛рдордХреЛ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН 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 рдмрд┐рдирд╛ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред рдкреНрд░рдорд╛рдгрдкрддреНрд░-рдкреНрд░рдмрдиреНрдзрдХ, CloudDNS рд░ Let's Encrypt рд╕рдБрдЧ Istio рдкреНрд░рд╡реЗрд╢ рдЧреЗрдЯрд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди, рдХреГрдкрдпрд╛ рдкрдвреНрдиреБрд╣реЛрд╕реН
рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕реНрдерд╛рдкрдирд╛
GKE Istio рдПрдб-рдЕрдирд▓реЗ 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
Slack рд╕реВрдЪрдирд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реЗрд░:
helm upgrade -i flagger flagger/flagger
--namespace=istio-system
--set metricsServer=http://prometheus.istio-system:9090
--set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID
--set slack.channel=general
--set slack.user=flagger
рддрдкрд╛рдИрдВрд▓реЗ рдлреНрд▓реНрдпрд╛рдЧрд░рд▓рд╛рдИ рдХреБрдиреИ рдкрдирд┐ рдиреЗрдорд╕реНрдкреЗрд╕рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрдмрд╕рдореНрдо рдпрд╕рд▓реЗ рдкреЛрд░реНрдЯ 9090 рдорд╛ Istio Prometheus рд╕реЗрд╡рд╛рд╕рдБрдЧ рд╕рдЮреНрдЪрд╛рд░ рдЧрд░реНрди рд╕рдХреНрдЫред
рдлреНрд▓реНрдпрд╛рдЧрд░рд╕рдБрдЧ рдХреНрдпрд╛рдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ Grafana рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рдЫред рдирд╛рдорд╕реНрдерд╛рдирдорд╛ 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 рд▓рдЧрдЗрди рдкреГрд╖реНрдардорд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧрд░рд┐рдиреБ рдкрд░реНрдЫред
рдлреНрд▓реНрдпрд╛рдЧрд░рдХреЛ рд╕рд╛рде рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ
рдлреНрд▓реНрдпрд╛рдЧрд░рд▓реЗ Kubernetes рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдЫ рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдкрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ (HPA) рдорд╛рдкрди рдЧрд░реНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ (Kubernetes deployments, ClusterIP рд╕реЗрд╡рд╛рд╣рд░реВ, рд░ 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)
ред рдХреНрдпрд╛рдирд░реА рд╕реАрдЖрд░рдбреА рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН
рдХреЗрд╣реА рд╕реЗрдХреЗрдиреНрдб рдкрдЫрд┐, рдлреНрд▓реНрдпрд╛рдЧрд░рд▓реЗ рдХреНрдпрд╛рдирд░реА рд╡рд╕реНрддреБрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ:
# 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
рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдХреНрд░рдордорд╛, рдХреНрдпрд╛рдирд░реА рдкрд░рд┐рдгрд╛рдорд╣рд░реВ 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
рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ 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
рдЬрдм рдЕрд╕рдлрд▓ рдЪреЗрдХрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдбрдорд╛ рдкреБрдЧреНрдЫ, рдЯреНрд░рд╛рдлрд┐рдХрд▓рд╛рдИ рдкреНрд░рд╛рдердорд┐рдХ рдЪреНрдпрд╛рдирд▓рдорд╛ рдлрд░реНрдХрд╛рдЗрдиреНрдЫ, рдХреНрдпрд╛рдирд░реАрд▓рд╛рдИ рд╢реВрдиреНрдпрдорд╛ рдорд╛рдкрди рдЧрд░рд┐рдиреНрдЫ, рд░ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд▓рд╛рдИ рдЕрд╕рдлрд▓ рднрдиреА рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдиреНрдЫред
рдХреНрдпрд╛рдирд░реА рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░ рд▓реЗрдЯрдиреНрд╕реА рд╕реНрдкрд╛рдЗрдХрд╣рд░реВ Kubernetes рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рд▓рдЧ рдЗрди рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН рд░ JSON рдврд╛рдБрдЪрд╛рдорд╛ Flagger рджреНрд╡рд╛рд░рд╛ рд▓рдЧ рдЗрди рдЧрд░рд┐рдПрдХреЛ рдЫ:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Starting canary deployment for podinfo.test
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Halt podinfo.test advancement success rate 69.17% < 99%
Halt podinfo.test advancement success rate 61.39% < 99%
Halt podinfo.test advancement success rate 55.06% < 99%
Halt podinfo.test advancement success rate 47.00% < 99%
Halt podinfo.test advancement success rate 37.00% < 99%
Halt podinfo.test advancement request duration 1.515s > 500ms
Halt podinfo.test advancement request duration 1.600s > 500ms
Halt podinfo.test advancement request duration 1.915s > 500ms
Halt podinfo.test advancement request duration 2.050s > 500ms
Halt podinfo.test advancement request duration 2.515s > 500ms
Rolling back podinfo.test failed checks threshold reached 10
Canary failed! Scaling down podinfo.test
рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ Slack рдЕрдзрд┐рд╕реВрдЪрдирд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдореНрдпрд╛рдж рдирд╛рдШреЗрдХреЛ рд╡рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдорд╛ рдЕрд╕рдлрд▓ рдЬрд╛рдБрдЪрд╣рд░реВрдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдкреБрдЧреЗрдкрдЫрд┐ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ:
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
Kubernetes рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд Istio рдЬрд╕реНрддреИ рд╕реЗрд╡рд╛ рдЬрд╛рд▓ рдЪрд▓рд╛рдЙрдБрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕, рд▓рдЧрд╣рд░реВ, рд░ рдкреНрд░реЛрдЯреЛрдХрд▓рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рддрд░ рдХрд╛рд░реНрдпрднрд╛рд░ рддреИрдирд╛рддреА рдЕрдЭреИ рдкрдирд┐ рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгрд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред Flagger рд▓реЗ Istio рдХреНрд╖рдорддрд╛рд╣рд░реВ рдердкреЗрд░ рдпрд╕рд▓рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рд▓рдХреНрд╖реНрдп рд░рд╛рдЦреНрдЫ
рдлреНрд▓реНрдпрд╛рдЧрд░ рдХреБрдиреИ рдкрдирд┐ Kubernetes CI/CD рд╕рдорд╛рдзрд╛рдирд╕рдБрдЧ рдЙрдкрдпреБрдХреНрдд рдЫ, рд░ рдХреНрдпрд╛рдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕рдорд░реНрдерд┐рдд
рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рдХреГрдкрдпрд╛ GitHub рдорд╛ рдореБрджреНрджрд╛ рд╡рд╛ PR рдкреЗрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реН
╨б╨┐╨░╤Б╨╕╨▒╨╛
рд╕реНрд░реЛрдд: www.habr.com