ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².:
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΠ°ΠΊΠΆΠ΅, ΡΡΠΎ Π² ΡΡΠ°ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ Π΄Π»Ρ Kubernetes ΠΈ Istio) ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ
Π‘ Istio Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ:
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²: ΠΊΠ°Π½Π°ΡΠ΅Π΅ΡΠ½ΡΠ΅ Π²ΡΠΊΠ°ΡΡ, A/B-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅;
- ΠΠ°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ: ΠΏΡΠΎΡΡΡΡ ΠΈ Π½Π΅ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΡΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° Ρ ΡΡΠ°Ρ ;
- ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ: ΡΠ°ΠΉΠΌΠ°ΡΡΡ, ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ, circuit breakers;
- ΠΠ½Π΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ΅ΠΉ: Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ, ΠΎΠ±ΡΡΠ² Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Ρ.ΠΏ.
Π ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ ΡΡΠ°ΡΡΠΈ ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠΏΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ. ΠΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠ΅ΠΉ ΡΡΠ°Π½Π΅Ρ DestinationRules
(Ρ.Π΅. ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Π΅ ΡΡΠ°ΡΠΈΠΊΠ°/Π·Π°ΠΏΡΠΎΡΠΎΠ² β ΠΏΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².), Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΡ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅ΠΌ A/B-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
A/B-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: βDestinationRules Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅
A/B-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π΅ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎ) ΠΈ ΠΌΡ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½Ρ Π½Π° 100%, ΠΊΠ°ΠΊΠ°Ρ ΠΈΠ· Π½ΠΈΡ ΡΠ»ΡΡΡΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΠ±Π΅ Π²Π΅ΡΡΠΈΠΈ ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
ΠΠ»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ Π²ΡΠΎΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ 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
, Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΠΎΠ΄Π½Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ², ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° pod’Ρ, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π΄ΡΡΠ³ΡΡ Π²Π΅ΡΡΠΈΡ, Π³Π΄Π΅, ΠΏΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, ΡΠ°ΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅: Β«ΡΠ° ΠΆΠ΅ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΎΡΠ΄Π°Π»Π° 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
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π§ΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ
ΠΠΎΠΎΠ±ΡΠ΅ ΠΆΠ΅, Ρ 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 (Β«Π·Π΅ΡΠΊΠ°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅Β») ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² production, Π½Π΅ Π·Π°ΡΡΠΎΠ½ΡΠ² ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ: Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌ (Β«Π·Π΅ΡΠΊΠ°Π»ΠΈΡΡΠ΅ΠΌΒ») Π·Π°ΠΏΡΠΎΡΡ Π½Π° Π²ΡΠΎΡΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, Π³Π΄Π΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ Π½ΡΠΆΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΈ ΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ. ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π²Π°Ρ(Π°) ΠΊΠΎΠ»Π»Π΅Π³Π° Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΡΠ°ΠΌΡΠΉ ΠΊΡΠΈΡΠΈΡΠ½ΡΠΉ issue ΠΈ Π΄Π΅Π»Π°Π΅Ρ 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 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 ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Envoy’ΡΠΌ Π½Π°ΡΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²: ΠΊΠΎΠ³Π΄Π° sa-web-app
Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΊ sa-logic
, ΠΎΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· sidecar Envoy, ΠΊΠΎΡΠΎΡΡΠΉ β ΡΠ΅ΡΠ΅Π· VirtualService β Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Ρ v1 ΠΈ Π·Π΅ΡΠΊΠ°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Ρ v2 ΡΠ΅ΡΠ²ΠΈΡΠ° sa-logic
.
ΠΠ½Π°Ρ: Π²Ρ ΡΠΆΠ΅ ΡΡΠΏΠ΅Π»ΠΈ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ Virtual Services ΠΏΡΠΎΡΡΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΈΡΠΈΠΌ ΡΡΠΎ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ Π΅ΡΡ ΠΈ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½Ρ.
ΠΠ°Π½Π°ΡΠ΅Π΅ΡΠ½ΡΠ΅ Π²ΡΠΊΠ°ΡΡ
Canary Deployment β ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΊΠ°ΡΡΠ²Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π² ΡΠ΅Π»ΠΈΠ·Π΅ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ, ΡΠΆΠ΅ Π±ΡΠ΄ΡΡΠΈ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ Π² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΌ Π΅Π³ΠΎ (ΡΠ΅Π»ΠΈΠ·Π°) ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΠΈΡΡ Π½Π° Π±ΠΎΠ»ΡΡΡΡ Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ.
ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠ°Π½Π°ΡΠ΅Π΅ΡΠ½ΡΡ
Π²ΡΠΊΠ°ΡΠΎΠ² ΠΌΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ 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 β Π½Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ 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 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
ΠΠ°ΡΡΠ΅ΡΠ½Ρ Circuit Breaker ΠΈ Bulkhead
Π Π΅ΡΡ ΠΈΠ΄ΡΡ ΠΎ Π΄Π²ΡΡ Π²Π°ΠΆΠ½ΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°Ρ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (self-healing) ΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
Circuit Breaker (Β«Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΡΒ») ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΡ
Π½Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½Π΅Π·Π΄ΠΎΡΠΎΠ²ΡΠΌ, ΠΈ Π΅Π³ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½Π° Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° (ΡΡΠΎ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΠΏΡΠΎΡΠ΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΡΡ
ΠΎΡΠ²Π΅ΡΠΎΠ²). (ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².: ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
Bulkhead (Β«ΠΏΠ΅ΡΠ΅Π³ΠΎΡΠΎΠ΄ΠΊΠ°Β») ΠΈΠ·ΠΎΠ»ΠΈΡΡΠ΅Ρ ΡΠ±ΠΎΠΈ Π² ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ
ΠΎΡ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ²ΠΈΡ B ΡΠ»ΠΎΠΌΠ°Π½, Π° Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅ΡΠ²ΠΈΡ (ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΅ΡΠ²ΠΈΡΠ° B) Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΊ ΡΠ΅ΡΠ²ΠΈΡΡ B, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΎΠ½ ΠΈΠ·ΡΠ°ΡΡ
ΠΎΠ΄ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΠΏΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ (Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²ΠΈΡΡ B). (ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².: ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
Π― ΠΎΠΏΡΡΡ Π΄Π΅ΡΠ°Π»ΠΈ ΠΏΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΈΡ
ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΡ
Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡΠΈ Π²
P.S. ΠΎΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«ΠΠ°Π·Π°Π΄ ΠΊ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ Π²ΠΌΠ΅ΡΡΠ΅ Ρ IstioΒ»:
ΡΠ°ΡΡΡ 1 (Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ) ,ΡΠ°ΡΡΡ 3 (Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ) ; - Β«
Conduit β Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΉ service mesh Π΄Π»Ρ Kubernetes Β»; - Β«
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ service mesh ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ ΠΌΠ½Π΅ Π½ΡΠΆΠ΅Π½ [Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ]? Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com