Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого Ρ†ΠΈΠΊΠ»Π° Π±Ρ‹Π»Π° посвящСна знакомству с возмоТностями Istio ΠΈ ΠΈΡ… дСмонстрации Π² дСйствии. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТныС аспСкты ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ использования этого service mesh, Π° Π² частности β€” ΠΏΡ€ΠΎ Ρ‚ΠΎΠ½ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСтСвым Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ.

НапоминаСм Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (манифСсты для Kubernetes ΠΈ Istio) ΠΈΠ· рСпозитория istio-mastery.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ

Π‘ 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’Π° для Β«Π·Π΅Π»Ρ‘Π½ΠΎΠΉ вСрсии» отличаСтся Π² Π΄Π²ΡƒΡ… мСстах:

  1. ΠžΠ±Ρ€Π°Π· основан Π½Π° ΠΈΠ½ΠΎΠΌ Ρ‚Π΅Π³Π΅ β€” istio-green,
  2. Pod’Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Π»Π΅ΠΉΠ±Π» version: green.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° deployment’Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π»Π΅ΠΉΠ±Π» app: sa-frontend, запросы, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСрвисом sa-external-services Π½Π° сСрвис sa-frontend, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° всС Π΅Π³ΠΎ экзСмпляры ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° распрСдСлится посрСдством Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° round-robin, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ситуации:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2
Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹

Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсиях прилоТСния. Π”Π°Π²Π°ΠΉΡ‚Π΅ убСдимся Π² этом:

$ 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. Π§Π°ΡΡ‚ΡŒ 2
Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ с рСсурсами Istio

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ВлияниС рСсурсов Istio Π½Π° сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ прСдставлСно здСсь Π² ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎΠΌ для понимания Π²ΠΈΠ΄Π΅. Если Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ, Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ экзСмпляр ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запрос, дСлаСтся Envoy’Π΅ΠΌ Π² Ingress Gateway, настроСнным Π² CRD.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Destination Rules ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ балансировку Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ использовались Π½Π΅ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Ρ‹Π΅ Ρ…ΡΡˆΠΈ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ экзСмпляра сСрвиса ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ конфигурация позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого (destinationrule-sa-frontend.yaml):

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 (Β«Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β») примСняСтся Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² 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, поэтому всС запросы Π±ΡƒΠ΄ΡƒΡ‚ распрСдСлСны ΠΌΠ΅ΠΆΠ΄Ρƒ всСми экзСмплярами:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2

… Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ запросы Π½Π°ΠΏΡ€Π°Π²Π»ΡΠ»ΠΈΡΡŒ Π½Π° экзСмпляры с вСрсиСй v1 ΠΈ Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π½Π° экзСмпляры с вСрсиСй v2:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2

Π”ΠΎΠ±ΡŒΡ‘ΠΌΡΡ этого Ρ‡Π΅Ρ€Π΅Π· VirtualService Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с DestinationRule, Π³Π΄Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° опрСдСлят подмноТСства ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ VirtualService ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ подмноТСству.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подмноТСств Π² Destination Rules

ΠŸΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° (subsets) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ (sa-logic-subsets-destinationrule.yaml):

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

  1. Π₯ост (host) опрСдСляСт, Ρ‡Ρ‚ΠΎ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ случаям, ΠΊΠΎΠ³Π΄Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ ΠΈΠ΄Ρ‘Ρ‚ Π² сторону сСрвиса sa-logic;
  2. Названия (name) подмноТСств ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° экзСмпляры подмноТСства;
  3. Π›Π΅ΠΉΠ±Π» (label) опрСдСляСт ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляры, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ подмноТСства.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° подмноТСства ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ VirtualService, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΊ запросам ΠΊ sa-logic, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ:

  1. ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΊ подмноТСству v1,
  2. Π—Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΊ подмноТСству v2.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ манифСст позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π·Π°Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠ³ΠΎ (sa-logic-subsets-shadowing-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      
    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 % запросов, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих сбоСв Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ сСрвис.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2
Π£ΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий сСрвиса 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 (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: 500

VirtualServices Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Π΅ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹: Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ сузили ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ послСдствия ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄ΠΎ 20 % ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π±Π°Π·Ρ‹. ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½ΠΎ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² своём ΠΊΠΎΠ΄Π΅ (ΠΈΠ½Ρ‹ΠΌΠΈ словами β€” всСгда…), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Π΅ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹.

Π’Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ

Но Π½Π΅ всСгда Π±Π°Π³ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅. Π’ спискС ΠΈΠ· Β«8 Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠΉ Π² распрСдСлённых вычислСниях» Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС значится ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Β«ΡΠ΅Ρ‚ΡŒ Π½Π°Π΄Ρ‘ΠΆΠ½Π°Β». Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΠ΅Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½Π°, ΠΈ ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ (timeouts) ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ (retries).

Для дСмонстрации ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π²Π΅Ρ€ΡΠΈΡŽ sa-logic (buggy), Π° Π½Π΅Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ сСти Π±ΡƒΠ΄Π΅ΠΌ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайными сбоями.

ΠŸΡƒΡΡ‚ΡŒ наш сСрвис с Π±Π°Π³Π°ΠΌΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ 1/3 шанс Π½Π° слишком Π΄ΠΎΠ»Π³ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚, 1/3 β€” Π½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ с ошибкой Internal Server Error ΠΈ 1/3 β€” Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΡƒΡŽ ΠΎΡ‚Π΄Π°Ρ‡Ρƒ страницы.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ послСдствия ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Тизнь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π»ΡƒΡ‡ΡˆΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ:

  1. Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, Ссли сСрвис ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ дольшС 8 сСкунд,
  2. ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ, Ссли Ρƒ запроса происходит сбой.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ рСсурса (sa-logic-retries-timeouts-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: 50
    - destination: 
        host: sa-logic
        subset: v2
      weight: 50
    timeout: 8s           # 1
    retries:
      attempts: 3         # 2
      perTryTimeout: 3s # 3

  1. Π’Π°ΠΉΠΌΠ°ΡƒΡ‚ для запроса установлСн Π² 8 сСкунд;
  2. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ запросов ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΠΎ 3 Ρ€Π°Π·Π°;
  3. И каТдая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° считаСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ, Ссли врСмя ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 3 сСкунды.

Π’Π°ΠΊ ΠΌΡ‹ добились ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ придётся ΠΆΠ΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 8 сСкунд ΠΈ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠΌΠ΅ΠΌ Ρ‚Ρ€ΠΈ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π² случаС сбоСв, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ шанс Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

И ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π² Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… Grafana, Ρ‡Ρ‚ΠΎ количСство ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² стало ΡΠ²Ρ‹ΡˆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 2
Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² статистикС ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² послС добавлСния Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»Ρƒ (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ β€” ΡƒΠΆΠ΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ρ‚.ΠΊ. Π² этой практичСских экспСримСнтов большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².), ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ 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. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com