Istio เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 2

Istio เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 2

เชจเซ‰เซ…เชง. เช…เชจเซเชตเชพเชฆ: เชชเซเชฐเชฅเชฎ เชญเชพเช— เช† เชถเซเชฐเซ‡เชฃเซ€ Istio เช•เซเชทเชฎเชคเชพเช“เชจเซ‹ เชชเชฐเชฟเชšเชฏ เช†เชชเชตเชพ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เชนเชคเซ€. เชนเชตเซ‡ เช…เชฎเซ‡ เช† เชธเซ‡เชตเชพ เชฎเซ‡เชถเชจเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—เชจเชพ เชตเชงเซ เชœเชŸเชฟเชฒ เชชเชพเชธเชพเช“ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚, เช…เชจเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฌเชพเชฐเซ€เช• เชŸเซเชฏเซเชจ เช•เชฐเซ‡เชฒ เชฐเซ‚เชŸเซ€เช‚เช— เช…เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชŸเซเชฐเชพเชซเชฟเช• เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชตเชฟเชถเซ‡.

เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช เชชเชฃ เชฏเชพเชฆ เช…เชชเชพเชตเซ€เช เช›เซ€เช เช•เซ‡ เชฒเซ‡เช– เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเซ‹ (เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช…เชจเซ‡ เช‡เชธเซเชŸเชฟเช“ เชฎเชพเชŸเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ istio-เชจเชฟเชชเซเชฃเชคเชพ.

เชŸเซเชฐเชพเชซเชฟเช• เชตเซเชฏเชตเชธเซเชฅเชพเชชเชจ

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 เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 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 เชนเซ‡เชกเชฐ. Destination Rules เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชพเชฏเซ‡เชฒ เช›เซ‡.

เช—เช‚เชคเชตเซเชฏ เชจเชฟเชฏเชฎเซ‹

เชชเช›เซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเชฐเซเชตเชฟเชธ เช‡เชšเซเช›เชฟเชค เชธเซ‡เชตเชพเชจเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเซ€, เชกเซ‡เชธเซเชŸเชฟเชจเซ‡เชถเชจ เชฐเซ‚เชฒเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเซ‡ เชจเซ€เชคเชฟเช“ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เชœเซ‡ เช† เชธเซ‡เชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชŸเซเชฐเชพเชซเชฟเช• เชชเชฐ เชฒเชพเช—เซ เชฅเชถเซ‡:

Istio เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 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

เชจเซ‹เช‚เชงเชฃเซ€: เชนเซ‡เชกเชฐเชฎเชพเช‚ เชตเชฟเชตเชฟเชง เชฎเซ‚เชฒเซเชฏเซ‹ เช‰เชฎเซ‡เชฐเชตเชพ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ‡ เชธเซ€เชงเชพ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช† เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เช•เซเชฐเซ‹เชฎ เชฎเชพเชŸเซ‡ (เช…เชฅเชตเชพ เช† เชธเชพเชฅเซ‡ เชซเชพเชฏเชฐเชซเซ‹เช•เซเชธ เชฎเชพเชŸเซ‡ - เช†เชถเชฐเซ‡. เช…เชจเซเชตเชพเชฆ.).

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชกเซ‡เชธเซเชŸเชฟเชจเซ‡เชถเชจ เชฐเซ‚เชฒเซเชธเชฎเชพเช‚ เชฒเซ‹เชก เชฌเซ‡เชฒเซ‡เชจเซเชธเชฟเช‚เช—เชจเชพ เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ เชตเชงเซ เช•เซเชทเชฎเชคเชพเช“ เชนเซ‹เชฏ เช›เซ‡ - เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธเซ‹ เชธเชคเซเชคเชพเชตเชพเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ.

เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเชฐเซเชตเชฟเชธเชจเซ‹ เชตเชงเซ เช…เชญเซเชฏเชพเชธ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชšเชพเชฒเซ‹ เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒเชพ เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเซ€เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ "เช—เซเชฐเซ€เชจ เชตเชฐเซเชเชจ" เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชŸเซเชฐเชพเชซเชฟเช• เชฆเชฟเชถเชพ เชจเชฟเชฏเชฎ เช•เชพเชขเซ€ เชจเชพเช–เซ€เช:

$ 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-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 เชเช• เชฒเซ‡เชฌเชฒ เชธเชพเชฅเซ‡ เชถเซ€เช‚เช—เซ‹เชจเซ‡ เชฒเช•เซเชทเซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡ app=sa-logic, เชคเซ‡เชฅเซ€ เชฌเชงเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชคเชฎเชพเชฎ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชตเชšเซเชšเซ‡ เชตเชฟเชคเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡:

Istio เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 2

... เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เช‡เชšเซเช›เซ€เช เช›เซ€เช เช•เซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ v1 เชฆเชพเช–เชฒเชพเช“ เชชเชฐ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช…เชจเซ‡ v2 เชฆเชพเช–เชฒเชพเช“ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เชฅเชพเชฏ:

Istio เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 2

เช…เชฎเซ‡ DestinationRule เชธเชพเชฅเซ‡ เชธเช‚เชฏเซ‹เชœเชจเชฎเชพเช‚ VirtualService เชฆเซเชตเชพเชฐเชพ เช† เชนเชพเช‚เชธเชฒ เช•เชฐเซ€เชถเซเช‚, เชœเซเชฏเชพเช‚ เชจเชฟเชฏเชฎเซ‹ เชšเซ‹เช•เซเช•เชธ เชธเชฌเชธเซ‡เชŸ เชฎเชพเชŸเซ‡ VirtualService เชจเชพ เชธเชฌเชธเซ‡เชŸเซเชธ เช…เชจเซ‡ เชฐเซ‚เชŸเซเชธ เชจเช•เซเช•เซ€ เช•เชฐเชถเซ‡.

เช—เช‚เชคเชตเซเชฏ เชจเชฟเชฏเชฎเซ‹เชฎเชพเช‚ เชธเชฌเชธเซ‡เชŸเซเชธเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเซเช‚

เชธเชฌเชธเซ‡เชŸเซเชธ (เชธเชฌเชธเซ‡เชŸ) เชจเซ€เชšเซ‡เชจเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฆเซเชตเชพเชฐเชพ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (sa-logic-เชธเชฌเชธเซ‡เชŸเซเชธ-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-เชคเชฐเซเช•-เชธเชฌเชธเซ‡เชŸเซเชธ-เชถเซ‡เชกเซ‹เช‡เช‚เช—-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-web-app เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡ เช›เซ‡ sa-logic, เชคเซ‡ เชธเชพเช‡เชกเช•เชพเชฐ เชเชจเซเชตเซ‹เชฏ เชฆเซเชตเชพเชฐเชพ เชœเชพเชฏ เช›เซ‡, เชœเซ‡ - เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเชฐเซเชตเชฟเชธ เชฆเซเชตเชพเชฐเชพ - เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ v1 เชธเชฌเชธเซ‡เชŸ เชชเชฐ เชฐเซ‚เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเซ‡เชตเชพเชจเชพ v2 เชธเชฌเชธเซ‡เชŸเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. sa-logic.

เชนเซเช‚ เชœเชพเชฃเซเช‚ เช›เซเช‚, เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเชฟเชšเชพเชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเซ‡เชตเชพเช“ เชธเชฐเชณ เช›เซ‡. เช†เช—เชณเชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚, เช…เชฎเซ‡ เชคเซ‡ เช•เชนเซ€เชจเซ‡ เชคเซ‡เชจเซ‹ เชตเชฟเชธเซเชคเชพเชฐ เช•เชฐเซ€เชถเซเช‚ เช•เซ‡ เชคเซ‡เช“ เช–เชฐเซ‡เช–เชฐ เชฎเชนเชพเชจ เช›เซ‡.

เช•เซ‡เชจเซ‡เชฐเซ€ เชฐเซ‹เชฒเช†เช‰เชŸเซเชธ

เช•เซ‡เชจเซ‡เชฐเซ€ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เช เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เช“เช›เซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชฐเซ‹เชฒเช†เช‰เชŸ เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช›เซ‡. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ เช•เซ‡ เชชเซเชฐเช•เชพเชถเชจเชฎเชพเช‚ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡ เชชเช›เซ€ เชœ, เชคเซ‡เชจเซ€ (เชชเซเชฐเช•เชพเชถเชจเชจเซ€) เช—เซเชฃเชตเชคเซเชคเชพเชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเชฟเชถเซเชตเชพเชธ เชฐเชพเช–เซ€เชจเซ‡, เชคเซ‡เชจเซ‡ เช…เชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชตเชฟเชคเชฐเชฟเชค เช•เชฐเซ‹.ะพเชฎเซ‹เชŸเชพ เชชเซเชฐเซ‡เช•เซเชทเช•เซ‹.

เช•เซ‡เชจเซ‡เชฐเซ€ เชฐเซ‹เชฒเช†เช‰เชŸเซเชธ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชธเชฌเชธเซ‡เชŸ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เชถเซเช‚ buggy ัƒ sa-logic.

เชšเชพเชฒเซ‹ เชจเชพเชจเช•เชกเซ€ เชตเชพเชคเซ‹ เชชเชฐ เชธเชฎเชฏ เชจ เชฌเช—เชพเชกเซ‹ เช…เชจเซ‡ เชคเชฐเชค เชœ 20% เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชฌเช—เซเชธ เชธเชพเชฅเซ‡ เชธเช‚เชธเซเช•เชฐเชฃ เชชเชฐ เชฎเซ‹เช•เชฒเซ€เช (เช† เช…เชฎเชพเชฐเชพ เช•เซ‡เชจเซ‡เชฐเซ€ เชฐเซ‹เชฒเช†เช‰เชŸเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชถเซ‡), เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเชพ 80% เชธเชพเชฎเชพเชจเซเชฏ เชธเซ‡เชตเชพเชฎเชพเช‚. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชจเซ€เชšเซ‡เชจเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเชฐเซเชตเชฟเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ (sa-เชคเชฐเซเช•-เชธเชฌเชธเซ‡เชŸเซเชธ-เช•เซ‡เชจเชฐเซ€-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), เชœเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ€ เชŸเช•เชพเชตเชพเชฐเซ€เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เช…เชฅเชตเชพ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพเชจเชพ เชธเชฌเชธเซ‡เชŸเชจเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชšเชพเชฒเซ‹ เชชเชนเซ‡เชฒเชพเชจเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชธเชฐเซเชตเชฟเชธ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจเชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€เช 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-เชคเชฐเซเช•-เชชเซเชจเชƒเชชเซเชฐเชฏเชพเชธ-เชธเชฎเชฏเช†เช‰เชŸ-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 เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชฟเชธ เชชเชฐ เชชเชพเช›เชพ เชœเชพเช“. เชญเชพเช— 2
เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชฏเชพเชธเซ‹ เช‰เชฎเซ‡เชฐเซเชฏเชพ เชชเช›เซ€ เชธเชซเชณ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเชพ เช†เช‚เช•เชกเชพเชฎเชพเช‚ เชธเซเชงเชพเชฐเซ‹

เช†เช—เชฒเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช†เช—เชณ เชตเชงเชคเชพ เชชเชนเซ‡เชฒเชพ (เช…เชฅเชตเชพ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡, เชฒเซ‡เช–เชจเชพ เช†เช—เชณเชจเชพ เชญเชพเช—เชฎเชพเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช†เชฎเชพเช‚ เช•เซ‹เชˆ เชตเชงเซ เชตเซเชฏเชตเชนเชพเชฐเซ เชชเซเชฐเชฏเซ‹เช—เซ‹ เชนเชถเซ‡ เชจเชนเซ€เช‚ - เช†เชถเชฐเซ‡ เช…เชจเซเชตเชพเชฆ.), เช•เชพเชขเซ€ เชจเชพเช–เซ‹ 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

เชธเชฐเซเช•เชฟเชŸ เชฌเซเชฐเซ‡เช•เชฐ เช…เชจเซ‡ เชฌเชฒเซเช•เชนเซ‡เชก เชชเซ‡เชŸเชฐเซเชจ

เช…เชฎเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เชฌเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชชเซ‡เชŸเชฐเซเชจ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช เชœเซ‡ เชคเชฎเชจเซ‡ เชธเซเชต-เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ (เชธเซเชต-เช‰เชชเชšเชพเชฐ) เชธเซ‡เชตเชพเช“.

เชธเชฐเซเช•เชฟเชŸ เชฌเซเชฐเซ‡เช•เชฐ ("เชธเชฐเซเช•เชฟเชŸ เชฌเซเชฐเซ‡เช•เชฐ") เชฌเชฟเชจเช†เชฐเซ‹เช—เซเชฏเชชเซเชฐเชฆ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชธเซ‡เชตเชพเชจเชพ เชฆเชพเช–เชฒเชพ เชชเชฐ เช†เชตเชคเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ เชคเซ‡ เชธเซ‡เชตเชพเชจเชพ เชคเช‚เชฆเซเชฐเชธเซเชค เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชชเชฐ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชœเซ‡ เชธเชซเชณ เชชเซเชฐเชคเชฟเชธเชพเชฆเซ‹เชจเซ€ เชŸเช•เชพเชตเชพเชฐเซ€ เชตเชงเชพเชฐเซ‡ เช›เซ‡). (เชจเซ‹เช‚เชง: เชชเซ‡เชŸเชฐเซเชจเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ€เช‚.)

เชฌเชฒเซเช•เชนเซ‡เชก ("เชชเชพเชฐเซเชŸเซ€เชถเชจ") เชธเชฎเช—เซเชฐ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เช…เชธเชฐ เช•เชฐเชคเชพ เชธเซ‡เชตเชพ เชจเชฟเชทเซเชซเชณเชคเชพเช“เชจเซ‡ เช…เชฒเช— เช•เชฐเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเซ‡เชตเชพ B เชคเซ‚เชŸเซ€ เช—เชˆ เช›เซ‡ เช…เชจเซ‡ เชฌเซ€เชœเซ€ เชธเซ‡เชตเชพ (เชธเชฐเซเชตเชฟเชธ Bเชจเซ‹ เช•เซเชฒเชพเชฏเชจเซเชŸ) เชธเชฐเซเชตเชฟเชธ Bเชจเซ‡ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เชคเซ‡ เชคเซ‡เชจเชพ เชฅเซเชฐเซ‡เชก เชชเซ‚เชฒเชจเซ‡ เช–เชคเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชจเซเชฏ เชตเชฟเชจเช‚เชคเซ€เช“ (เชญเชฒเซ‡ เชคเซ‡ เชธเซ‡เชตเชพ Bเชฎเชพเช‚เชฅเซ€ เชจ เชนเซ‹เชฏ เชคเซ‹ เชชเชฃ) เชธเซ‡เชตเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชธเชฎเชฐเซเชฅ เชนเซ‹เชฏ เช›เซ‡. (เชจเซ‹เช‚เชง: เชชเซ‡เชŸเชฐเซเชจเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ€เช‚.)

เชนเซเช‚ เช† เชชเซ‡เชŸเชฐเซเชจเชจเซ€ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเช—เชคเซ‹เชจเซ‡ เช…เชตเช—เชฃเซ€เชถ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชถเซ‹เชงเชตเชพเชฎเชพเช‚ เชธเชฐเชณ เช›เซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ, เช…เชจเซ‡ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เช…เชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฌเชคเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚, เชœเซ‡เชจเซ€ เชšเชฐเซเชšเชพ เชฒเซ‡เช–เชจเชพ เช†เช—เชณเชจเชพ เชญเชพเช—เชฎเชพเช‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช…เชจเซเชตเชพเชฆเช• เชคเชฐเชซเชฅเซ€ เชชเซ€เชเชธ

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹