
ΠΡΠΈΠΌ. ΠΏΡΠ΅Π².: ΡΠΎΠ·ΠΈ ΡΠΈΠΊΡΠ» Π±Π΅ΡΠ΅ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ Π½Π° Π·Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ΡΠΎ Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Istio ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. Π‘Π΅Π³Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ service mesh, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ - ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ°ΡΠΈΠΊ.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ ΡΡΡΠΎ, ΡΠ΅ Π² ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ Π·Π° Kubernetes ΠΈ Istio) ΠΎΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. .
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ°
Π‘ Istio Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ Π½ΠΎΠ²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ:
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ: ΠΊΠ°Π½Π°ΡΠ΅ΡΠ½ΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ, A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅;
- ΠΠ°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ: ΠΏΡΠΎΡΡΠ° ΠΈ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π°, ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° Ρ Π΅ΡΠΎΠ²Π΅;
- ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΡΠ»Π΅Π΄ ΡΡΠΈΠ²ΠΎΠ²Π΅: ΡΠ°ΠΉΠΌΠ°ΡΡΠΈ, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ, circuit breakers;
- ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ: Π·Π°Π±Π°Π²ΡΠ½ΠΈΡ, ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΈ Ρ.Π½.
Π ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΠΈΠ·Π±ΡΠ°Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π½ΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ. ΠΡΡΠ²Π°ΡΠ° ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΠ΅ Π±ΡΠ΄Π΅ DestinationRules (Ρ.Π΅. ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ°ΡΠΈΠΊ/Π·Π°ΡΠ²ΠΊΠΈ β Π±Π΅Π». ΡΠ΅Π΄.), Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΈΡΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ.
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅: βDestinationRules Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° Π² ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π΄Π²Π΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ) ΠΈ Π½Π΅ ΡΠΌΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠΈΠ³ΡΡΠ½ΠΈ ΠΊΠΎΡ ΠΎΡ ΡΡΡ ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. ΠΠ°ΡΠΎΠ²Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈ ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
ΠΠ° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° Π²ΡΠΎΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ, ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green createdΠΠ°Π½ΠΈΡΠ΅ΡΡΡΡ Π½Π° deploymentβΠ° Π·Π° Β«Π·Π΅Π»Π΅Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡΒ» ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° Π½Π° Π΄Π²Π΅ ΠΌΠ΅ΡΡΠ°:
- ΠΠ±ΡΠ°Π·ΡΡ Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π΄ΡΡΠ³Π° ΡΠ°Π³ β
istio-green, - Pod'ΠΎΠ²Π΅ΡΠ΅ ΠΈΠΌΠ°Ρ Π΅ΡΠΈΠΊΠ΅Ρ
version: green.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈ Π΄Π²Π°ΡΠ° deployment-Π° ΠΈΠΌΠ°Ρ Π΅ΡΠΈΠΊΠ΅Ρ 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, ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈΒ».
Π©Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΠ΅Π»ΡΠ° ΡΡΠ΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Ρ Π΅ΡΠΎΠ²Π΅ (Consistent Hash Loadbalancing). Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΊΡΠΌ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°, Π·Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, HTTP Π·Π°Π³Π»Π°Π²ΠΈΠ΅. Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° DestinationRules.
DestinationRules
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ VirtualService ΡΠΏΡΡΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° DestinationRules ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π·Π° ΡΡΠ°ΡΠΈΠΊΠ°, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π°:

Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Ρ ΡΠ΅ΡΡΡΡΠΈ Istio
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΠ»ΠΈΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Istio Π²ΡΡΡ Ρ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ°ΡΠΈΠΊ Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΎ ΡΡΠΊ ΠΏΠΎ ΠΎΠΏΡΠΎΡΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅. ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠΎΡΠ½ΠΈ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΡΠΎΠ²Π° Π½Π° ΠΊΠΎΠΉ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ΅ Π²Π·Π΅ΠΌΠ° ΠΎΡ Envoy Π² Ingress Gateway, Π½Π°ΡΡΡΠΎΠ΅Π½ Π² CRD.
Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Destination Rules ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ Ρ Π΅ΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΎΡΠΈΠ²Π°Ρ ΠΏΡΠΈ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π». Π‘Π»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΠΎΠ²Π° ():
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ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π·Π° Chrome (ΠΈΠ»ΠΈ Π·Π° Firefox β Π±Π΅Π». ΠΏΡ.).
ΠΡΠΎΠ±ΡΠ΅, 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ΠΠ΅ΡΠΊΠ°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: βVirtual Services Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
Shadowing ("Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅") ΠΈΠ»ΠΈ Mirroring ("Π·Π΅ΡΠΊΠ°Π»ΡΠ΅Π½ΠΈΠ΅") ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, Π±Π΅Π· Π΄Π° Π·Π°ΡΡΠ³Π°Π΅ΠΌ ΠΊΡΠ°ΠΉΠ½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ: Π·Π° ΡΠ΅Π»ΡΠ° Π΄ΡΠ±Π»ΠΈΡΠ°ΠΌΠ΅ ("Π·Π΅ΡΠΊΠ°Π»ΠΈΠΌ") Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π½Π° Π²ΡΠΎΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Π½ΡΠΆΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΠΈ Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΡΠ°. ΠΠΎ-ΠΏΡΠΎΡΡΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, ΡΠΎΠ²Π° Π΅ ΠΊΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠΈΡΡ(Π°) ΠΊΠΎΠ»Π΅Π³Π° ΠΈΠ·Π±ΠΈΡΠ° Π½Π°ΠΉ-ΠΊΡΠΈΡΠΈΡΠ½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈ ΠΏΡΠ°Π²ΠΈ pull request ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°ΠΊΡΠ² ΠΎΠ³ΡΠΎΠΌΠ΅Π½ ΠΊΡΠΏΡΠΈΠ½Π° Π·Π°ΠΌΡΡΡΠ΅Π½ΠΈΡ, ΡΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π½Π°ΠΈΡΡΠΈΠ½Π° Π΄Π° ΠΌΡ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄.
ΠΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠΎΠ·ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π²ΡΠΎΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ 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 ΡΠ΅Π»ΠΈ podβΠΎΠ²Π΅ Ρ Π΅ΡΠΈΠΊΠ΅Ρ app=sa-logic, Π·Π°ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠΈΡΠΊΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ:

β¦ Π½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅, Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΡΠΎΡΠ²Π°Π½ΠΈ ΠΊΡΠΌ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈΡΠ΅ Ρ Π²Π΅ΡΡΠΈΡ v1 ΠΈ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π΅ΡΠΊΠ°Π»ΠΈΡΠ°Π½ΠΈ Π½Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈΡΠ΅ Ρ Π²Π΅ΡΡΠΈΡ v2:

Π©Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΠΎΠ²Π° ΡΡΠ΅Π· VirtualService Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Ρ DestinationRule, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈ ΠΌΠ°ΡΡΡΡΡΠΈ Π½Π° VirtualService ΠΊΡΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΡΠ° Π² Destination Rules
ΠΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (subsets) ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΡΠ΅Π· ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ():
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 ΡΡΠ·Π΄Π°Π΄Π΅Π½Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΡΠ° ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΠΈ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ 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 ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΠ΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΊΠ°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "ΠΠ±ΠΈΡΠ°ΠΌ ΠΉΠΎΠ³ΠΎΠ±Π΅Π»Π°"}';
sleep .8; done ΠΠ΅ΠΊΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π² Grafana, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Ρ Π±ΡΠ³ΠΎΠ²Π΅ (buggy) ΠΏΡΠΈΡΠΈΠ½ΡΠ²Π° Π½Π΅ΡΡΠΏΠ΅Ρ
Π½Π° ~60 % ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, Π½ΠΎ Π½ΠΈΡΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ΅Π·ΠΈ Π½Π΅ΡΡΠΏΠ΅Ρ
ΠΈ Π½Π΅ Π·Π°ΡΡΠ³Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ.

Π£ΡΠΏΠ΅Ρ
ΡΡ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΅ΡΠ²ΠΈΠ·Π° sa-logic
Π’ΡΠΊ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ Π²ΠΈΠ΄ΡΡ
ΠΌΠ΅ ΠΊΠ°ΠΊ VirtualService ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° Envoy Π½Π° Π½Π°ΡΠΈΡΠ΅ ΡΠ΅ΡΠ²ΠΈΠ·ΠΈ: ΠΊΠΎΠ³Π°ΡΠΎ sa-web-app ΠΏΡΠ°Π²ΠΈ Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ sa-logic, ΡΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· sidecar Envoy, ΠΊΠΎΠΉΡΠΎ β ΡΡΠ΅Π· VirtualService β Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ Π΄Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ v1 ΠΈ Π΄Π° ΠΎΠ³Π»Π΅Π΄Π°Π²Ρ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ v2 Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ° sa-logic.
ΠΠ½Π°ΠΌ: Π²Π΅ΡΠ΅ ΡΡΠ΅ ΠΏΠΎΠΌΠΈΡΠ»ΠΈΠ»ΠΈ, ΡΠ΅ Virtual Services ΡΠ° ΠΏΡΠΎΡΡΠΈ. Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠΈΠΌ ΡΠΎΠ²Π° ΠΌΠ½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΡΠ΅ ΡΠ° Π½Π°ΠΈΡΡΠΈΠ½Π° Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΈ.
ΠΠ°Π½Π°ΡΡΠΊΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ
Canary Deployment β ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΠΌΠ°Π»ΡΠΊ Π±ΡΠΎΠΉ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ Π½ΡΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΠ΅Π»ΠΈΠ·Π° ΠΈ Π΅Π΄Π²Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°, Π²Π΅ΡΠ΅ ΡΠ±Π΅Π΄Π΅Π½ΠΈ Π² Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎΡΠΎ ΠΌΡ (Π½Π° ΡΠ΅Π»ΠΈΠ·Π°) ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ, Π΄Π° Π³ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΠΈΠΌ Π½Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ.ΠΏΠΎ-ΠΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ°Π½Π°ΡΠ΅ΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ
ΠΡΠΌΠ° Π΄Π° ΠΏΠ΅ΡΡΠΈΠΌ ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ 20 % ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Ρ Π±ΡΠ³ΠΎΠ²Π΅ (ΡΡ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π½Π°ΡΠΈΡ ΠΊΠ°Π½Π°ΡΠ΅ΡΠ΅Π½ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅), Π° ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ 80 % β Π½Π° Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ VirtualService ( buggy Ρ sa-logic.
sa-logic-subsets-canary-vs.yaml):
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: 500VirtualServices Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Ρ ΠΊΠ°Π½Π°ΡΠ΅Π½ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ: Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡ ΠΌΠ΅ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΄ΠΎ 20 % ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° Π±Π°Π·Π°. ΠΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ! Π‘Π΅Π³Π°, Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ Π² ΠΊΠΎΠ΄Π° ΡΠΈ (ΠΈΠ½Π°ΡΠ΅ ΠΊΠ°Π·Π°Π½ΠΎ β Π²ΠΈΠ½Π°Π³ΠΈβ¦), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π΅ΡΠΊΠ°Π»ΠΎΠ²Π΅ ΠΈ ΠΊΠ°Π½Π°ΡΠ΅Π½ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
Π’Π°ΠΉΠΌΠ°ΡΡΠΈ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ
ΠΠΎ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ ΡΠ° Π² ΠΊΠΎΠ΄Π°. ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ Π² ΡΠΏΠΈΡΡΠΊΠ° "" Π΅ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΌΠ½Π΅Π½ΠΈΠ΅, ΡΠ΅ "ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π°". ΠΡΡΡΠ½ΠΎΡΡ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π΅ Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΠΈ Π·Π°ΡΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ°ΠΉΠΌΠ°ΡΡΠΈ (timeouts) ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ (retries).
ΠΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π²Π΅ΡΡΠΈΡ sa-logic (buggy), Π° Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΡΠ΅ ΡΠΈΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ΅ΠΊΠ° Π½Π°ΡΠΈΡΡ ΡΡΡΠ²ΠΈΡ Ρ Π³ΡΠ΅ΡΠΊΠΈ ΠΈΠΌΠ° 1/3 ΡΠ°Π½Ρ Π·Π° ΠΏΡΠ΅ΠΊΠ°Π»Π΅Π½ΠΎ Π΄ΡΠ»ΡΠ³ ΠΎΡΠ³ΠΎΠ²ΠΎΡ, 1/3 ΡΠ°Π½Ρ Π·Π° Π³ΡΠ΅ΡΠΊΠ° Internal Server Error ΠΈ 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 ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π² Π³ΡΠ°ΡΠΈΠΊΠΈΡΠ΅ Π½Π° Grafana, ΡΠ΅ Π±ΡΠΎΡΡ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π΅ Π½Π°Π΄Ρ Π²ΡΡΠ»ΠΈΠ»:

ΠΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠ»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ°ΠΉΠΌ Π°ΡΡΠΎΠ²Π΅ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» (ΠΈΠ»ΠΈ ΠΏΠΎ-ΡΠΎΡΠ½ΠΎ β Π²Π΅ΡΠ΅ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΡΠ°Π·ΠΈ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ β Π±Π΅Π». ΠΏΡ.), ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π΅ΡΠ΅ sa-logic-buggy ΠΈ VirtualService, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
$ kubectl delete deployment sa-logic-buggy
deployment.extensions βsa-logic-buggyβ ΠΈΠ·ΡΡΠΈΡ
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io βsa-logicβ ΠΈΠ·ΡΡΠΈΡΠΠ°ΡΠ΅ΡΠ½ΠΈ Circuit Breaker ΠΈ Bulkhead
Π‘ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° Π΄Π²Π° Π²Π°ΠΆΠ½ΠΈ ΠΏΠ°ΡΠ΅ΡΠ½Π° Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ (self-healing) Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅.
Circuit Breaker (βΠ°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠ΅ΠΊΡΡΠ²Π°Ρβ) ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈ ΠΊΡΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π½Π΅Π·Π΄ΡΠ°Π²Π°, ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ ΠΉ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Ρ ΠΊΡΠΌ Π·Π΄ΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π° (ΠΊΠΎΠ΅ΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΠΏΡΠΎΡΠ΅Π½ΡΠ° Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ). (ΠΠ΅Π». ΠΏΡ.: ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ΅ΡΠ½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, .)
Bulkhead (βΠΏΠ΅ΡΠ΅Π³ΠΎΡΠΎΠ΄ΠΊΠ°β) ΠΈΠ·ΠΎΠ»ΠΈΡΠ° ΠΏΡΠΎΠ²Π°Π»ΠΈΡΠ΅ Π² ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΎΡ Π·Π°ΡΡΠ³Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ»ΡΠ³Π° B Π΅ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½Π°, Π° Π΄ΡΡΠ³Π° ΡΡΠ»ΡΠ³Π° (ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π° ΡΡΠ»ΡΠ³Π° B) ΠΏΡΠ°Π²ΠΈ Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ ΡΡΠ»ΡΠ³Π° B, Π² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΡΠ°Π·Ρ ΠΎΠ΄Π²Π° ΡΠ²ΠΎΡ ΠΏΡΠ» ΠΎΡ Π½ΠΈΡΠΊΠΈ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° Π΄ΡΡΠ³ΠΈ Π·Π°ΡΠ²ΠΊΠΈ (Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΠ΅ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΡΡΠ»ΡΠ³Π° B). (ΠΠ΅Π». ΠΏΡ.: ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ΅ΡΠ½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, .)
Π©Π΅ ΠΏΡΠΎΠΏΡΡΠ½Π° Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ ΠΏΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΠΏΠ°ΡΠ΅ΡΠ½ΠΈ, Π·Π°ΡΠΎΡΠΎ Π»Π΅ΡΠ½ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π² , Π° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΈ ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, Π·Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΡΠ°Π²Π° Π΄ΡΠΌΠ° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠ°.
P.S. ΠΎΡ ΠΏΡΠ΅Π²ΠΎΠ΄Π°ΡΠ°
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΡΠΎ Π² Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³:
- Β«ΠΠ°Π·Π°Π΄ ΠΊΡΠΌ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅ Ρ IstioΒ»: , ;
- «»;
- «».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
