เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 2

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 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, เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเฉŒเจ•เจฟเจ†เจ‚ 'เจคเฉ‡ เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจฆเฉเจ†เจฐเจพ เจตเฉฐเจกเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ เจฐเจพเจŠเจ‚เจก-เจฐเฉ‹เจฌเจฟเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ, เจœเฉ‹ เจ•เจฟ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€ เจธเจฅเจฟเจคเฉ€ เจตเฉฑเจฒ เจ…เจ—เจตเจพเจˆ เจ•เจฐเฉ‡เจ—เจพ:

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 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 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ†เฅค

เจฎเฉฐเจœเจผเจฟเจฒ เจฆเฉ‡ เจจเจฟเจฏเจฎ

เจฌเจพเจ…เจฆ เจตเจฐเจšเฉเจ…เจฒ เจธเฉ‡เจตเจพ เจจเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจธเฉ‡เจตเจพ เจจเฉ‚เฉฐ เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเฉ€ เจนเฉˆ, DestinationRules เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ…เจธเฉ€เจ‚ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจจเฉ€เจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจ‡เจธ เจธเฉ‡เจตเจพ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฒเจˆ เจจเจฟเจฏเจค เจŸเฉเจฐเฉˆเจซเจฟเจ• 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚:

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 2
Istio เจธเจฐเฉ‹เจคเจพเจ‚ เจจเจพเจฒ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจชเฉเจฐเจฌเฉฐเจงเจจ

เจŸเจฟเฉฑเจชเจฃเฉ€: เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจŸเฉเจฐเฉˆเจซเจฟเจ• 'เจคเฉ‡ Istio เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ‡ เจชเฉเจฐเจญเจพเจต เจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจœเฉ‹ เจธเจฎเจเจฃเจพ เจ†เจธเจพเจจ เจนเฉˆเฅค เจธเจŸเฉ€เจ• เจนเฉ‹เจฃ เจฒเจˆ, เจ‡เจน เจซเฉˆเจธเจฒเจพ เจ•เจฟ เจ•เจฟเจธ เจ‰เจฆเจพเจนเจฐเจจ 'เจคเฉ‡ เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฃเฉ€ เจนเฉˆ, CRD เจตเจฟเฉฑเจš เจธเฉฐเจฐเจšเจฟเจค เจ‡เฉฐเจ—เฉเจฐเฉ‡เจธ เจ—เฉ‡เจŸเจตเฉ‡ เจตเจฟเฉฑเจš เจฐเจพเจœเจฆเฉ‚เจค เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจฎเฉฐเจœเจผเจฟเจฒ เจจเจฟเจฏเจฎเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ…เจธเฉ€เจ‚ เจ‡เจ•เจธเจพเจฐ เจนเฉˆเจธเจผเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจฒเฉ‹เจก เจฌเฉˆเจฒเฉ‡เจ‚เจธเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‰เจนเฉ€ เจธเฉ‡เจตเจพ เจ‰เจฆเจพเจนเจฐเจจ เจ‰เจธเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจœเจตเจพเจฌ เจฆเฉ‡เจตเฉ‡เฅค เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจธเจนเจพเจ‡เจ• เจนเฉˆ (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

เจŸเจฟเฉฑเจชเจฃเฉ€: เจธเจฟเจฐเจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเฉเฉฑเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจ…เจคเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ‡เจน เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจ•เจฐเฉ‹เจฎ เจจเฉ‚เฉฐ (เจœ เจ‡เจธ เจจเจพเจฒ เจซเจพเจ‡เจฐเจซเจพเจ•เจธ เจฒเจˆ - เจฒเจ—เจญเจ—. เจ…เจจเฉเจตเจพเจฆเฅค).

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, 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-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, เจ‡เจธ เจฒเจˆ เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเฉ€เจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚:

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 2

... เจชเจฐ เจ…เจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ v1 เจฎเฉŒเจ•เจฟเจ†เจ‚ 'เจคเฉ‡ เจญเฉ‡เจœเจฟเจ† เจœเจพเจตเฉ‡ เจ…เจคเฉ‡ v2 เจฎเฉŒเจ•เจฟเจ†เจ‚ 'เจคเฉ‡ เจชเฉเจฐเจคเฉ€เจฌเจฟเฉฐเจฌ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡:

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 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

เจ†เจ‰ Grafana เจตเจฟเฉฑเจš เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ, เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจฌเฉฑเจ— เจตเจพเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ (buggy) ~60% เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฒเจˆ เจ…เจธเจซเจฒเจคเจพ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจชเจฐ เจ‡เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เฉ‹เจˆ เจตเฉ€ เจ…เจธเจซเจฒเจคเจพ เจ…เฉฐเจคเจฎ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เจฐเจฆเฉ€ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเฉฑเจฒ เจฐเจนเฉ€ เจธเฉ‡เจตเจพ เจฆเฉเจ†เจฐเจพ เจœเจตเจพเจฌ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 2
เจธเจพ-เจคเจฐเจ• เจธเฉ‡เจตเจพ เจฆเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ‡ เจธเจซเจฒ เจœเจตเจพเจฌ

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฆเฉ‡เจ–เจฟเจ† เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจธเจพเจกเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ‡ เจฆเฉ‚เจคเจพเจ‚ 'เจคเฉ‡ เจตเจฐเจšเฉเจ…เจฒ เจธเจฐเจตเจฟเจธ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ: เจ•เจฆเฉ‹เจ‚ sa-web-app เจจเฉ‚เฉฐ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ sa-logic, เจ‡เจน เจธเจพเจˆเจกเจ•เจพเจฐ เจฆเฉ‚เจค เจฆเฉเจ†เจฐเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเฉ‹ - VirtualService เจฆเฉเจ†เจฐเจพ - เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ v1 เจธเจฌเจธเฉˆเฉฑเจŸ เจฒเจˆ เจฐเฉ‚เจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ เจธเฉ‡เจตเจพ เจฆเฉ‡ v2 เจธเจฌเจธเฉˆเฉฑเจŸ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจชเฉเจฐเจคเฉ€เจฌเจฟเฉฐเจฌเจค เจ•เจฐเจจ เจฒเจˆ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค sa-logic.

เจฎเฉˆเจจเฉ‚เฉฐ เจชเจคเจพ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเฉ‹เจš เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจตเจฐเจšเฉเจ…เจฒ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจธเจงเจพเจฐเจจ เจนเจจเฅค เจ…เจ—เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เจน เจ•เจนเจฟ เจ•เฉ‡ เจ‡เจธเจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ‰เจน เจธเฉฑเจšเจฎเฉเฉฑเจš เจฎเจนเจพเจจ เจตเฉ€ เจนเจจเฅค

เจ•เฉˆเจจเจฐเฉ€ เจฐเฉ‹เจฒเจ†เจŠเจŸเจธ

เจ•เฉˆเจจเจฐเฉ€ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฐเฉ‹เจฒ เจ†เจŠเจŸ เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ•เจฟ เจฐเฉ€เจฒเฉ€เจœเจผ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจนเฉ€, เจ‡เจธเจฆเฉ€ (เจฐเจฟเจฒเฉ€เจœเจผ เจฆเฉ€) เจ—เฉเจฃเจตเฉฑเจคเจพ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจญเจฐเฉ‹เจธเจพ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ, เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉ‚เจœเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเฉ‹เฅคะพเจตเฉฑเจกเฉ‡ เจฆเจฐเจธเจผเจ•.

เจ•เฉˆเจจเจฐเฉ€ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจธเจฌเจธเฉˆเฉฑเจŸ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจพเจ‚เจ—เฉ‡ buggy ัƒ sa-logic.

เจ†เจ“ เจฎเจพเจฎเฉ‚เจฒเฉ€ เจ—เฉฑเจฒเจพเจ‚ 'เจคเฉ‡ เจธเจฎเจพเจ‚ เจฌเจฐเจฌเจพเจฆ เจจเจพ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจคเฉเจฐเฉฐเจค 20% เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฌเฉฑเจ— เจตเจพเจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ 'เจคเฉ‡ เจญเฉ‡เจœเฉ€เจ (เจ‡เจน เจธเจพเจกเฉ‡ เจ•เฉˆเจจเจฐเฉ€ เจฐเฉ‹เจฒเจ†เจŠเจŸ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจเจ—เจพ), เจ…เจคเฉ‡ เจฌเจพเจ•เฉ€ 80% เจจเฉ‚เฉฐ เจ†เจฎ เจธเฉ‡เจตเจพ เจฒเจˆ เจญเฉ‡เจœเฉ‹เฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจตเจฐเจšเฉเจ…เจฒ เจธเจฐเจตเจฟเจธ (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

เจ…เจคเฉ‡ เจ—เฉเจฐเจพเจซเจพเจจเจพ เจ—เฉเจฐเจพเจซเจพเจ‚ เจตเจฟเฉฑเจš เจœเจพเจ‚เจš เจ•เจฐเฉ‹ เจ•เจฟ เจธเจซเจฒ เจœเจตเจพเจฌเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจ‰เฉฑเจชเจฐ เจตเฉฑเจง เจ—เจˆ เจนเฉˆ:

เจ‡เจธเจŸเฉ€เจ“ เจฆเฉ‡ เจจเจพเจฒ เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจ“เฅค เจญเจพเจ— 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 เจคเฉ‹เจ‚ เจจเจพ เจนเฉ‹เจฃ)เฅค (เจจเฉ‹เจŸ: เจชเฉˆเจŸเจฐเจจ เจฆเจพ เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจตเฉ‡เจฐเจตเจพ เจชเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจฅเฉ‡.)

เจฎเฉˆเจ‚ เจ‡เจนเจจเจพเจ‚ เจชเฉˆเจŸเจฐเจจเจพเจ‚ เจฆเฉ‡ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเฉ‡เจตเจพเจ‚เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃเจพ เจ†เจธเจพเจจ เจนเฉˆ เจ…เจงเจฟเจ•เจพเจฐเจค เจฆเจธเจคเจพเจตเฉ‡เจœเจผ, เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจ…เจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฆเจฟเจ–เจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚, เจœเจฟเจธ เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ– เจฆเฉ‡ เจ…เจ—เจฒเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจ…เจจเฉเจตเจพเจฆเจ• เจคเฉ‹เจ‚ เจชเฉ€.เจเจธ

เจธเจพเจกเฉ‡ เจฌเจฒเฉŒเจ— 'เจคเฉ‡ เจตเฉ€ เจชเฉœเฉเจนเฉ‹:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹