ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎ към микросСрвизитС с Istio. Част 2

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎ към микросСрвизитС с Istio. Част 2

ΠŸΡ€ΠΈΠΌ. ΠΏΡ€Π΅Π².: ΠŸΡŠΡ€Π²Π° част Ρ‚ΠΎΠ·ΠΈ Ρ†ΠΈΠΊΡŠΠ» бСшС посвСтСн Π½Π° Π·Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅Ρ‚ΠΎ с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Istio ΠΈ дСмонстриранСто ΠΈΠΌ Π² дСйствиС. Π‘Π΅Π³Π° Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-слоТни аспСкти Π½Π° конфигурацията ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ service mesh, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ - ΠΏΡ€Π΅Ρ†ΠΈΠ·Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° мрСТовия Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

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

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

Π‘ 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’а Π·Π° Β«Π·Π΅Π»Π΅Π½Π°Ρ‚Π° вСрсия» сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° Π½Π° Π΄Π²Π΅ мСста:

  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, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‰ Π΅Π΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ статични Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ ΠΎΡ‚ балансировача Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ към ΠΏΠΎΠ΄ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ Π΄Ρ€ΡƒΠ³Π° вСрсия, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Ρ‚Π°ΠΊΠΈΠ²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚. Π—Π°Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° Π·Π°Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, трябва Π΄Π° поставим ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: "ΡΡŠΡ‰Π°Ρ‚Π° вСрсия Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, която прСдостави 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 ("Π·Π΅Ρ€ΠΊΠ°Π»Ρ€Π΅Π½ΠΈΠ΅") сС ΠΏΡ€ΠΈΠ»Π°Π³Π° Π² случаитС, ΠΊΠΎΠ³Π°Ρ‚ΠΎ искамС Π΄Π° тСствамС промяна Π² продукция, Π±Π΅Π· Π΄Π° засягаСм ΠΊΡ€Π°ΠΉΠ½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ: Π·Π° Ρ†Π΅Π»Ρ‚Π° Π΄ΡƒΠ±Π»ΠΈΡ€Π°ΠΌΠ΅ ("Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΠΌ") заявкитС Π½Π° Π²Ρ‚ΠΎΡ€ΠΈ СкзСмпляр, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ са Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΠΈ наблюдавамС послСдствията. По-просто ΠΊΠ°Π·Π°Π½ΠΎ, Ρ‚ΠΎΠ²Π° Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²Π°ΡˆΠΈΡΡ‚(Π°) ΠΊΠΎΠ»Π΅Π³Π° ΠΈΠ·Π±ΠΈΡ€Π° Π½Π°ΠΉ-критичния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΠΏΡ€Π°Π²ΠΈ 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 създадСн

Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ подмноТСствата са ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ ΠΈ Π΄Π° настроим 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 създадСн

НСка Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ слСдната ΠΊΠΎΠΌΠ°Π½Π΄Π°:

$ while true; do curl -v http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "ΠžΠ±ΠΈΡ‡Π°ΠΌ ΠΉΠΎΠ³ΠΎΠ±Π΅Π»Π°"}'; 
    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 β€” процСс Π½Π° разпространСниС Π½Π° Π½ΠΎΠ²Π° вСрсия Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° малък Π±Ρ€ΠΎΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ. Използва сС, Π·Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ няма ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с Ρ€Π΅Π»ΠΈΠ·Π° ΠΈ Π΅Π΄Π²Π° слСд Ρ‚ΠΎΠ²Π°, Π²Π΅Ρ‡Π΅ ΡƒΠ±Π΅Π΄Π΅Π½ΠΈ Π² Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎΡ‚ΠΎ ΠΌΡƒ (Π½Π° Ρ€Π΅Π»ΠΈΠ·Π°) качСство, Π΄Π° Π³ΠΎ разпространим Π½Π° ΠΏΠΎ-голяма аудитория.ΠΏΠΎ-Π—Π° дСмонстрация Π½Π° ΠΊΠ°Π½Π°Ρ€Π΅Ρ‡Π½ΠΈ вСрсии Ρ‰Π΅ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с подмноТСството

Няма Π΄Π° пСстим ΠΈ Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠΌ 20 % ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° вСрсията с бъговС (тя Ρ‰Π΅ прСдставлява нашия ΠΊΠ°Π½Π°Ρ€Π΅Ρ‡Π΅Π½ разпространСниС), Π° останалитС 80 % β€” Π½Π° нормалния сСрвис. Π—Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ слСдния VirtualService ( buggy Ρƒ sa-logic.

sa-logic-subsets-canary-vs.yamlsa-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 ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½

И ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π² Π³Ρ€Π°Ρ„ΠΈΠΊΠΈΡ‚Π΅ Π½Π° Grafana, Ρ‡Π΅ броят Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈΡ‚Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ Π΅ Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»ΠΈΠ»:

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎ към микросСрвизитС с Istio. Част 2
ΠŸΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΡ Π² статистиката Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈΡ‚Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ слСд добавянС Π½Π° Ρ‚Π°ΠΉΠΌ Π°ΡƒΡ‚ΠΎΠ²Π΅ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΈ ΠΎΠΏΠΈΡ‚ΠΈ

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към слСдващия Ρ€Π°Π·Π΄Π΅Π» (ΠΈΠ»ΠΈ ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ β€” Π²Π΅Ρ‡Π΅ към слСдващата част ΠΎΡ‚ статията, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π² Ρ‚Π°Π·ΠΈ няма Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ практичСски СкспСримСнти β€” Π±Π΅Π». ΠΏΡ€.), ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ 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. ΠΎΡ‚ ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡Π°

ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π² нашия Π±Π»ΠΎΠ³:

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster