CD ΠΏΡΠΈΠ·Π½Π°Π½ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ β ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈ ΡΡΡΠΎΡΠ²ΡΠΈΡ ΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² CI. ΠΠ΄Π½Π°ΠΊΠΎ CD ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎΠ΅ ΡΠ²Π»Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ·-Π·Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΡΡΡΠ°Ρ Π° ΠΏΠ΅ΡΠ΅Π΄ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠΌΠΈ Π΄Π΅ΠΏΠ»ΠΎΡΠΌΠΈ, Π²Π»ΠΈΡΡΡΠΈΠΌΠΈ Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Flagger Π² Google Kubernetes Engine (GKE).
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kubernetes
ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΠ΅ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° GKE Ρ Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΠΎΠΉ Istio (Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π½Π΅Ρ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ 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
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠ» Π½ΠΎΠ΄ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ Π΄Π²Π΅ ΠΠ 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 ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ ΡΠ»ΡΠΆΠ±Ρ ΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ ΡΠΎΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π΄Π»Ρ Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ Tiller Π² Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ kube-system
:
helm init --service-account tiller
ΠΠ°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ SSL ΠΌΠ΅ΠΆΠ΄Ρ Helm ΠΈ Tiller. ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π·Π°ΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Helm ΡΠΌ.
ΠΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
kubectl -n istio-system get svc
Π§Π΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄ GCP Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Π·Π½Π°ΡΠΈΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ IP-Π°Π΄ΡΠ΅Ρ Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠ° istio-ingressgateway
.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»ΡΠ·Π° Istio
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ IP-Π°Π΄ΡΠ΅Ρ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ istio-gateway
, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ IP-Π°Π΄ΡΠ΅Ρ ΡΠ»ΡΠ·Π° Istio:
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
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΎΠ±ΡΠΈΠΉ ΡΠ»ΡΠ· Istio Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ»ΡΠ³ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ service mesh ΠΏΠΎ HTTP:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: public-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ΅ΡΡΡΡ ΠΊΠ°ΠΊ public-gateway.yaml, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ Π΅Π³ΠΎ:
kubectl apply -f ./public-gateway.yaml
ΠΠΈ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ»ΡΠ³ΠΈ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ Π±Π΅Π· SSL. Π§ΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»ΡΠ· Istio Ρ ΠΏΠΎΠΌΠΎΡΡΡ cert-manager, CloudDNS ΠΈ Let’s Encrypt, ΠΏΡΠΎΡΠΈΡΠ°ΠΉΡΠ΅, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°,
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Flagger
ΠΠ°Π΄ΡΡΡΠΎΠΉΠΊΠ° GKE Istio Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Prometheus, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΎΡΠΈΡΡΠΊΠΎΠΉ ΡΠ»ΡΠΆΠ±Ρ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠΈ Istio. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Flagger ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Istio HTTP Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ canary Π°Π½Π°Π»ΠΈΠ·Π°, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Prometheus, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΡΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΡ Π΅ΠΌΠΎΠΉ Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ Flagger Π² Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ 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
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Flagger Π² Π»ΡΠ±ΠΎΠΌ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ Istio Prometheus ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΡ 9090.
Flagger ΠΈΠΌΠ΅Π΅Ρ ΠΏΠ°Π½Π΅Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Grafana Π΄Π»Ρ canary Π°Π½Π°Π»ΠΈΠ·Π°. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ 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
Π Π°ΡΠΊΡΠΎΠΉΡΠ΅ Grafana ΡΠ΅ΡΠ΅Π· ΠΎΡΠΊΡΡΡΡΠΉ ΡΠ»ΡΠ·, ΡΠΎΠ·Π΄Π°Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ (Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ 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.
ΠΠ΅ΠΏΠ»ΠΎΠΉ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ Flagger
Flagger Π΄Π΅ΠΏΠ»ΠΎΠΈΡ Kubernetes ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (HPA), Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ΅ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (Π΄Π΅ΠΏΠ»ΠΎΠΈ Kubernetes, ΡΠ΅ΡΠ²ΠΈΡΡ ClusterIP ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ Istio). ΠΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² service mesh ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ canary Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ΠΌ 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
Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΡΠ°ΡΠΈΠΊΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ canary Π°Π½Π°Π»ΠΈΠ·Π°:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ canary ΡΠ΅ΡΡΡΡ (Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ 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 ΠΊΠ°ΠΆΠ΄ΡΠ΅ ΠΏΠΎΠ»ΠΌΠΈΠ½ΡΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ canary Π΄Π΅ΠΏΠ»ΠΎΡ, ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠΎΡΠΌΡΠ»Π΅: interval * (maxWeight / stepWeight)
. ΠΠΎΠ»Ρ Canary CRD Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ
Π§Π΅ΡΠ΅Π· ΠΏΠ°ΡΡ ΡΠ΅ΠΊΡΠ½Π΄ Flagger ΡΠΎΠ·Π΄Π°ΡΡ canary ΠΎΠ±ΡΠ΅ΠΊΡΡ:
# 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
, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½ΠΎΠΌΠ΅Ρ Π²Π΅ΡΡΠΈΠΈ
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ canary Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅
Flagger ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠΈΠΊΠ» ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠ°ΡΠΈΠΊ Π½Π° canary, ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ²Π΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΡΠ΅Π΄Π½ΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΏΠΎΠ΄Π°. ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ Π°Π½Π°Π»ΠΈΠ·Π° KPI canary ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ, Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΡΡΡΡ Π² Slack.
Canary Π΄Π΅ΠΏΠ»ΠΎΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²:
- ΠΠ΅ΠΏΠ»ΠΎΠΉ PodSpec (ΠΎΠ±ΡΠ°Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΏΠΎΡΡΡ, env ΠΈ Ρ.Π΄.)
- ConfigMaps ΠΌΠΎΠ½ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΠΌΠ° ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΠ΅Π΄Ρ
- Π‘Π΅ΠΊΡΠ΅ΡΡ ΠΌΠΎΠ½ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΠΌΠ° ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΠ΅Π΄Ρ
ΠΠ°ΠΏΡΡΠΊ canary Π΄Π΅ΠΏΠ»ΠΎΡ ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ, ΡΡΠΎ Π²Π΅ΡΡΠΈΡ Π΄Π΅ΠΏΠ»ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ, ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π΅Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ:
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
ΠΠΎ Π²ΡΠ΅ΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ canary ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Grafana:
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π΅ΡΠ»ΠΈ Π½ΠΎΠ²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ canary Π°Π½Π°Π»ΠΈΠ·Π°, ΡΠΎ Flagger ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡ ΡΠ°Π·Ρ Π°Π½Π°Π»ΠΈΠ·Π°.
Π‘ΠΎΡΡΠ°Π²ΡΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ «ΠΊΠ°Π½Π°ΡΠ΅Π΅ΠΊ» Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅:
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, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ:
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΡΠΊΠ°Ρ
ΠΠΎ Π²ΡΠ΅ΠΌΡ canary Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ HTTP 500 ΠΈ Π²ΡΡΠΎΠΊΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΎΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ Π»ΠΈ Flagger Π΄Π΅ΠΏΠ»ΠΎΠΉ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π² Π½Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
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
ΠΠΎΠ³Π΄Π° ΡΠΈΡΠ»ΠΎ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΏΠΎΡΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠ°ΡΠΈΠΊ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΌΡ ΠΊΠ°Π½Π°Π»Ρ, canary ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ Π½ΡΠ»Ρ, Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠΉ.
ΠΡΠΈΠ±ΠΊΠΈ canary ΠΈ ΠΏΠΈΠΊΠΈ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΠ±ΡΡΠΈΡ Kubernetes ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Flagger Π² ΡΠΎΡΠΌΠ°ΡΠ΅ 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
ΠΡΠ»ΠΈ Π²Ρ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Slack, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ ΠΊΡΠ°ΠΉΠ½ΠΈΠΉ ΡΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π½Π΅ΡΠ΄Π°ΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π² Ρ ΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·Π°:
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΠΏΡΡΠΊ service mesh, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Istio, Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ Kubernetes ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ, Π»ΠΎΠ³ΠΈ ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, Π½ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΡΠ°Π±ΠΎΡΠΈΡ
Π½Π°Π³ΡΡΠ·ΠΎΠΊ Π²ΡΠ΅ Π΅ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². Flagger ΡΡΡΠ΅ΠΌΠΈΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ Istio Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Flagger ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Π»ΡΠ±ΡΠΌΠΈ CI/CD-ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ Π΄Π»Ρ Kubernetes, ΠΈ ΠΊΠ°Π½Π°ΡΠ΅Π΅ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
Flagger ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ Flagger, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡ ΠΈΠ»ΠΈ PR Π½Π° GitHub ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com