Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2

рдиреЛрдВрдж. рдЕрдиреБрд╡рд╛рдж: рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рд╣реА рдорд╛рд▓рд┐рдХрд╛ Istio рдХреНрд╖рдорддрд╛рдВрдЪрд╛ рдкрд░рд┐рдЪрдп рдХрд░реВрди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХреГрддреАрдд рддреНрдпрд╛рдВрдЪреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд░реНрдкрд┐рдд рд╣реЛрддреА. рдЖрддрд╛ рдЖрдореНрд╣реА рдпрд╛ рд╕реЗрд╡рд╛ рдЬрд╛рд│реАрдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрдгрд┐ рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреИрд▓реВрдВрдмрджреНрджрд▓ рдЖрдгрд┐ рд╡рд┐рд╢реЗрд╖рддрдГ рдмрд╛рд░реАрдХ рдЯреНрдпреВрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЖрдгрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд░рд╣рджрд╛рд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рдмрджреНрджрд▓ рдмреЛрд▓реВ.

рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ рдХреА рд▓реЗрдЦ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЖрдгрд┐ рдЗрд╕реНрдЯрд┐рдУрд╕рд╛рдареА рдореЕрдирд┐рдлреЗрд╕реНрдЯ) рд╡рд╛рдкрд░рддреЛ. istio-mastery.

рд╡рд╛рд╣рддреВрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди

Istio рд╕рд╣, рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдирд╡реАрди рдХреНрд╖рдорддрд╛ рджрд┐рд╕реВрди рдпреЗрддрд╛рдд:

  • рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡рд┐рдирдВрддреА рд░рд╛рдЙрдЯрд┐рдВрдЧ: рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯреНрд╕, 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

рд╣рд┐рд░рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрд╕рд╛рдареА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдореЕрдирд┐рдлреЗрд╕реНрдЯ рджреЛрди рдард┐рдХрд╛рдгреА рднрд┐рдиреНрди рдЖрд╣реЗ:

  1. рдкреНрд░рддрд┐рдорд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдЯреЕрдЧрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ - istio-green,
  2. рд╢реЗрдВрдЧрд╛рдВрдирд╛ рдПрдХ рд▓реЗрдмрд▓ рдЕрд╕рддреЗ version: green.

рджреЛрдиреНрд╣реА рдЙрдкрдпреЛрдЬрдирд╛рдВрдирд╛ рдПрдХ рд▓реЗрдмрд▓ рдЕрд╕рд▓реНрдпрд╛рдиреЗ app: sa-frontend,рдЖрднрд╛рд╕реА рд╕реЗрд╡реЗрджреНрд╡рд╛рд░реЗ рд╡рд┐рдирдВрддреНрдпрд╛ рдкрд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд sa-external-services рд╕реЗрд╡реЗрд╕рд╛рдареА sa-frontend, рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рд▓реЛрдб рд╡рд┐рддрд░реАрдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо, рдЬреНрдпрд╛рдореБрд│реЗ рдкреБрдвреАрд▓ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЙрджреНрднрд╡реЗрд▓:

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 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 рд╕рд░реНрд╡реНрд╣ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рддреНрдпрд╛рдЪ рдЖрд╡реГрддреНрддреАрдиреЗ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛ рджрд┐рд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд┬╗.

рдЖрдореНрд╣реА рддреЗрдереЗ рд╕рд╛рддрддреНрдпрдкреВрд░реНрдг рд╣реЕрд╢-рдЖрдзрд╛рд░рд┐рдд рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд┐рдВрдЧрд╕рд╣ рдкреЛрд╣реЛрдЪреВ (рд╕рд╛рддрддреНрдпрдкреВрд░реНрдг рд╣реЕрд╢ рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд┐рдВрдЧ)... рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рддреНрдпрд╛рдЪ рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛ рддреНрдпрд╛рдЪ рдмреЕрдХрдПрдВрдб рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рдкрд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдЬреНрдпрд╛рд╕рд╛рдареА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЧреБрдгрдзрд░реНрдо рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ - рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, HTTP рд╢реАрд░реНрд╖рд▓реЗрдЦ. DestinationRules рд╡рд╛рдкрд░реВрди рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗ.

рдЧрдВрддрд╡реНрдп рдирд┐рдпрдо

рдирдВрддрд░ рдЖрднрд╛рд╕реА рд╕реЗрд╡рд╛ рдЗрдЪреНрдЫрд┐рдд рд╕реЗрд╡реЗрд▓рд╛ рд╡рд┐рдирдВрддреА рдкрд╛рдард╡рд▓реА, DestinationRules рд╡рд╛рдкрд░реВрди рдЖрдореНрд╣реА рдзреЛрд░рдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддреЛ рдЬреА рдпрд╛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╛рдареА рдирд┐рдпрдд рд░рд╣рджрд╛рд░реАрд╡рд░ рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЬрд╛рддреАрд▓:

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2
Istio рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╕рд╣ рд░рд╣рджрд╛рд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди

рд╢реЗрд░рд╛: рдиреЗрдЯрд╡рд░реНрдХ рд░рд╣рджрд╛рд░реАрд╡рд░ Istio рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪрд╛ рдкреНрд░рднрд╛рд╡ рд╕рдордЬрдгреНрдпрд╛рд╕ рд╕реЛрдкреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдпреЗрдереЗ рд╕рд╛рджрд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. рддрдВрддреЛрддрдВрдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рд╡рд┐рдирдВрддреА рдХреЛрдгрддреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рдкрд╛рдард╡рд╛рдпрдЪреА рд╣рд╛ рдирд┐рд░реНрдгрдп рд╕реАрдЖрд░рдбреАрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрдВрдЧреНрд░реЗрд╕ рдЧреЗрдЯрд╡реЗрдордзреАрд▓ рджреВрддрд╛рдиреЗ рдШреЗрддрд▓рд╛ рдЖрд╣реЗ.

рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди рдирд┐рдпрдорд╛рдВрд╕рд╣, рдЖрдореНрд╣реА рд╕рд╛рддрддреНрдпрдкреВрд░реНрдг рд╣реЕрд╢ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд┐рдВрдЧ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╕рдорд╛рди рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЛ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░реВ рд╢рдХрддреЛ. рдЦрд╛рд▓реАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд╕рд╛рдзреНрдп рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ (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 рд▓рд╛ (рдХрд┐рдВрд╡рд╛ рд╣реНрдпрд╛ рдмрд░реЛрдмрд░ рдлрд╛рдпрд░рдлреЙрдХреНрд╕рд╕рд╛рдареА - рдЕрдВрджрд╛рдЬреЗ. рдЕрдиреБрд╡рд╛рдж.).

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, DestinationRules рдордзреНрдпреЗ рд▓реЛрдб рдмреЕрд▓реЗрдВрд╕рд┐рдВрдЧрдЪреНрдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдд рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рдЖрд╣реЗрдд - рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА рддрдкрд╛рд╕рд╛ рдЕрдзрд┐рдХреГрдд рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг.

рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рд╕рд░реНрд╡реНрд╣рд┐рд╕рдЪрд╛ рдкреБрдвреАрд▓ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢ рдЪрд╛рд▓рд╡реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА "рдЧреНрд░реАрди рдЖрд╡реГрддреНрддреА" рдЖрдгрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд░рд╣рджрд╛рд░реА рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдирд┐рдпрдо рд╣рдЯрд╡реВ:

$ 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

рдорд┐рд░рд░рд┐рдВрдЧ: рд╕рд░рд╛рд╡ рдордзреНрдпреЗ рдЖрднрд╛рд╕реА рд╕реЗрд╡рд╛

рдЫрд╛рдпрд╛ ("рд╕рдВрд░рдХреНрд╖рдг") рдХрд┐рдВрд╡рд╛ рдорд┐рд░рд░рд┐рдВрдЧ ("рдорд┐рд░рд┐рдВрдЧ") рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░рддрд╛ рдЙрддреНрдкрд╛рджрдирд╛рддреАрд▓ рдмрджрд▓рд╛рдЪреА рдЪрд╛рдЪрдгреА рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ: рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЗрдЪреНрдЫрд┐рдд рдмрджрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рджреБрд╕рд░реНтАНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА (тАЬрдорд┐рд░рд░тАЭ) рд╡рд┐рдирдВрддреНрдпрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╣рддреЛ. рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдЬреЗрд╡реНрд╣рд╛ рддреБрдордЪрд╛ рд╕рд╣рдХрд╛рд░реА рд╕рд░реНрд╡рд╛рдд рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рдбрддреЛ рдЖрдгрд┐ рдШрд╛рдгреАрдЪреНрдпрд╛ рдПрд╡рдвреНрдпрд╛ рдореЛрдареНрдпрд╛ рдврд┐рдЧрд╛рд▒реНрдпрд╛рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдЦреЗрдЪрдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рдХреЛрдгреАрд╣реА рддреНрдпрд╛рдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.

рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреА рдХреГрддреАрдд рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдмрдЧреНрд╕рд╕рд╣ рдПрд╕рдП-рд▓реЙрдЬрд┐рдХрдЪреЗ рджреБрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХрд░реВрдпрд╛ (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, рдореНрд╣рдгреВрди рд╕рд░реНрд╡ рд╡рд┐рдирдВрддреНрдпрд╛ рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд┐рддрд░реАрдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддреАрд▓:

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2

... рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рдирдВрддреНрдпрд╛ v1 рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рдкрд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рд╡реНрдпрд╛рдд рдЖрдгрд┐ v2 рдШрдЯрдирд╛рдВрдордзреНрдпреЗ рдорд┐рд░рд░ рдХрд░рд╛рд╡реНрдпрд╛рдд рдЕрд╢реА рдЖрдордЪреА рдЗрдЪреНрдЫрд╛ рдЖрд╣реЗ:

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2

рдЖрдореНрд╣реА DestinationRule рдЪреНрдпрд╛ рд╕рдВрдпреЛрдЬрдирд╛рдд VirtualService рджреНрд╡рд╛рд░реЗ рд╣реЗ рд╕рд╛рдзреНрдп рдХрд░реВ, рдЬрд┐рдереЗ рдирд┐рдпрдо рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рд╕рд░реНрд╡реНрд╣рд┐рд╕рдЪреЗ рдЙрдкрд╕рдореВрд╣ рдЖрдгрд┐ рдорд╛рд░реНрдЧ рдПрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╕рдВрдЪрд╛рд╕рд╛рдареА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреАрд▓.

рдЧрдВрддрд╡реНрдп рдирд┐рдпрдорд╛рдВрдордзреНрдпреЗ рдЙрдкрд╕рдВрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ

рдЙрдкрд╕рдВрдЪ (рдЙрдкрд╕рдВрдЪ) рдЦрд╛рд▓реАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирджреНрд╡рд╛рд░реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд (sa-logic-subset-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

рдЖрддрд╛ рдЙрдкрд╕рдВрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд, рдЖрдореНрд╣реА рдкреБрдвреЗ рдЬрд╛рдК рд╢рдХрддреЛ рдЖрдгрд┐ рд╕рд╛-рд▓реЙрдЬрд┐рдХрдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрд╡рд░ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реНрдЪреНрдпреБрдЕрд▓ рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддреЛ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ:

  1. рдЙрдкрд╕рдореВрд╣рд╛рд╡рд░ рд░рд╛рдЙрдЯ рдХреЗрд▓реЗ v1,
  2. рдПрдХрд╛ рдЙрдкрд╕рдореВрд╣рд╛рд╡рд░ рдорд┐рд░рд░ рдХреЗрд▓реЗ v2.

рдЦрд╛рд▓реАрд▓ рдЬрд╛рд╣реАрд░рдирд╛рдорд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдпреЛрдЬрдирд╛ рд╕рд╛рдзреНрдп рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ (sa-logic-subset-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

рдЪрд▓рд╛ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдордзреАрд▓ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╣реВ, рдЬрд┐рдереЗ рдЖрдкрдг рдмрдЧреНрд╕ рдЕрд╕рд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА рдкрд╛рд╣реВ рд╢рдХрддрд╛ (buggy).

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 2
sa-logic рд╕реЗрд╡реЗрдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреЗ рдпрд╢рд╕реНрд╡реА рдкреНрд░рддрд┐рд╕рд╛рдж

рдЖрдордЪреНрдпрд╛ рд╕реЗрд╡рд╛рдВрдЪреНрдпрд╛ рджреВрддрд╛рдВрдирд╛ VirtualService рдХрд╢реА рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЬрд╛рддреЗ рд╣реЗ рдЖрдореНрд╣реА рдкреНрд░рдердо рдкрд╛рд╣рд┐рд▓реЗ: рдХрдзреА sa-web-app рд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд░рддреЛ sa-logic, рд╣реЗ рд╕рд╛рдЗрдбрдХрд╛рд░ рдПрдиреНрд╡реЙрдпрдордзреВрди рдЬрд╛рддреЗ, рдЬреЗ - VirtualService рджреНрд╡рд╛рд░реЗ - рд╡рд┐рдирдВрддреАрд▓рд╛ v1 рдЙрдкрд╕рдореВрд╣рд╛рд╡рд░ рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд┐рдирдВрддреАрд▓рд╛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ v2 рдЙрдкрд╕рдВрдЪрд╛рд╕рд╛рдареА рдорд┐рд░рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. sa-logic.

рдорд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдкрд╛рд╕реВрди рд╡рд╛рдЯреЗрд▓ рдХреА рдЖрднрд╛рд╕реА рд╕реЗрд╡рд╛ рд╕реЛрдкреА рдЖрд╣реЗ. рдкреБрдвреАрд▓ рд╡рд┐рднрд╛рдЧрд╛рдд, рдЖрдореНрд╣реА рддреЗ рдЦрд░реЛрдЦрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рд╕рд╛рдВрдЧреВрди рддреНрдпрд╛рдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реВ.

рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯреНрд╕

рдХреЕрдирд░реА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рдереЛрдбреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рдЖрдгрдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ. рд░рд┐рд▓реАрдЭрдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рдЕрдбрдЪрдг рдпреЗрдд рдирд╛рд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░рдЪ, рддреНрдпрд╛рдЪреНрдпрд╛ (рд░рд┐рд▓реАрдЭрдЪреНрдпрд╛) рдЧреБрдгрд╡рддреНрддреЗрд╡рд░ рдЖрдзреАрдЪ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡реВрди, рддреЗ рдЗрддрд░ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рд╡рд┐рддрд░рд┐рдд рдХрд░рд╛.╨╛рдореЛрдареЗ рдкреНрд░реЗрдХреНрд╖рдХ.

рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЙрдкрд╕рдореВрд╣рд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рд╕реБрд░реВ рдареЗрд╡реВ buggy ╤Г sa-logic.

рдЪрд▓рд╛ рдХреНрд╖реБрд▓реНрд▓рдХ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рд╡реЗрд│ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡реВ рдирдХрд╛ рдЖрдгрд┐ 20% рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдмрдЧрд╕рд╣ рдЖрд╡реГрддреНрддреАрд╡рд░ рддреНрд╡рд░рд┐рдд рдкрд╛рдард╡реВ (рд╣реЗ рдЖрдордЪреНрдпрд╛ рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрд▓), рдЖрдгрд┐ рдЙрд░реНрд╡рд░рд┐рдд 80% рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрд╡реЗрд╕рд╛рдареА. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЦрд╛рд▓реАрд▓ VirtualService рд╡рд╛рдкрд░рд╛ (sa-logic-subset-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

рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯреНрд╕ рд╕рдХреНрд╖рдо рдХрд░рддрд╛рдд: рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣реА рд╕рдорд╕реНрдпрд╛рдВрдЪрд╛ рд╕рдВрднрд╛рд╡реНрдп рдкреНрд░рднрд╛рд╡ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдмреЗрд╕рдЪреНрдпрд╛ 20% рдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓рд╛ рдЖрд╣реЗ. рдЕрдкреНрд░рддрд┐рдо! рдЖрддрд╛, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдмрддреАрдд рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдХреЛрдбрдмрджреНрджрд▓ рдЦрд╛рддреНрд░реА рдирд╕рддреЗ (рджреБрд╕рд░реНтАНрдпрд╛ рд╢рдмреНрджрд╛рдд - рдиреЗрд╣рдореА...), рдЖрдореНрд╣реА рдорд┐рд░рд░рд┐рдВрдЧ рдЖрдгрд┐ рдХреЕрдирд░реА рд░реЛрд▓рдЖрдЙрдЯреНрд╕ рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ.

рдХрд╛рд▓рдмрд╛рд╣реНрдпрддрд╛ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди

рдкрд░рдВрддреБ рдмрдЧ рдиреЗрд╣рдореАрдЪ рдХреЛрдбрдордзреНрдпреЗ рд╕рдВрдкрдд рдирд╛рд╣реАрдд. рдпрд╛рджреАрдд "рд╡рд┐рддрд░рд┐рдд рд╕рдВрдЧрдгрдирд╛рдмрджреНрджрд▓ 8 рдЧреИрд░рд╕рдордЬ"рдкреНрд░рдердо рдард┐рдХрд╛рдгреА "рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЖрд╣реЗ" рдЕрд╕рд╛ рдЪреБрдХреАрдЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ. рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдиреЗрдЯрд╡рд░реНрдХ рдирд╛рд╣реА рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣, рдЖрдгрд┐ рдпрд╛ рдХрд╛рд░рдгрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд▓рдмрд╛рд╣реНрдпрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдХрд╛рд▓рдмрд╛рд╣реНрдп) рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ (рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди).

рдкреНрд░рд╛рддреНрдпрдХреНрд╖рд┐рдХрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдЖрд╡реГрддреНрддреА рд╡рд╛рдкрд░рдгреЗ рд╕реБрд░реВ рдареЗрд╡реВ sa-logic (buggy), рдЖрдгрд┐ рдЖрдореНрд╣реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдкрдпрд╢рд╛рдВрд╕рд╣ рдиреЗрдЯрд╡рд░реНрдХрдЪреНрдпрд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддреЗрдЪреЗ рдЕрдиреБрдХрд░рдг рдХрд░реВ.

рдмрдЧрд╕рд╣ рдЖрдордЪреНрдпрд╛ рд╕реЗрд╡реЗрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЦреВрдк рд╡реЗрд│ рд▓рд╛рдЧрдгреНрдпрд╛рдЪреА 1/3 рд╕рдВрдзреА, рдЕрдВрддрд░реНрдЧрдд рд╕рд░реНрд╡реНрд╣рд░ рддреНрд░реБрдЯреАрд╕рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрдгреНрдпрд╛рдЪреА 1/3 рд╕рдВрдзреА рдЖрдгрд┐ рдкреГрд╖реНрда рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкрд░рдд рдпреЗрдгреНрдпрд╛рдЪреА 1/3 рд╕рдВрдзреА рдЕрд╕реВ рджреНрдпрд╛.

рдЕрд╢рд╛ рд╕рдорд╕реНрдпрд╛рдВрдЪрд╛ рдкреНрд░рднрд╛рд╡ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рдЬреАрд╡рди рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд╣реЗ рдХрд░реВ рд╢рдХрддреЛ:

  1. рд╕реЗрд╡реЗрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдгреНрдпрд╛рд╕рд╛рдареА 8 рд╕реЗрдХрдВрджрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧрд▓реНрдпрд╛рд╕ рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЬреЛрдбрд╛,
  2. рд╡рд┐рдирдВрддреА рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛.

рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА, рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╡рд╛рдкрд░реВ.sa-logic-retry-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

рдЖрдгрд┐ рдЧреНрд░рд╛рдлрдирд╛ рдЖрд▓реЗрдЦрд╛рдВрдордзреНрдпреЗ рддрдкрд╛рд╕рд╛ рдХреА рд╡рд░реАрд▓ рдпрд╢рд╕реНрд╡реА рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд▓реА рдЖрд╣реЗ:

Istio рд╕рд╣ microservices рд╡рд░ рдкрд░рдд. рднрд╛рдЧ 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

рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ рдЖрдгрд┐ рдмрд▓реНрдХрд╣реЗрдб рдирдореБрдиреЗ

рдЖрдореНрд╣реА рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдордзреАрд▓ рджреЛрди рдорд╣рддреНрддреНрд╡рд╛рдЪреНрдпрд╛ рдирдореБрдиреНрдпрд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рдд: рдЪреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддрд╛рдд (рд╕реНрд╡-рдЙрдкрдЪрд╛рд░) рд╕реЗрд╡рд╛.

рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ ("рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░") рдЕрд╕реНрд╡рд╛рд╕реНрдереНрдпрдХрд░ рдорд╛рдирд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рдпреЗрдгрд╛рд░реНтАНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреА рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ, рддрд░ рдХреНрд▓рд╛рдпрдВрдЯ рд╡рд┐рдирдВрддреНрдпрд╛ рддреНрдпрд╛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдирд┐рд░реЛрдЧреА рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд (рдЬреНрдпрд╛рдореБрд│реЗ рдпрд╢рд╕реНрд╡реА рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдВрдЪреА рдЯрдХреНрдХреЗрд╡рд╛рд░реА рд╡рд╛рдврддреЗ). (рдЯреАрдк: рдирдореБрдирд╛рдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдЖрдврд│реВ рд╢рдХрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпреЗрдереЗ.)

рдмрд▓реНрдХрд╣реЗрдб ("рд╡рд┐рднрд╛рдЬрди") рд╕рдВрдкреВрд░реНрдг рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдгреНрдпрд╛рдкрд╛рд╕реВрди рд╕реЗрд╡рд╛ рдЕрдкрдпрд╢рд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдХрд░рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕реЗрд╡рд╛ B рддреБрдЯрд▓реЗрд▓реА рдЖрд╣реЗ рдЖрдгрд┐ рджреБрд╕рд░реА рд╕реЗрд╡рд╛ (рд╕рд░реНрд╡реНрд╣рд┐рд╕ B рдЪрд╛ рдХреНрд▓рд╛рдпрдВрдЯ) рд╕рд░реНрд╡реНрд╣рд┐рд╕ B рд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд░рддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рддрд┐рдЪрд╛ рдереНрд░реЗрдб рдкреВрд▓ рд╕рдВрдкреБрд╖реНрдЯрд╛рдд рдпреЗрддреЛ рдЖрдгрд┐ рдЗрддрд░ рд╡рд┐рдирдВрддреНрдпрд╛ (рдЬрд░реА рд╕реЗрд╡рд╛ B рдордзреАрд▓ рдирд╕рд▓реНрдпрд╛ рддрд░реАрд╣реА) рд╕реЗрд╡рд╛ рджреЗрдК рд╢рдХрдд рдирд╛рд╣реАрдд. (рдЯреАрдк: рдирдореБрдирд╛рдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдЖрдврд│реВ рд╢рдХрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпреЗрдереЗ.)

рдореА рдпрд╛ рдирдореБрдиреНрдпрд╛рдВрдЪреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рддрдкрд╢реАрд▓ рд╡рдЧрд│реЗрди рдХрд╛рд░рдг рддреЗ рд╢реЛрдзрдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ рдЕрдзрд┐рдХреГрдд рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг, рдЖрдгрд┐ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдгрд┐ рдЕрдзрд┐рдХреГрддрддрд╛ рджреЗрдЦреАрд▓ рджрд╛рдЦрд╡рд╛рдпрдЪреА рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪреА рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдкреБрдвреАрд▓ рднрд╛рдЧрд╛рдд рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рдЕрдиреБрд╡рд╛рджрдХрд╛рдХрдбреВрди рдкреБрдирд╢реНрдЪ

рдЖрдордЪреНрдпрд╛ рдмреНрд▓реЙрдЧрд╡рд░ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд╛:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛