рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ Istio рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА

рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ Istio рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА

рд╕реАрдбреАрд▓рд╛рдИ рдЙрджреНрдпрдо рд╕рдлреНрдЯрд╡реЗрдпрд░ рдЕрднреНрдпрд╛рд╕рдХреЛ рд░реВрдкрдорд╛ рдорд╛рдиреНрдпрддрд╛ рджрд┐рдЗрдиреНрдЫ рд░ рд╕реНрдерд╛рдкрд┐рдд CI рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВрдХреЛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдХрд╛рд╕рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛред рдпрджреНрдпрдкрд┐, рд╕реАрдбреА рдЕрдЭреИ рдзреЗрд░реИ рджреБрд░реНрд▓рдн рдЫ, рд╕рд╛рдпрдж рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рд░ рдкреНрд░рдгрд╛рд▓реА рдЙрдкрд▓рдмреНрдзрддрд╛рд▓рд╛рдИ рдЕрд╕рд░ рдЧрд░реНрдиреЗ рдЕрд╕рдлрд▓ рдкрд░рд┐рдирд┐рдпреЛрдЬрдирдХреЛ рдбрд░рд▓реЗред

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

рддрд▓ Google Kubernetes Engine (GKE) рдорд╛ рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЪрд░рдгрдмрджреНрдз рдЧрд╛рдЗрдб рдЫред

Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рддрдкрд╛рдИрдВ 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 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 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрдкрд░реНрдЫред рддрдкрд╛рдИрдВрдХреЛ рд╣реЗрд▓рдо рд╕реНрдерд╛рдкрдирд╛рдХреЛ рд╕реБрд░рдХреНрд╖рд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд▓рд╛рдЧрд┐, рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН docs.helm.sh

рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдкреБрд╖реНрдЯрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

kubectl -n istio-system get svc

рдХреЗрд╣реА рд╕реЗрдХреЗрдиреНрдб рдкрдЫрд┐, GCP рд▓реЗ рд╕реЗрд╡рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдмрд╛рд╣реНрдп IP рдареЗрдЧрд╛рдирд╛ рддреЛрдХреНрдиреБрдкрд░реНрдЫ istio-ingressgateway.

Istio Ingress рдЧреЗрдЯрд╡реЗ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрджреИ

рдирд╛рдордХреЛ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН 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 рдмрд┐рдирд╛ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред рдкреНрд░рдорд╛рдгрдкрддреНрд░-рдкреНрд░рдмрдиреНрдзрдХ, CloudDNS рд░ Let's Encrypt рд╕рдБрдЧ Istio рдкреНрд░рд╡реЗрд╢ рдЧреЗрдЯрд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди, рдХреГрдкрдпрд╛ рдкрдвреНрдиреБрд╣реЛрд╕реН рдХрд╛рдЧрдЬрд╛рдд рдЭрдгреНрдбрд╛рдХрд╛рд░ G.K.E.

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

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-systemSlack рд╕реВрдЪрдирд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реЗрд░:

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 рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА

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 рдЕрдиреБрд░реЛрдз рд╕рдлрд▓рддрд╛ рджрд░, рдФрд╕рдд рдЕрдиреБрд░реЛрдз рдЕрд╡рдзрд┐, рд░ рдкреЛрдб рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╕реНрддрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдорд╛рдкрди рдЧрд░реНрджрдЫред рдХреЗрдкреАрдЖрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдЖрдзрд╛рд░рдорд╛, рдХреНрдпрд╛рдирд░реА рдкреНрд░рд╡рд░реНрджреНрдзрди рд╡рд╛ рдЕрд╡рд░реЛрдз рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдирддрд┐рдЬрд╛ рд╕реНрд▓реНрдпрд╛рдХрдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░рд┐рдиреНрдЫред

рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ Istio рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА

рдХреНрдпрд╛рдирд░реА рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдЯреНрд░рд┐рдЧрд░ рд╣реБрдиреНрдЫ рдЬрдм рдирд┐рдореНрди рд╡рд╕реНрддреБрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ:

  • 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 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ 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

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ Slack рд╕реВрдЪрдирд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рдореНрди рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ:

рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ 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

рдЬрдм рдЕрд╕рдлрд▓ рдЪреЗрдХрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдбрдорд╛ рдкреБрдЧреНрдЫ, рдЯреНрд░рд╛рдлрд┐рдХрд▓рд╛рдИ рдкреНрд░рд╛рдердорд┐рдХ рдЪреНрдпрд╛рдирд▓рдорд╛ рдлрд░реНрдХрд╛рдЗрдиреНрдЫ, рдХреНрдпрд╛рдирд░реАрд▓рд╛рдИ рд╢реВрдиреНрдпрдорд╛ рдорд╛рдкрди рдЧрд░рд┐рдиреНрдЫ, рд░ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд▓рд╛рдИ рдЕрд╕рдлрд▓ рднрдиреА рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдиреНрдЫред

рдХреНрдпрд╛рдирд░реА рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░ рд▓реЗрдЯрдиреНрд╕реА рд╕реНрдкрд╛рдЗрдХрд╣рд░реВ 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 рдЕрдзрд┐рд╕реВрдЪрдирд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдореНрдпрд╛рдж рдирд╛рдШреЗрдХреЛ рд╡рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдорд╛ рдЕрд╕рдлрд▓ рдЬрд╛рдБрдЪрд╣рд░реВрдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдкреБрдЧреЗрдкрдЫрд┐ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ:

рдлреНрд▓реНрдпрд╛рдЧрд░ рд░ Istio рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

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

рдлреНрд▓реНрдпрд╛рдЧрд░ рдХреБрдиреИ рдкрдирд┐ Kubernetes CI/CD рд╕рдорд╛рдзрд╛рдирд╕рдБрдЧ рдЙрдкрдпреБрдХреНрдд рдЫ, рд░ рдХреНрдпрд╛рдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рд╡реЗрдмрд╣реБрдХрд╣рд░реВ рдкреНрд░рдгрд╛рд▓реА рдПрдХреАрдХрд░рдг/рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ, рд▓реЛрдб рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ, рд╡рд╛ рдХреБрдиреИ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рдЬрд╛рдБрдЪрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиред рдлреНрд▓реНрдпрд╛рдЧрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рднрдПрдХреЛрд▓реЗ рд░ Kubernetes рдШрдЯрдирд╛рд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреНрдЫ, рдпреЛ GitOps рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдмреБрдирд╛рдИ рдлреНрд▓рдХреНрд╕ рд╡рд╛ рдЬреЗрдиреНрдХрд┐рдиреНрд╕рдПрдХреНрд╕ред рдпрджрд┐ рддрдкрд╛рдЗрдБ JenkinsX рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рддрдкрд╛рдЗрдБ jx addons рд╕рдВрдЧ Flagger рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕рдорд░реНрдерд┐рдд рдмреБрдирд╛рдИ рдХрд╛рдорд╣рд░реВ рд░ рдорд╛ рдХреНрдпрд╛рдирд░реА рддреИрдирд╛рддреА рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ рдмрд╛рджрд▓ рдмреБрдиреНрдиреБрд╣реЛрд╕реНред рдкрд░рд┐рдпреЛрдЬрдирд╛ GKE, EKS, рд░ kubeadm рд╕рдВрдЧ рдмреЗрдпрд░ рдореЗрдЯрд▓рдорд╛ рдкрд░реАрдХреНрд╖рдг рднрдЗрд░рд╣реЗрдХреЛ рдЫред

рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рдлреНрд▓реНрдпрд╛рдЧрд░ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рдХреГрдкрдпрд╛ GitHub рдорд╛ рдореБрджреНрджрд╛ рд╡рд╛ PR рдкреЗрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реН stefanprodan/flaggerред рдпреЛрдЧрджрд╛рдирд╣рд░реВ рд╕реНрд╡рд╛рдЧрдд рднрдиреНрджрд╛ рдмрдвреА рдЫрдиреН!

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди