ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΏΡΠ΅Π²ΠΎΠ΄:
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅, ΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ Π·Π° Kubernetes ΠΈ Istio) ΠΎΡ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°
Π‘ Istio ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π·Π° Π΄Π° ΠΎΡΠΈΠ³ΡΡΡΡ:
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ: Canary rollouts, A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅;
- ΠΠ°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ: ΠΏΡΠΎΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Ρ Π΅ΡΠΎΠ²Π΅;
- ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΡΠ»Π΅Π΄ ΠΏΠ°Π΄Π°Π½Π΅: ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ, ΠΏΡΠ΅ΠΊΡΡΠ²Π°ΡΠΈ;
- ΠΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ: Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΡ, ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΈ Π΄Ρ.
ΠΠΎΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°, ΡΠ΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΈΠ·Π±ΡΠ°Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ Π½ΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈ ΠΏΠΎ ΠΏΡΡΡ. ΠΡΡΠ²Π°ΡΠ° ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΠ΅ Π±ΡΠ΄Π΅ DestinationRules
(Ρ.Π΅. ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ°ΡΠΈΠΊ / Π·Π°ΡΠ²ΠΊΠΈ - ΠΏΡΠΈΠ±Π». ΠΏΡΠ΅Π²ΠΎΠ΄), Ρ ΠΊΠΎΠΉΡΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅.
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅: ΠΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΌΠ΅ΡΡΠΎΠ½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ° Π΄Π²Π΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΡΠ° Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ) ΠΈ Π½Π΅ ΡΠΌΠ΅ 100% ΡΠΈΠ³ΡΡΠ½ΠΈ ΠΊΠΎΡ ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠ·ΠΆΠΈΠ²ΡΠ²Π°Π½Π΅. ΠΠ°ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π΄Π²Π΅ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈ ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ.
ΠΠ° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Π²ΡΠΎΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡΡΠ° Π½Π° A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅, ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
ΠΠ°Π½ΠΈΡΠ΅ΡΡΡΡ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π·Π° βΠ·Π΅Π»Π΅Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡβ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° Π½Π° Π΄Π²Π΅ ΠΌΠ΅ΡΡΠ°:
- ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ β
istio-green
, - Π¨ΡΡΡΠ»ΠΊΠΈΡΠ΅ ΠΈΠΌΠ°Ρ Π΅ΡΠΈΠΊΠ΅Ρ
version: green
.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈ Π΄Π²Π΅ΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ°Ρ Π΅ΡΠΈΠΊΠ΅ΡΠ° app: sa-frontend
, Π·Π°ΡΠ²ΠΊΠΈ, ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΎΡ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΡΡΠ»ΡΠ³Π° sa-external-services
Π·Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ sa-frontend
, ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ Π²ΡΠΈΡΠΊΠΈ Π½Π΅Π³ΠΎΠ²ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΡ
ΠΡΠΊΠ°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π΅ ΡΠ° Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ
Π’Π΅Π·ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π΅ Π±ΡΡ Π° Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠ° ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ΅ΠΊΠ° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ:
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.c7071b22.css
/static/js/main.059f8e9c.js
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.f87cd8c9.css
/static/js/main.f7659dbb.js
ΠΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ index.html
ΠΈΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΎ ΠΎΡ Π±Π°Π»Π°Π½ΡΠΈΡΠ°ΡΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π΄ΠΎ ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ ΡΠ°ΠΊΠΈΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅: "ΡΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΡΡΠΎ Π΅ Π²ΡΡΠ½Π°Π»Π° index.html, ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ".
Π©Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΠ΅Π»ΡΠ° ΡΠΈ Ρ Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Ρ Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ (ΠΠΎΡΡΠΎΡΠ½Π½ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Ρ Π΅Ρ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅)... Π ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ Π΄ΠΎ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°, Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ HTTP Ρ Π΅Π΄ΡΡ. ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° DestinationRules.
ΠΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΌΠ΅ΡΡΠΎΠ½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Π‘Π»Π΅Π΄ ΠΠΈΡΡΡΠ°Π»Π½Π° ΡΡΠ»ΡΠ³Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π·Π°ΡΠ²ΠΊΠ° Π΄ΠΎ ΠΆΠ΅Π»Π°Π½Π°ΡΠ° ΡΡΠ»ΡΠ³Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ DestinationRules ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΊΡΠΌ ΡΡΠ°ΡΠΈΠΊΠ°, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π°:
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Ρ ΡΠ΅ΡΡΡΡΠΈ Π½Π° Istio
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° Istio Π²ΡΡΡ Ρ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ°ΡΠΈΠΊ Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΎ ΡΡΠΊ Π² ΠΎΠΏΡΠΎΡΡΠ΅Π½Π° ΡΠΎΡΠΌΠ° Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅. ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠΎΡΠ½ΠΈ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄ΠΎ ΠΊΠΎΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ΅ Π²Π·Π΅ΠΌΠ° ΠΎΡ Envoy Π² Ingress Gateway, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π² CRD.
Π‘ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΌΠ΅ΡΡΠΎΠ½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ Ρ
Π΅ΡΠΎΠ²Π΅ ΠΈ Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π». Π‘Π»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΠΎΡΡΠΈΠ³Π° ΡΠΎΠ²Π° (
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1
1 - Ρ
Π΅ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° HTTP Ρ
Π΅Π΄ΡΡΠ° version
.
ΠΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created
Π‘Π΅Π³Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΈ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ version
:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° ΠΈ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ, DestinationRules ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ - ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π²
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠΎΡΡΠΈΠΌ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ VirtualService, Π½Π΅ΠΊΠ° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΠΌ βΠ·Π΅Π»Π΅Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡβ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π·Π° ΠΏΠΎΡΠΎΠΊΠ°ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions βsa-frontend-greenβ deleted
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io βsa-frontendβ deleted
Mirroring: ΠΠΈΡΡΡΠ°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
Π·Π°ΡΡΠΈΡ ΠΎΠ²Π°Π½Π΅ ("Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅") ΠΈΠ»ΠΈ Mirroring ("ΠΎΡΡΠ°Π·ΡΠ²Π°Π½Π΅") ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, Π±Π΅Π· Π΄Π° Π·Π°ΡΡΠ³Π°ΠΌΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ: Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, Π½ΠΈΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°ΠΌΠ΅ (βΠΎΠ³Π»Π΅Π΄Π°Π»Π½ΠΈβ) Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π²ΡΠΎΡΠ° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΠΈ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΡΠ°. ΠΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ, ΡΠΎΠ²Π° Π΅, ΠΊΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠΈΡΡ ΠΊΠΎΠ»Π΅Π³Π° ΠΈΠ·Π±Π΅ΡΠ΅ Π½Π°ΠΉ-ΠΊΡΠΈΡΠΈΡΠ½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΎΠ³ΡΠΎΠΌΠ½Π° ΡΠΎΠΏΠΊΠ° ΠΌΡΡΡΠΎΡΠΈΡ, ΡΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°.
ΠΠ° Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π²ΡΠΎΡΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° SA-Logic Ρ Π³ΡΠ΅ΡΠΊΠΈ (buggy
), ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
Π ΡΠ΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Ρ app=sa-logic
ΡΠ΅ ΡΡΡΠΎ ΠΈΠΌΠ°Ρ Π΅ΡΠΈΠΊΠ΅ΡΠΈ ΡΡΡ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ:
$ kubectl get pods -l app=sa-logic --show-labels
NAME READY LABELS
sa-logic-568498cb4d-2sjwj 2/2 app=sa-logic,version=v1
sa-logic-568498cb4d-p4f8c 2/2 app=sa-logic,version=v1
sa-logic-buggy-76dff55847-2fl66 2/2 app=sa-logic,version=v2
sa-logic-buggy-76dff55847-kx8zz 2/2 app=sa-logic,version=v2
ΠΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ sa-logic
Π½Π°ΡΠΎΡΠ²Π° ΠΊΠ°ΠΏΡΡΠ»ΠΈ Ρ Π΅ΡΠΈΠΊΠ΅Ρ app=sa-logic
, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ:
... Π½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠΎΡΠ²Π°Ρ ΠΊΡΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ v1 ΠΈ Π΄Π° ΡΠ΅ ΠΎΡΡΠ°Π·ΡΠ²Π°Ρ ΠΊΡΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ v2:
ΠΠΎΡΡΠΈΠ³Π°ΠΌΠ΅ ΡΠΎΠ²Π° ΡΡΠ΅Π· VirtualService Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Ρ DestinationRule, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΡΠ° ΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΡΠ΅ Π½Π° VirtualService ΠΊΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΠ΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π² ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΌΠ΅ΡΡΠΎΠ½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (ΠΏΠΎΠ΄Π³ΡΡΠΏΠΈ) Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ ΠΎΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-logic
spec:
host: sa-logic # 1
subsets:
- name: v1 # 2
labels:
version: v1 # 3
- name: v2
labels:
version: v2
- Π΄ΠΎΠΌΠ°ΠΊΠΈΠ½ (
host
) ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ, ΡΠ΅ ΡΠΎΠ²Π° ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΡΠ°ΠΌΠΎ Π·Π° ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠ°ΡΡΡΡΡΡΡ Π²ΡΡΠ²ΠΈ ΠΊΡΠΌ ΡΡΠ»ΡΠ³Π°ΡΠ°sa-logic
; - ΠΈΠΌΠ΅Π½Π° (
name
) ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΊΡΠΌ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ; - Π΅ΡΠΈΠΊΠ΅Ρ (
label
) Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π΄Π²ΠΎΠΉΠΊΠΈΡΠ΅ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ, Π½Π° ΠΊΠΎΠΈΡΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ²ΠΏΠ°Π΄Π°Ρ, Π·Π° Π΄Π° ΡΡΠ°Π½Π°Ρ ΡΠ°ΡΡ ΠΎΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created
Π‘Π΅Π³Π°, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΡΠ° ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΠΈ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ VirtualService Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊΡΠΌ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ sa-logic, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅:
- ΠΠ°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ
v1
, - ΠΠ³Π»Π΅Π΄Π°Π»Π½ΠΎ ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ
v2
.
Π‘Π»Π΅Π΄Π½ΠΈΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΠ΅Π»ΠΈΡΠ΅ ΡΠΈ (
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
mirror:
host: sa-logic
subset: v2
Π’ΡΠΊ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π΅ΠΊΠ° ΠΏΡΠΎΡΡΠΎ Π³ΠΎ Π²ΠΈΠ΄ΠΈΠΌ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created
ΠΠ΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠ²Π°Ρ, ΠΊΠ°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π² Grafana, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Ρ Π³ΡΠ΅ΡΠΊΠΈ (buggy
) Π΅ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π° ~60% ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, Π½ΠΎ Π½ΠΈΡΠΎ Π΅Π΄Π½Π° ΠΎΡ ΡΠ΅Π·ΠΈ Π½Π΅ΡΡΠΏΠ΅Ρ
ΠΈ Π½Π΅ Π·Π°ΡΡΠ³Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌ ΡΠ΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΠΎΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠ° ΡΡΠ»ΡΠ³Π°.
Π£ΡΠΏΠ΅Ρ
Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° sa-logic
Π’ΡΠΊ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ Π²ΠΈΠ΄ΡΡ
ΠΌΠ΅ ΠΊΠ°ΠΊ VirtualService ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΊΡΠΌ Π½Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π° Envoys: ΠΊΠΎΠ³Π° sa-web-app
ΠΎΡΠΏΡΠ°Π²Ρ ΠΌΠΎΠ»Π±Π° ΠΊΡΠΌ sa-logic
, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· sidecar Envoy, ΠΊΠΎΠΉΡΠΎ - ΡΡΠ΅Π· VirtualService - Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° Π½Π°ΡΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ v1 ΠΈ Π΄Π° ΠΎΡΡΠ°Π·ΡΠ²Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ v2 Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° sa-logic
.
ΠΠ½Π°ΠΌ: Π²Π΅ΡΠ΅ ΠΈΠΌΠ°Ρ ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅, ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠ° ΠΏΡΠΎΡΡΠΈ. Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠΈΠΌ ΡΠΎΠ²Π° ΠΌΠ½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΡΠ΅ ΡΡΡΠΎ ΡΠ° Π½Π°ΠΈΡΡΠΈΠ½Π° ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈ.
Canary Rollouts
Canary Deployment Π΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΠΏΡΡΠΊΠ°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°Π»ΡΠΊ Π±ΡΠΎΠΉ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈ, ΡΠ΅ Π½ΡΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π² ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ, ΠΈ Π΅Π΄Π²Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ Π² Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ (ΠΈΠ·Π΄Π°Π½ΠΈΠ΅) ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ, Π³ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅ΡΠ΅ Π½Π°ΠΎΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°.
ΠΠ° Π΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Canary, ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ buggy
Ρ sa-logic
.
ΠΠ΅ΠΊΠ° Π½Π΅ Π³ΡΠ±ΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π΄ΡΠ΅Π±ΠΎΠ»ΠΈΠΈ ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ 20% ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΊΡΠΌ Π²Π΅ΡΡΠΈΡΡΠ° Ρ Π³ΡΠ΅ΡΠΊΠΈ (ΡΡ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π½Π°ΡΠ΅ΡΠΎ ΠΊΠ°Π½Π°ΡΡΠ΅), Π° ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ 80% ΠΊΡΠΌ Π½ΠΎΡΠΌΠ°Π»Π½Π° ΡΡΠ»ΡΠ³Π°. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ VirtualService (
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 80 # 1
- destination:
host: sa-logic
subset: v2
weight: 20 # 1
1 Π΅ ΡΠ΅Π³Π»ΠΎΡΠΎ (weight
), ΠΊΠΎΠΉΡΠΎ ΡΠΊΠ°Π·Π²Π° ΠΏΡΠΎΡΠ΅Π½ΡΠ° ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π½Π°ΡΠΎΡΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ.
ΠΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° VirtualService Π·Π° sa-logic
ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic configured
... ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π²ΠΎΠ΄ΡΡ Π΄ΠΎ Π½Π΅ΡΡΠΏΠ΅Ρ ΠΈ:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}'
--silent -w "Time: %{time_total}s t Status: %{http_code}n"
-o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500
VirtualServices Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°Π½Π°ΡΡΠ΅ΡΠ°: Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎΡΠΎ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΄ΠΎ 20% ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° Π±Π°Π·Π°. Π§ΡΠ΄Π΅ΡΠ΅Π½! Π‘Π΅Π³Π°, Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ Π·Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄ (Ρ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, Π²ΠΈΠ½Π°Π³ΠΈ ...), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠ³Π»Π΅Π΄Π°Π»Π½ΠΈ ΠΈ ΠΊΠ°Π½Π°ΡΠΈΡΠ½ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½ΠΈΡ.
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ
ΠΠΎ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΠΎΠ·ΠΎΠ²Π°Π²Π°Ρ Π² ΠΊΠΎΠ΄Π°. Π ΡΠΏΠΈΡΡΠΊΠ° ΠΎΡ
ΠΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠ°ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π° Π²Π΅ΡΡΠΈΡ sa-logic
(buggy
), Π° Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΈΠΌΡΠ»ΠΈΡΠ°Π½Π° ΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ.
ΠΠ΅ΠΊΠ° Π½Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π° Ρ Π³ΡΠ΅ΡΠΊΠΈ ΠΈΠΌΠ° 1/3 ΡΠ°Π½Ρ Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠ²ΡΡΠ΄Π΅ Π΄ΡΠ»Π³ΠΎ, 1/3 Π΄Π° Π·Π°Π²ΡΡΡΠΈ Ρ Π²ΡΡΡΠ΅ΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ 1/3 Π΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ.
ΠΠ° Π΄Π° ΡΠΌΠ΅ΠΊΡΠΈΠΌ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ ΠΆΠΈΠ²ΠΎΡΠ° Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ:
- Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ°ΠΉΠΌΠ°ΡΡ, Π°ΠΊΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 8 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ,
- ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ, Π°ΠΊΠΎ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π΅ Π½Π΅ΡΡΠΏΠ΅ΡΠ½Π°.
ΠΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° ΡΠ΅ΡΡΡΡ (
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 50
- destination:
host: sa-logic
subset: v2
weight: 50
timeout: 8s # 1
retries:
attempts: 3 # 2
perTryTimeout: 3s # 3
- ΠΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ Π·Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ Π½Π° 8 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ;
- ΠΠ°ΡΠ²ΠΊΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡΡ 3 ΠΏΡΡΠΈ;
- Π Π²ΡΠ΅ΠΊΠΈ ΠΎΠΏΠΈΡ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π½Π΅ΡΡΠΏΠ΅ΡΠ΅Π½, Π°ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° 3 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
Π’ΠΎΠ²Π° Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, Π·Π°ΡΠΎΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°ΠΊΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 8 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠΈ Π½ΠΎΠ²ΠΈ ΠΎΠΏΠΈΡΠ° Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅ΡΡΠΏΠ΅Ρ , ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°ΠΉΠΊΠΈ ΡΠ°Π½ΡΠ° Π·Π° ΡΡΠΏΠ΅ΡΠ΅Π½ ΠΎΡΠ³ΠΎΠ²ΠΎΡ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured
Π ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π² Π³ΡΠ°ΡΠΈΠΊΠΈΡΠ΅ Π½Π° Grafana, ΡΠ΅ Π±ΡΠΎΡΡ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π΅ Π½Π°Π΄:
ΠΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°ΡΠ° Π·Π° ΡΡΠΏΠ΅Ρ
ΡΠ»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» (ΠΏΠΎ-ΡΠΎΡΠ½ΠΎ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°, Π·Π°ΡΠΎΡΠΎ Π² ΡΠ°Π·ΠΈ ΡΠ°ΡΡ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ - ΠΏΡΠΈΠ±Π». ΠΏΡΠ΅Π².), ΠΠ·ΡΡΠΈΠΉ sa-logic-buggy
ΠΈ VirtualService, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
$ kubectl delete deployment sa-logic-buggy
deployment.extensions βsa-logic-buggyβ deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io βsa-logicβ deleted
ΠΠΎΠ΄Π΅Π»ΠΈ Π½Π° ΠΏΡΠ΅ΠΊΡΡΠ²Π°ΡΠΈ ΠΈ ΠΏΡΠ΅Π³ΡΠ°Π΄ΠΈ
ΠΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π΄Π²Π° Π²Π°ΠΆΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»Π° Π² Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΠ°ΠΌΠΎΠ²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅. (ΡΠ°ΠΌΠΎΠ»Π΅ΡΠ΅Π½ΠΈΠ΅) ΡΡΠ»ΡΠ³ΠΈ.
ΠΡΠ΅ΠΊΡΡΠ²Π°Ρ ("ΠΏΡΠ΅ΠΊΡΡΠ²Π°Ρ") ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΈΠ΄Π²Π°ΡΠΈ ΠΊΡΠΌ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π½Π΅Π·Π΄ΡΠ°Π²ΠΎΡΠ»ΠΎΠ²Π΅Π½, ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ ΠΌΡ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Ρ ΠΊΡΠΌ Π·Π΄ΡΠ°Π²ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π° (ΠΊΠΎΠ΅ΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΠΏΡΠΎΡΠ΅Π½ΡΠ° Π½Π° ΡΡΠΏΠ΅Ρ
). (ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ° Π² ΠΏΡΠ΅Π²ΠΎΠ΄Π°: ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ, Π½Π°ΠΏΡ.
ΠΏΡΠ΅Π³ΡΠ°Π΄Π° ("Π΄ΡΠ»") ΠΈΠ·ΠΎΠ»ΠΈΡΠ° ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ Π² ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΎΡ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ»ΡΠ³Π° B Π΅ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½Π° ΠΈ Π΄ΡΡΠ³Π° ΡΡΠ»ΡΠ³Π° (ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π° ΡΡΠ»ΡΠ³Π° B) ΠΎΡΠΏΡΠ°Π²Ρ Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ ΡΡΠ»ΡΠ³Π° B, ΠΊΠΎΠ΅ΡΠΎ Ρ ΠΊΠ°ΡΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ²ΠΎΡ ΠΏΡΠ» ΠΎΡ Π½ΠΈΡΠΊΠΈ ΠΈ Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° Π΄ΡΡΠ³ΠΈ Π·Π°ΡΠ²ΠΊΠΈ (Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΠ΅ Π½Π΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΡΠΌ ΡΡΠ»ΡΠ³Π°ΡΠ° Π). (ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ° Π² ΠΏΡΠ΅Π²ΠΎΠ΄Π°: ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ, Π½Π°ΠΏΡ.
Π©Π΅ ΠΏΡΠΎΠΏΡΡΠ½Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π·Π°ΡΠΎΡΠΎ ΡΠ° Π»Π΅ΡΠ½ΠΈ Π·Π° Π½Π°ΠΌΠΈΡΠ°Π½Π΅
PS ΠΎΡ ΠΏΡΠ΅Π²ΠΎΠ΄Π°ΡΠ°
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΡΠΎ Π² Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³:
- βΠΠ°Π·Π°Π΄ ΠΊΡΠΌ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ Ρ Istioβ:
ΡΠ°ΡΡ 1 (Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ) ,ΡΠ°ΡΡ 3 (ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ) ; - Β«
Conduit - Π»Π΅ΠΊ ΡΠ΅ΡΠ²ΠΈΠ·Π΅Π½ ΠΌΠ΅Ρ Π·Π° Kubernetes Β»; - Β«
ΠΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π·Π°ΡΠΎ ΠΌΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° [Π·Π° ΠΎΠ±Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ]? ".
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com