αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

αž…αŸ†αžŽαžΆαŸ†αŸ” αž”αž€αž”αŸ’αžšαŸ‚: αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„ αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž§αž‘αŸ’αž‘αž·αžŸαžŠαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αžαŸ’αžαž—αžΆαž– Istio αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžŽαŸ’αžαžΆαž‰αžŸαŸαžœαžΆαž“αŸαŸ‡ αž αžΎαž™αž‡αžΆαž–αž·αžŸαŸαžŸαž’αŸ†αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž™αŸ‰αžΆαž„αž›αŸ’αž’αž·αžαž›αŸ’αž’αž“αŸ‹ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž”αžŽαŸ’αžαžΆαž‰αŸ”

αž™αžΎαž„αž€αŸαžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αžαžΆαž’αžαŸ’αžαž”αž‘αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (αž”αž„αŸ’αž αžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Kubernetes αž“αž·αž„ Istio) αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ αž‡αŸ†αž“αžΆαž‰ istio.

αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸ

αž‡αžΆαž˜αž½αž™αž“αžΉαž„ Istio αžŸαž˜αžαŸ’αžαž—αžΆαž–αžαŸ’αž˜αžΈαž›αŸαž…αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αŸ–

  • αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αžŸαŸ†αžŽαžΎβ€‹αžαžΆαž˜αžœαž“αŸ’αž: αž€αžΆαžšαžŠαžΆαž€αŸ‹αž…αŸαž‰ Canary, αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž 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. Pods αž˜αžΆαž“αžŸαŸ’αž›αžΆαž€αž˜αž½αž™αŸ” 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 αž‚αž½αžšαžαŸ‚αž”αž˜αŸ’αžšαžΎαžŸαŸ†αžŽαžΎαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹"αŸ”

αž™αžΎαž„αž“αžΉαž„αž‘αŸ…αžŠαž›αŸ‹αž‘αžΈαž“αŸ„αŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž˜αžαž»αž›αŸ’αž™αž”αž“αŸ’αž‘αž»αž€αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ hash (αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαžαž»αž›αŸ’αž™αž—αžΆαž– Hash αž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹)... αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈβ€‹αž“αŸαŸ‡ αžŸαŸ†αžŽαžΎβ€‹αž–αžΈβ€‹αž’αžαž·αžαž·αž‡αž“β€‹αžŠαžΌαž…αž‚αŸ’αž“αžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎβ€‹αž‘αŸ…β€‹αžœαžαŸ’αžαž»β€‹αžαžΆαž„αž€αŸ’αžšαŸ„αž™β€‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”αžŠαŸ‚αž›αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ - αž§αž‘αžΆαž αžšαžŽαŸ αž”αž‹αž˜αž€αžαžΆ HTTP αŸ” αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎ DestinationRules αŸ”

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸβ€‹αž‚αŸ„αž›αžŠαŸ…

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ αžŸαŸαžœαžΆαž“αž·αž˜αŸ’αž˜αž·αž αž”αžΆαž“αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ αžŠαŸ„αž™αž”αŸ’αžšαžΎ DestinationRules αž™αžΎαž„αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž…αžšαžΆαž…αžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸαŸ‡αŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 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 - hash αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž˜αžΆαžαž·αž€αžΆαž“αŸƒαž”αž‹αž˜αž€αžαžΆ HTTP version.

αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž―αž€αžŸαžΆαžšαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž”αž‹αž˜αž€αžαžΆ version:

$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main

αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αžαž˜αŸ’αž›αŸƒαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆ αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž›αž‘αŸ’αž’αž•αž›αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž“αŸαŸ‡αŸ” αž‘αŸ… Chrome (ឬ αž‡αžΆαž˜αž½αž™αž“αŸαŸ‡αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Firefox - αž”αŸ’αžšαž αŸ‚αž›αŸ” αž”αž€αž”αŸ’αžšαŸ‚αŸ” ).

αž‡αžΆαž‘αžΌαž‘αŸ… DestinationRules αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž“αŸƒαžαž»αž›αŸ’αž™αž—αžΆαž–αž”αž“αŸ’αž‘αž»αž€ - αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ αž―αž€αžŸαžΆαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžš.

αž˜αž»αž“αž“αžΉαž„αžŸαž·αž€αŸ’αžŸαžΆ VirtualService αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αžŸαžΌαž˜αž›αž»αž” "αž€αŸ†αžŽαŸ‚αž–αžŽαŸŒαž”αŸƒαžαž„" αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž…αŸ’αž”αžΆαž”αŸ‹αž‘αž·αžŸαžŠαŸ…αž…αžšαžΆαž…αžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆ αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions β€œsa-frontend-green” deleted
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io β€œsa-frontend” deleted

αž€αžΆαžšαž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αŸ– αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αž·αž˜αŸ’αž˜αž·αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž

αž€αžΆαžšαžŠαžΆαž€αŸ‹αžŸαŸ’αžšαž˜αŸ„αž› ("αž€αžΆαžšαž€αžΆαžšαž–αžΆαžš") αž¬αž€αžΆαžšαž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„ ("αž€αž‰αŸ’αž…αž€αŸ‹") αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž˜αž·αž“αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αžŸαŸ’αž‘αž½αž“ ("αž€αž‰αŸ’αž…αž€αŸ‹") αžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžšαžŽαžΈαž‘αžΈαž–αžΈαžšαžŠαŸ‚αž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„ αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž•αž›αžœαž·αž”αžΆαž€αŸ” αž“αž·αž™αžΆαž™αž±αŸ’αž™αžŸαžΆαž˜αž‰αŸ’αž‰ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αŸαž›αžŠαŸ‚αž›αžŸαž αžŸαŸαžœαž·αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αž‰αŸ’αž αžΆαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αž αž αžΎαž™αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αžΆαž‰αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž—αžΆαž–αž€αžαŸ’αžœαž€αŸ‹αžŠαŸαž’αŸ†αžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžœαžΆαž”αžΆαž“αž‘αŸαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž§αž‘αžΆαž αžšαžŽαŸαž‘αžΈαž–αžΈαžšαž“αŸƒ 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

RЎRΞΌSΠ‚RΠ†RΡ‘SΠƒ sa-logic αž€αŸ†αžŽαžαŸ‹αž‚αŸ„αž›αžŠαŸ… pods αž‡αžΆαž˜αž½αž™αžŸαŸ’αž›αžΆαž€αž˜αž½αž™αŸ” app=sa-logicαžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαŸ†αžŽαžΎαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž€αžšαžŽαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

... αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž…αž„αŸ‹αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹ v1 instances αž αžΎαž™αž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αž‘αŸ… v2 instancesαŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2

αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžŸαž˜αŸ’αžšαŸαž…β€‹αž”αžΆαž“β€‹αžœαžΆβ€‹αžαžΆαž˜β€‹αžšαž™αŸˆ VirtualService αžŠαŸ„αž™β€‹αžšαž½αž˜β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆβ€‹αž‡αžΆαž˜αž½αž™ DestinationRule αžŠαŸ‚αž›β€‹αž…αŸ’αž”αžΆαž”αŸ‹β€‹αž“αžΉαž„β€‹αž€αŸ†αžŽαžαŸ‹β€‹αžŸαŸ†αžŽαž»αŸ†β€‹αžšαž„ αž“αž·αž„β€‹αž•αŸ’αž›αžΌαžœβ€‹αž“αŸƒ VirtualService αž‘αŸ…β€‹αžŸαŸ†αžŽαž»αŸ†β€‹αžšαž„β€‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž“αŸ‚αž€αžšαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ’αž”αžΆαž”αŸ‹αž‚αŸ„αž›αžŠαŸ…

αžŸαŸ†αžŽαž»αŸ†αžšαž„ (αžŸαŸ†αžŽαž»αŸ†αžšαž„) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ (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) αž€αŸ†αžŽαžαŸ‹αž‚αžΌαžαž˜αŸ’αž›αŸƒ key-value αžŠαŸ‚αž› instances αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„ αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ’αž›αžΆαž™αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαžŸαŸ†αžŽαž»αŸ†αžšαž„αŸ”

αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created

αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αžŸαŸ†αžŽαž»αŸ†β€‹αžšαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž€αŸ†αžŽαžαŸ‹ αž™αžΎαž„β€‹αž’αžΆαž…β€‹αž”αž“αŸ’αžβ€‹αž‘αŸ…β€‹αž˜αž»αž αž“αž·αž„β€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ VirtualService αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž…αŸ’αž”αžΆαž”αŸ‹β€‹αž…αŸ†αž–αŸ„αŸ‡β€‹αžŸαŸ†αžŽαžΎβ€‹αž‘αŸ… sa-logic αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž–αž½αž€β€‹αžœαžΆαŸ–

  1. αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžšαž„αž˜αž½αž™αŸ” v1,
  2. αž†αŸ’αž›αž»αŸ‡αž‘αŸ…αž•αŸ’αž“αŸ‚αž€αžšαž„ v2.

αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž•αŸ‚αž“αž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ (sa-logic-subsets-shadowing-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic          
  http:
  - route:
    - destination:
        host: sa-logic  
        subset: v1      
    mirror:             
      host: sa-logic     
      subset: v2

αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž˜αžΆαž“αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αž˜αžΎαž›αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αŸ–

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic 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-logic

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžƒαžΎαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ VirtualService αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž”αŸαžŸαž€αž‡αž“αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ– αž–αŸαž›αžŽαžΆ sa-web-app αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎαž‘αŸ… sa-logicαžœαžΆαž‘αŸ…αžαžΆαž˜αžšαž™αŸˆ sidecar Envoy αžŠαŸ‚αž› - αžαžΆαž˜αžšαž™αŸˆ VirtualService - αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αžŸαŸ†αžŽαžΎαž‘αŸ…αžŸαŸ†αžŽαž»αŸ†αžšαž„ v1 αž“αž·αž„αž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αžŸαŸ†αžŽαžΎαž‘αŸ…αžŸαŸ†αžŽαž»αŸ†αžšαž„ v2 αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ sa-logic.

αžαŸ’αž‰αž»αŸ†αžŠαžΉαž„ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž‚αž·αžαžšαž½αž…αž αžΎαž™αžαžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αž·αž˜αŸ’αž˜αž·αžαž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž–αž„αŸ’αžšαžΈαž€αžœαžΆαžŠαŸ„αž™αž“αž·αž™αžΆαž™αžαžΆαž–αž½αž€αž‚αŸαž–αž·αžαž‡αžΆαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž•αž„αžŠαŸ‚αžšαŸ”

αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Canary

Canary Deployment αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž…αŸαž‰αž“αžΌαžœαž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αžαžΌαž…αŸ” αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αžαžΆβ€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž”αž‰αŸ’αž αžΆβ€‹αž’αŸ’αžœαžΈβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž…αŸαž‰β€‹αž•αŸ’αžŸαžΆαž™ αž αžΎαž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž“αŸ„αŸ‡β€‹αžŠαŸ„αž™β€‹αž˜αžΆαž“β€‹αž‘αŸ†αž“αž»αž€β€‹αž…αž·αžαŸ’αžβ€‹αž›αžΎβ€‹αž‚αž»αžŽαž—αžΆαž– (αž€αžΆαžšβ€‹αž…αŸαž‰β€‹αž•αŸ’αžŸαžΆαž™) αžšαž”αžŸαŸ‹β€‹αžœαžΆ αžšαž½αž…β€‹αž αžΎαž™β€‹αž…αŸ‚αž€αž…αžΆαž™β€‹αžœαžΆβ€‹αž‘αŸ…β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž•αŸ’αžŸαŸαž„β€‹αž‘αŸ€αžαŸ”ΠΎαž‘αžŸαŸ’αžŸαž“αž·αž€αž‡αž“αž’αŸ†αž‡αžΆαž„αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Canary αž™αžΎαž„αž“αžΉαž„αž”αž“αŸ’αžαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαŸ†αžŽαž»αŸ†αžšαž„αž˜αž½αž™αŸ” buggy Ρƒ sa-logic.

αž€αž»αŸ†αžαŸ’αž‡αŸ‡αžαŸ’αž‡αžΆαž™αž–αŸαž›αžœαŸαž›αžΆαž›αžΎαžšαžΏαž„αžαžΌαž…αžαžΆαž… αž αžΎαž™αž•αŸ’αž‰αžΎαž—αŸ’αž›αžΆαž˜αŸ— 20% αž“αŸƒαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸ (αžœαžΆαž“αžΉαž„αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Canary αžšαž”αžŸαŸ‹αž™αžΎαž„) αž αžΎαž™ 80% αž‘αŸ€αžαž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αž˜αŸ’αž˜αžαžΆαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαžΌαž˜αž”αŸ’αžšαžΎ VirtualService αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ (sa-logic-subsets-canary-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic    
  http:
  - route: 
    - destination: 
        host: sa-logic
        subset: v1
      weight: 80         # 1
    - destination: 
        host: sa-logic
        subset: v2
      weight: 20 # 1

1 αž‚αžΊαž‡αžΆαž‘αž˜αŸ’αž„αž“αŸ‹ (weight) αžŠαŸ‚αž›αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αžΈαž—αžΆαž‚αžšαž™αž“αŸƒαžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž’αŸ’αž“αž€αž‘αž‘αž½αž› αž¬αž€αŸ’αžšαž»αž˜αžšαž„αž“αŸƒαž’αŸ’αž“αž€αž‘αž‘αž½αž›αŸ”

αžαŸ„αŸ‡αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ VirtualService αž–αžΈαž˜αž»αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ sa-logic αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

... αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆ αžŸαŸ†αžŽαžΎαž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αžΆαŸ†αž‘αŸ…αžšαž€αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αŸ–

$ while true; do 
   curl -i http://$EXTERNAL_IP/sentiment 
   -H "Content-type: application/json" 
   -d '{"sentence": "I love yogobella"}' 
   --silent -w "Time: %{time_total}s t Status: %{http_code}n" 
   -o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500

VirtualServices αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Canary rolloutsαŸ– αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αžšαž½αž˜αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αž“αŸƒαž”αž‰αŸ’αž αžΆαž˜αž€αžαŸ’αžšαžΉαž˜ 20% αž“αŸƒαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž˜αŸ‚αž“! αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαž”αŸ‹αž€αžšαžŽαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž˜αž·αž“αž”αŸ’αžšαžΆαž€αžŠαž’αŸ†αž–αžΈαž€αžΌαžŠαžšαž”αžŸαŸ‹αž™αžΎαž„ (αž“αž·αž™αžΆαž™αž˜αŸ’αž™αŸ‰αžΆαž„αž‘αŸ€αž - αž‡αžΆαž“αž·αž…αŸ’αž…αž€αžΆαž›...) αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαž†αŸ’αž›αž»αŸ‡ αž“αž·αž„ Canary rollouts αŸ”

αž’αžŸαŸ‹αž–αŸαž› αž“αž·αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ†αž αž»αžŸαž˜αž·αž“αžαŸ‚αž„αžαŸ‚αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž“αŸ„αŸ‡αž‘αŸαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž–αžΈ "8 αž€αžΆαžšαž™αž›αŸ‹αžαž»αžŸαž’αŸ†αž–αžΈαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž…αŸ‚αž€αž…αžΆαž™"αžŠαŸ†αž”αžΌαž„αž”αž„αŸ’αž’αžŸαŸ‹αž‚αžΊαž‡αŸ†αž“αžΏαžαž»αžŸαžŠαŸ‚αž›αžαžΆ "αž”αžŽαŸ’αžαžΆαž‰αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“" αŸ” αžαžΆαž˜αž–αž·αžαž”αžŽαŸ’αžαžΆαž‰ αž˜αž·αž“αž˜αžΆαž“ αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αžœαŸαž›αžΆαž’αžŸαŸ‹αž–αŸαž› (αž’αžŸαŸ‹αž–αŸαž›) αž“αž·αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž (αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž).

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰ αž™αžΎαž„αž“αžΉαž„αž”αž“αŸ’αžαž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚αž”αž‰αŸ’αž αžΆαžŠαžŠαŸ‚αž› sa-logic (buggy) αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž€αŸ’αž›αŸ‚αž„αž’αŸ’αžœαžΎαž—αžΆαž–αž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž‘αž»αž€αž…αž·αžαŸ’αžαž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž…αŸƒαžŠαž“αŸ’αž™αŸ”

αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž˜αžΆαž“αž±αž€αžΆαžŸ 1/3 αž€αŸ’αž“αž»αž„αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž™αžΌαžšαž–αŸαž€ αž±αž€αžΆαžŸ 1/3 αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αŸ†αž αž»αžŸαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαžΆαž„αž€αŸ’αž“αž»αž„ αž“αž·αž„ 1/3 αž±αž€αžΆαžŸαž“αŸƒαž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ†αž–αŸαžšαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž“αŸƒαž”αž‰αŸ’αž αžΆαž”αŸ‚αž”αž“αŸαŸ‡ αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž‡αžΈαžœαž·αžαž€αžΆαž“αŸ‹αžαŸ‚αž”αŸ’αžšαžŸαžΎαžšαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž™αžΎαž„αž’αžΆαž…αŸ–

  1. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž›αžΎαžŸαž–αžΈ 8 αžœαž·αž“αžΆαž‘αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž†αŸ’αž›αžΎαž™αžαž”
  2. αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αžαž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαŸ†αžŽαžΎαž”αžšαžΆαž‡αŸαž™αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž“αž·αž™αž˜αž“αŸαž™αž’αž“αž’αžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ (sa-logic-retries-timeouts-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic
  http:
  - route: 
    - destination: 
        host: sa-logic
        subset: v1
      weight: 50
    - destination: 
        host: sa-logic
        subset: v2
      weight: 50
    timeout: 8s           # 1
    retries:
      attempts: 3         # 2
      perTryTimeout: 3s # 3

  1. αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ… 8 αžœαž·αž“αžΆαž‘αžΈ;
  2. αžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž 3 αžŠαž„;
  3. αž αžΎαž™αž€αžΆαžšαž”αŸ‰αž»αž“αž”αŸ‰αž„αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž˜αž·αž“αž‡αŸ„αž‚αž‡αŸαž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αŸαž›αžœαŸαž›αžΆαž†αŸ’αž›αžΎαž™αžαž”αž›αžΎαžŸαž–αžΈ 3 αžœαž·αž“αžΆαž‘αžΈαŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαžšαž„αŸ‹αž…αžΆαŸ†αž›αžΎαžŸαž–αžΈ 8 αžœαž·αž“αžΆαž‘αžΈαž‘αŸ αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αžαŸ’αž˜αžΈαž…αŸ†αž“αž½αž“ XNUMX αžŠαž„αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž”αžšαžΆαž‡αŸαž™ αž”αž„αŸ’αž€αžΎαž“αž±αž€αžΆαžŸαž“αŸƒαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ’αžšαžΆαž αŸ’αžœ Grafana αžŠαŸ‚αž›αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‡αŸ„αž‚αž‡αŸαž™αž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αžαžΆαž„αž›αžΎαŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 2
αž€αžΆαžšαž€αŸ‚αž›αž˜αŸ’αž’αžŸαŸ’αžαž·αžαž·αž†αŸ’αž›αžΎαž™αžαž”αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž“αž·αž„αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž

αž˜αž»αž“αž–αŸαž›αž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ (αž¬αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž“αŸαŸ‡αž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž‘αŸ€αžαž‘αŸ - αž”αŸ’αžšαž αŸ‚αž›αž”αž€αž”αŸ’αžšαŸ‚αŸ” ), αž›αž»αž” sa-logic-buggy αž“αž·αž„ VirtualService αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

$ kubectl delete deployment sa-logic-buggy
deployment.extensions β€œsa-logic-buggy” deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io β€œsa-logic” deleted

αž§αž”αž€αžšαžŽαŸαž”αŸ†αž›αŸ‚αž„αžŸαŸ€αž‚αŸ’αžœαžΈ αž“αž·αž„αž‚αŸ†αžšαžΌαž€αŸ’αž”αžΆαž›αž‚αŸ’αžšαžΆαž”αŸ‹

αž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž‚αŸ†αžšαžΌαžŸαŸ†αžαžΆαž“αŸ‹αž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” (αž€αžΆαžšαž–αŸ’αž™αžΆαž”αžΆαž›αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„) αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

αž’αŸ’αž“αž€αž”αŸ†αž”αŸ‚αž€αžŸαŸ€αž‚αŸ’αžœαžΈ ("αž§αž”αž€αžšαžŽαŸαž”αŸ†αž”αŸ‚αž€αžŸαŸ€αž‚αŸ’αžœαžΈ") αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž…αžΌαž›αž˜αž€αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž˜αž·αž“αž›αŸ’αž’ αž αžΎαž™αžŸαŸ’αžŠαžΆαžšαžœαžΆαž‘αžΎαž„αžœαž·αž‰ αžαžŽαŸˆαžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžšαž”αžŸαŸ‹αž’αžαž·αžαž·αž‡αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžšαžŽαžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžαž—αžΆαž–αž›αŸ’αž’αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ„αŸ‡ (αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž“αž—αžΆαž‚αžšαž™αž“αŸƒαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžŠαŸ‚αž›αž‡αŸ„αž‚αž‡αŸαž™)αŸ” (αž…αŸ†αžŽαžΆαŸ†αŸ– αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸƒαž‚αŸ†αžšαžΌαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž§αž‘αžΆαž αžšαžŽαŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡.)

αžŸαŸ†αž–αžΈαž„αžŸαŸ†αž–αŸ„αž„ ("αž—αžΆαž‚αžαžΆαžŸ") αž•αŸ’αžαžΆαž…αŸ‹αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž–αžΈαž€αžΆαžšαž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ” αž§αž‘αžΆαž αžšαžŽαŸ សេវអ B αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαžΌαž… αž αžΎαž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αž’αžαž·αžαž·αž‡αž“αžšαž”αžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ B) αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ B αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αžœαžΆαž’αžŸαŸ‹αž€αŸ†αž›αžΆαŸ†αž„ αž“αž·αž„αž˜αž·αž“αž’αžΆαž…αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαžŸαŸ†αžŽαžΎαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž”αžΆαž“αž‘αŸ (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž˜αž€αž–αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ B)αŸ” (αž…αŸ†αžŽαžΆαŸ†αŸ– αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸƒαž‚αŸ†αžšαžΌαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž§αž‘αžΆαž αžšαžŽαŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡.)

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž›αž»αž”αž…αŸ„αž›αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαž‚αŸ†αžšαžΌαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžšαž€ αž―αž€αžŸαžΆαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž αžΎαž™αžαŸ’αž‰αž»αŸ†αž€αŸαž…αž„αŸ‹αž”αž„αŸ’αž αžΆαž‰αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αŸ”

PS αž–αžΈαž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚

αžŸαžΌαž˜αž’αžΆαž“αž•αž„αžŠαŸ‚αžšαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹