рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рд╕реАрдбреА рд╣реА рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдкреНрд░реЕрдХреНрдЯрд┐рд╕ рдореНрд╣рдгреВрди рдУрд│рдЦрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕реНрдерд╛рдкрд┐рдд рд╕реАрдЖрдп рддрддреНрддреНрд╡рд╛рдВрдЪреА рдиреИрд╕рд░реНрдЧрд┐рдХ рдЙрддреНрдХреНрд░рд╛рдВрддреА рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рд╕реАрдбреА рдЕрдЬреВрдирд╣реА рджреБрд░реНрдорд┐рд│ рдЖрд╣реЗ, рдХрджрд╛рдЪрд┐рдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рдЪреНрдпрд╛ рдЬрдЯрд┐рд▓рддреЗрдореБрд│реЗ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрд▓рдмреНрдзрддреЗрд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рдгрд╛рд▒реНрдпрд╛ рдЕрдпрд╢рд╕реНрд╡реА рддреИрдирд╛рддреАрдЪреНрдпрд╛ рднреАрддреАрдореБрд│реЗ.

рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ Kubernetes рдСрдкрд░реЗрдЯрд░ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪрд╛ рдЙрджреНрджреЗрд╢ рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрдгрд╛рд░реЗ рд╕рдВрдмрдВрдз рджреВрд░ рдХрд░рдгреЗ рдЖрд╣реЗ. рд╣реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рд░реЛрд▓рдЖрдЙрдЯ рджрд░рдореНрдпрд╛рди рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рд╡рд░реНрддрдирд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Istio рдЯреНрд░реЕрдлрд┐рдХ рдСрдлрд╕реЗрдЯ рдЖрдгрд┐ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рдкрд░реВрди рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрдирд╛рдВрдЪреА рдЬрд╛рд╣рд┐рд░рд╛рдд рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рддреЗ.

рдЦрд╛рд▓реА Google Kubernetes Engine (GKE) рд╡рд░ рдлреНрд▓реЕрдЧрд░ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдЖрд╣реЗ.

Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рддреБрдореНрд╣реА Istio рдЕреЕрдб-рдСрдирд╕рд╣ GKE рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рддрд╛ (рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ GCP рдЦрд╛рддреЗ рдирд╕реЗрд▓, рддрд░ рддреБрдореНрд╣реА рд╕рд╛рдЗрди рдЕрдк рдХрд░реВ рд╢рдХрддрд╛. рдпреЗрдереЗ - рд╡рд┐рдирд╛рдореВрд▓реНрдп рдХреНрд░реЗрдбрд┐рдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА).

Google Cloud рдордзреНрдпреЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рд╛, рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд╕рд╛рдареА рдмрд┐рд▓рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рд╛. рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ gCloud рдЖрдгрд┐ рдпрд╛рд╕рд╣ рдЖрдкрд▓рд╛ рдкреНрд░рдХрд▓реНрдк рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛ gcloud init.

рдбреАрдлреЙрд▓реНрдЯ рдкреНрд░рдХрд▓реНрдк, рдЧрдгрдирд╛ рдХреНрд╖реЗрддреНрд░ рдЖрдгрд┐ рдЭреЛрди рд╕реЗрдЯ рдХрд░рд╛ (рдмрджрд▓рд╛ PROJECT_ID рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

GKE рд╕реЗрд╡рд╛ рд╕рдХреНрд╖рдо рдХрд░рд╛ рдЖрдгрд┐ HPA рдЖрдгрд┐ Istio рдЕреЕрдб-рдСрдирд╕рд╣ рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рд╛:

gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio 
--cluster-version=${K8S_VERSION} 
--zone=us-central1-a 
--num-nodes=2 
--machine-type=n1-standard-2 
--disk-size=30 
--enable-autorepair 
--no-enable-cloud-logging 
--no-enable-cloud-monitoring 
--addons=HorizontalPodAutoscaling,Istio 
--istio-config=auth=MTLS_PERMISSIVE

рд╡рд░реАрд▓ рдЖрджреЗрд╢ рджреЛрди VM рдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕рд▓реЗрд▓рд╛ рдбреАрдлреЙрд▓реНрдЯ рдиреЛрдб рдкреВрд▓ рддрдпрд╛рд░ рдХрд░реЗрд▓ n1-standard-2 (vCPU: 2, RAM 7,5 GB, рдбрд┐рд╕реНрдХ: 30 GB). рдЖрджрд░реНрд╢рдкрдгреЗ, Istio рдШрдЯрдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡рд░реНрдХрд▓реЛрдбреНрд╕рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд, рдкрд░рдВрддреБ рд╕рдорд░реНрдкрд┐рдд рдиреЛрдб рдкреВрд▓рд╡рд░ Istio рдкреЙрдбреНрд╕ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдирд╛рд╣реА. Istio рдореЕрдирд┐рдлреЗрд╕реНрдЯ рдХреЗрд╡рд│-рд╡рд╛рдЪрдиреАрдп рдорд╛рдирд▓реЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ GKE рдиреЛрдбрд▓рд╛ рдмрдВрдзрдирдХрд╛рд░рдХ рдХрд┐рдВрд╡рд╛ рдкреЙрдбрдордзреВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдпрд╛рд╕рд╛рд░рдЦреЗ рдХреЛрдгрддреЗрд╣реА рдмрджрд▓ рдкрд░рдд рдХрд░реЗрд▓.

рд╕рд╛рдареА рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рд╛ kubectl:

gcloud container clusters get-credentials istio

рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рд╢рд╛рд╕рдХ рднреВрдорд┐рдХрд╛ рдмрдВрдзрдирдХрд╛рд░рдХ рддрдпрд╛рд░ рдХрд░рд╛:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЯреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ рдкреНрд░рдореБрдЦрдкрджреА:

brew install kubernetes-helm

Homebrew 2.0 рдЖрддрд╛ рдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ linux.

рдЯрд┐рд▓рд░рд╕рд╛рдареА рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рд░реЛрд▓ рдмрдВрдзрдирдХрд╛рд░рдХ рддрдпрд╛рд░ рдХрд░рд╛:

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

рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрдд рдЯрд┐рд▓рд░ рд╡рд┐рд╕реНрддреГрдд рдХрд░рд╛ kube-system:

helm init --service-account tiller

рддреБрдореНрд╣реА рд╣реЗрд▓реНрдо рдЖрдгрд┐ рдЯрд┐рд▓рд░ рджрд░рдореНрдпрд╛рди SSL рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рддреБрдордЪреНрдпрд╛ рд╣реЗрд▓реНрдо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рдирдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, рдкрд╣рд╛ docs.helm.sh

рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдЪреА рдкреБрд╖реНрдЯреА рдХрд░рд╛:

kubectl -n istio-system get svc

рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдирдВрддрд░, GCP рдиреЗ рд╕реЗрд╡реЗрд▓рд╛ рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ istio-ingressgateway.

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 рд╡рд░ рд╕реЗрд╡рд╛ рдЬрд╛рд│реАрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп 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 рдкреНрд░рд╡реЗрд╢ рдЧреЗрдЯрд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХреГрдкрдпрд╛ рд╡рд╛рдЪрд╛ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд G.K.E.

рдлреНрд▓реЕрдЧрд░ рд╕реНрдерд╛рдкрдирд╛

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 рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

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 рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рдХреЕрдирд░реАрд▓рд╛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рджрд┐рд▓реЗ рдЬрд╛рддреЗ рдХрд┐рдВрд╡рд╛ рд╕рдВрдкреБрд╖реНрдЯрд╛рдд рдЖрдгрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рд╕реНрд▓реЕрдХрдордзреНрдпреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рдЦрд╛рд▓реАрд▓рдкреИрдХреА рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдмрджрд▓рддреЗ рддреЗрд╡реНрд╣рд╛ рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

  • рдкреЙрдбрд╕реНрдкреЗрдХ рддреИрдирд╛рдд рдХрд░рд╛ (рдХрдВрдЯреЗрдирд░ рдЗрдореЗрдЬ, рдХрдорд╛рдВрдб, рдкреЛрд░реНрдЯреНрд╕, рдПрдирд╡реНрд╣реА, рдЗ.)
  • рдХреЙрдиреНрдлрд┐рдЧрдореЕрдкреНрд╕ рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореНрд╣рдгреВрди рдорд╛рдЙрдВрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд
  • рд╕рд┐рдХреНрд░реЗрдЯреНрд╕ рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореНрд╣рдгреВрди рдорд╛рдЙрдВрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд

рдХрдВрдЯреЗрдирд░ рдЗрдореЗрдЬ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛рдирд╛ рдХреЕрдирд░реА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдЪрд╛рд▓рд╡рд╛:

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 рд╡рд╛рдкрд░реВрди рдХреЕрдирд░реА рдкрд░рд┐рдгрд╛рдорд╛рдВрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛: рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рдЙрдкрдпреЛрдЬрдирд╛рдордзреНрдпреЗ рдирд╡реАрди рдмрджрд▓ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рд╕, рдлреНрд▓реЕрдЧрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪрд╛ рдЯрдкреНрдкрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реЗрд▓.

рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡ рдХреЕрдирд░реАрдВрдЪреА рдпрд╛рджреА рдмрдирд╡рд╛:

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

рддреБрдореНрд╣реА рд╕реНрд▓реЕрдХ рд╕реВрдЪрдирд╛ рд╕рдХреНрд╖рдо рдХреЗрд▓реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреАрд▓:

рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд░реЛрд▓рдмреЕрдХ

рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди, рдлреНрд▓реЕрдЧрд░ рдЙрдкрдпреЛрдЬрди рдерд╛рдВрдмрд╡реЗрд▓ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рдХреГрддреНрд░рд┐рдо 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

рддреБрдореНрд╣реА рд╕реНрд▓реЕрдХ рд╕реВрдЪрдирд╛ рд╕рдХреНрд╖рдо рдХреЗрд▓реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдордзреНрдпреЗ рдЕрдпрд╢рд╕реНрд╡реА рдкреБрдирд░рд╛рд╡рд▓реЛрдХрдирд╛рдВрдЪреА рдХрдорд╛рд▓ рд╕рдВрдЦреНрдпрд╛ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рдЪреА рдХрд┐рдВрд╡рд╛ рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЪреА рдЕрдВрддрд┐рдо рдореБрджрдд рдУрд▓рд╛рдВрдбрд▓реНрдпрд╛рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓:

рдлреНрд▓реЕрдЧрд░ рдЖрдгрд┐ Istio рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЕрдирд░реА рдЙрдкрдпреЛрдЬрди

рд╢реЗрд╡рдЯреА

Kubernetes рдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА Istio рд╕рд╛рд░рдЦреА рд╕реЗрд╡рд╛ рдЬрд╛рд│реА рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рдиреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдиреЛрдВрджреА рдЖрдгрд┐ рдиреЛрдВрджреА рдорд┐рд│рддреАрд▓, рдкрд░рдВрддреБ рдХрд╛рд░реНрдпрднрд╛рд░ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рдЕрджреНрдпрд╛рдк рдмрд╛рд╣реНрдп рд╕рд╛рдзрдирд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ. Istio рдХреНрд╖рдорддрд╛ рдЬреЛрдбреВрди рд╣реЗ рдмрджрд▓рдгреНрдпрд╛рдЪреЗ рдлреНрд▓реЕрдЧрд░рдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдЖрд╣реЗ рдкреНрд░рдЧрддреАрд╢реАрд▓ рд╡рд┐рддрд░рдг.

рдлреНрд▓реЕрдЧрд░ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рд╛рдареА рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реАрдЖрдп/рд╕реАрдбреА рд╕реЛрд▓реНрдпреВрд╢рдирд╢реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ рдЖрдгрд┐ рдХреЕрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рд╣рдЬрдкрдгреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рд╡реЗрдмрд╣реБрдХ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди/рд╕реНрд╡реАрдХреГрддреА рдЪрд╛рдЪрдгреНрдпрд╛, рд▓реЛрдб рдЪрд╛рдЪрдгреНрдпрд╛ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рд╛рдиреБрдХреВрд▓ рдЪрд╛рдЪрдгреНрдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рдХрд╛рд░рдг рдлреНрд▓реЕрдЧрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рдЖрд╣реЗ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЗрд╡реНрд╣реЗрдВрдЯреНрд╕рдирд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЛ, рддреЗ GitOps рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╕рд╣ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рд╡рд┐рдгрдгреЗ рдлреНрд▓рдХреНрд╕ рдХрд┐рдВрд╡рд╛ рдЬреЗрдирдХрд┐рдиреНрд╕рдПрдХреНрд╕. рддреБрдореНрд╣реА JenkinsX рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА jx рдЕреЕрдб-рдСрдирд╕рд╣ Flagger рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реВ рд╢рдХрддрд╛.

рдлреНрд▓реЕрдЧрд░ рд╕рдорд░реНрдерд┐рдд рд╡рд┐рдгрдХрд╛рдо рдЖрдгрд┐ рдордзреНрдпреЗ рдХреЕрдирд░реА рддреИрдирд╛рддреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рдореЗрдШ рд╡рд┐рдгрдгреЗ. рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдЪрд╛рдЪрдгреА GKE, EKS рдЖрдгрд┐ kubeadm рд╕рд╣ рдмреЗрдЕрд░ рдореЗрдЯрд▓рд╡рд░ рдХреЗрд▓реА рдЬрд╛рддреЗ.

рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдлреНрд▓реЕрдЧрд░ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реВрдЪрдирд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рдпреЗрдереЗ GitHub рд╡рд░ рд╕рдорд╕реНрдпрд╛ рдХрд┐рдВрд╡рд╛ PR рд╕рдмрдорд┐рдЯ рдХрд░рд╛ рд╕реНрдЯреАрдлрдирдкреНрд░реЛрдбрди/рдлреНрд▓реЗрдЧрд░. рдпреЛрдЧрджрд╛рди рд╕реНрд╡рд╛рдЧрддрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдЖрд╣реЗ!

╨б╨┐╨░╤Б╨╕╨▒╨╛ рд░реЗ рддреНрд╕рд╛рдВрдЧ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛