рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рдЯрд┐рдкреНрдкрдгреАред рдЕрдиреБрд╡рд╛рджред: рдкрд╣рд▓реЗ рднрд╛рдЧ рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрд╕реНрддрд┐рдпреЛ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдереАред рдЕрдм рд╣рдо рдЗрд╕ рд╕реЗрд╡рд╛ рдЬрд╛рд▓ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмрд╛рд░реАрдХ рдЯреНрдпреВрдирд┐рдВрдЧ рд░реВрдЯрд┐рдВрдЧ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рд╣рдо рдЖрдкрдХреЛ рдпрд╣ рднреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдЦ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдФрд░ рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЗрд╕реНрддрд┐рдпреЛ-рдорд╣рд╛рд░рдд.

рдпрд╛рддрд╛рдпрд╛рдд рдкреНрд░рдмрдВрдзрди

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде, рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рдХреНрд╖рдорддрд╛рдПрдБ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:

  • рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрд░реЛрдз рд░реВрдЯрд┐рдВрдЧ: рдХреИрдирд░реА рд░реЛрд▓рдЖрдЙрдЯ, рдП/рдмреА рдкрд░реАрдХреНрд╖рдг;
  • рднрд╛рд░ рдХрд╛ рд╕рдВрддреБрд▓рди: рд╕рд░рд▓ рдФрд░ рд╕реБрд╕рдВрдЧрдд, рд╣реИрд╢ рдкрд░ рдЖрдзрд╛рд░рд┐рдд;
  • рдЧрд┐рд░рдиреЗ рдХреЗ рдмрд╛рдж рд░рд┐рдХрд╡рд░реА: рдЯрд╛рдЗрдордЖрдЙрдЯ, рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕, рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░;
  • рджреЛрд╖ рдбрд╛рд▓рдирд╛: рджреЗрд░реА, рдЧрд┐рд░рд╛рдП рдЧрдП рдЕрдиреБрд░реЛрдз, рдЖрджрд┐ред

рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдЬрд╛рд░реА рд╣реИ, рдЗрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрдпрдирд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдкрд╣рд▓рд╛ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╣реЛрдЧрд╛ DestinationRules (рдЕрд░реНрдерд╛рдд рдЯреНрд░реИрдлрд╝рд┐рдХ/рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдпрдо - рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджред)рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╣рдо A/B рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдПрдХреНрдЯрд┐рд╡реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдП/рдмреА рдкрд░реАрдХреНрд╖рдг: рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЧрдВрддрд╡реНрдп рдирд┐рдпрдо

рдП/рдмреА рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддреЗ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ) рдФрд░ рд╣рдо 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред

рдП/рдмреА рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

$ 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, рдЗрд╕рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реЛрдб рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛:

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛
рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ

рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

$ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЙрди рдиреАрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдд рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдВрдЧреА:

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛
рдЗрд╕реНрддрд┐рдпреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛рддрд╛рдпрд╛рдд рдкреНрд░рдмрдВрдзрди

рдиреЛрдЯ: рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ рдЗрд╕реНрддрд┐рдпреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдпрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╣реИ рдЗрд╕рдХрд╛ рдирд┐рд░реНрдгрдп рд╕реАрдЖрд░рдбреА рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдЗрдирдЧреНрд░реЗрд╕ рдЧреЗрдЯрд╡реЗ рдореЗрдВ рджреВрдд рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдиреЛрдЯ: рд╣реЗрдбрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрд░реЛрдо рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЗрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рдж).

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, 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

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

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

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

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

... рд▓реЗрдХрд┐рди рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз v1 рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рдПрдВ рдФрд░ v2 рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВ:

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рд╣рдо рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рдирд░реВрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдирд┐рдпрдо рд╡рд░реНрдЪреБрдЕрд▓рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд╕рдмрд╕реЗрдЯ рдФрд░ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╕рдореВрд╣ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

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

рд╕рдмрд╕реЗрдЯ (рдЙрдкрд╕рдореБрдЪреНрдЪрдп) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (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

рдЕрдм рдЬрдм рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рдЧрдП рд╣реИрдВ, рддреЛ рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛-рд▓реЙрдЬрд┐рдХ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ:

  1. рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдкрд░ рд░реВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ v1,
  2. рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд v2.

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдЖрдкрдХреЛ рдЕрдкрдиреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (sa-рддрд░реНрдХ-рдЙрдкрд╕рдореБрдЪреНрдЪрдп-рдЫрд╛рдпрд╛-рдмрдирд╛рдо.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) рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк ~60% рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рдлрд▓рддрд╛ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд▓реВ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛
рд╕рд╛-рд▓реЙрдЬрд┐рдХ рд╕реЗрд╡рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рджреЗрдЦрд╛ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓рд╕рд░реНрд╡рд┐рд╕ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рджреВрддреЛрдВ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: рдХрдм sa-web-app рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ sa-logic, рдпрд╣ рд╕рд╛рдЗрдбрдХрд╛рд░ рдПрдирд╡реЙрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ - рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рдЕрдиреБрд░реЛрдз рдХреЛ v1 рд╕рдмрд╕реЗрдЯ рдкрд░ рд░реВрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реЗрд╡рд╛ рдХреЗ v2 рд╕рдмрд╕реЗрдЯ рдкрд░ рдорд┐рд░рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред sa-logic.

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рд╕реЗрд╡рд╛рдПрдБ рд╕рд░рд▓ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдпрд╣ рдХрд╣рдХрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рд╛рди рд╣реИрдВред

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

рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА, рдЗрд╕рдХреА (рд░рд┐рд▓реАрдЬрд╝ рдХреА) рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдХрд░, рдЗрд╕реЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред╨╛рдмрдбрд╝реЗ рджрд░реНрд╢рдХ рд╡рд░реНрдЧ.

рдХреИрдирд░реА рд░реЛрд▓рдЖрдЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЙрдкрд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ buggy ╤Г sa-logic.

рдЖрдЗрдП рдЫреЛрдЯреА-рдЫреЛрдЯреА рдмрд╛рддреЛрдВ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВ рдФрд░ рддреБрд░рдВрдд 20% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдЧ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рднреЗрдЬреЗрдВ (рдпрд╣ рд╣рдорд╛рд░реЗ рдХреИрдирд░реА рд░реЛрд▓рдЖрдЙрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛), рдФрд░ рд╢реЗрд╖ 80% рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрд╡рд╛ рдореЗрдВ рднреЗрдЬ рджреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╡рд░реНрдЪреБрдЕрд▓ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (sa-рддрд░реНрдХ-рдЙрдкрд╕рдореБрдЪреНрдЪрдп-рдХреИрдирд░реА-рдмрдирд╛рдо.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), рдЬреЛ рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдпрд╛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ рд╡рд░реНрдЪреБрдЕрд▓рд╕рд░реНрд╡рд┐рд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ 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-рддрд░реНрдХ-рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕-рд╕рдордпрдмрд╛рд╣реНрдп-рдмрдирд╛рдо.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

рдФрд░ рдЧреНрд░рд╛рдлрд╝рд╛рдирд╛ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдКрдкрд░ рдмрдврд╝реА рд╣реИ:

рдЗрд╕реНрддрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛
рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджред), рдорд┐рдЯрд╛рдирд╛ sa-logic-buggy рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд┐рд╕:

$ kubectl delete deployment sa-logic-buggy
deployment.extensions тАЬsa-logic-buggyтАЭ deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io тАЬsa-logicтАЭ deleted

рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ рдФрд░ рдмрд▓реНрдХрд╣реЗрдб рдкреИрдЯрд░реНрди

рд╣рдо рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрд╡-рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдЦреБрдж рд╕реЗ рдЙрдкрдЪрд╛рд░) рд╕реЗрд╡рд╛рдПрдВред

рдкрд░рд┐рдкрде рд╡рд┐рдпреЛрдЬрдХ ("рдкрд░рд┐рдкрде рд╡рд┐рдпреЛрдЬрдХ") рдХрд┐рд╕реА рдРрд╕реА рд╕реЗрд╡рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрд╕реНрд╡рд╕реНрде рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЙрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд╕реНрд╡рд╕реНрде рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдмрдврд╝рд╛рддрд╛ рд╣реИ)ред (рдиреЛрдЯ: рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ.)

рджрд┐рд╡рд╛рд░ ("рд╡рд┐рднрд╛рдЬрди") рд╕реЗрд╡рд╛ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рд╕рдВрдкреВрд░реНрдг рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдмреА рдЯреВрдЯ рдЧрдИ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп рд╕реЗрд╡рд╛ (рд╕реЗрд╡рд╛ рдмреА рдХрд╛ рдЧреНрд░рд╛рд╣рдХ) рд╕реЗрд╡рд╛ рдмреА рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХрд╛ рдереНрд░реЗрдб рдкреВрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реЗрд╡рд╛ рджреЗрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рд╡реЗ рд╕реЗрд╡рд╛ рдмреА рд╕реЗ рди рд╣реЛрдВ)ред (рдиреЛрдЯ: рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ.)

рдореИрдВ рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ, рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рднреА рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕ рдкрд░ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреА.рдПрд╕

рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рднреА рдкрдврд╝реЗрдВ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ