αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αž…αŸ†αžŽαžΆαŸ† αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αŸ– αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸαŸ‡αž–αžΈ Weaveworks αžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αž αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš Kubernetes Flagger αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆαž—αžΆαžŸαžΆαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž˜αžΆαž“αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžŠαŸ‚αž›αž˜αžΎαž›αžƒαžΎαž‰αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžœαž·αžŸαŸ’αžœαž€αžšαžαŸ’αž˜αžΈαžαŸ’αž˜αŸ„αž„αž’αžΆαž…αž™αž›αŸ‹αž–αžΈαž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž”αžΆαž“αŸ”

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž…αŸαž‰αž–αžΈ αž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰ αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αž»αž„αžαžΊαž“αŸαžš

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

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžšαž™αŸˆαž–αŸαž›αžαŸ’αž›αžΈ αž“αž·αž„αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž‡αžΆαž„αž˜αž»αž“ αž˜αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž–αŸαž›αžœαŸαž›αžΆαž‘αŸ…αž‘αžΈαž•αŸ’αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αŸ”
  • αž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈαž‘αŸ…αžŠαž›αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ”
  • αž˜αžαž·αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αŸ…αžŠαž›αŸ‹αž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αŸ’αžšαž»αž˜αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž˜αž»αžαž„αžΆαžš αž“αž·αž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž”αžΆαž“αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ”
  • αžŸαžΈαž›αž’αž˜αŸŒαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αžΎαž“αž‘αžΎαž„αŸ– αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‚αžΊαž€αžΆαž“αŸ‹αžαŸ‚αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αŸ”


αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž—αžΆαž–αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž€αžΎαž“αž‘αžΎαž„ αž±αž€αžΆαžŸαž“αŸƒαž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž’αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“αž›αžΎαž—αžΆαž–αž‡αžΏαž‡αžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž¬αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸαž€αžΎαž“αž‘αžΎαž„αž•αž„αžŠαŸ‚αžšαŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž“αž·αž„αž€αŸ’αžšαž»αž˜ DevOps αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαžΆαž˜αžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž αžΆαž“αž·αž—αŸαž™αžŠαž›αŸ‹αž•αž›αž·αžαž•αž› αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” (αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž”αŸ†αž–αž„αŸ‹ CI/CD αž“αŸ…αž‘αžΈαž“αŸαŸ‡.)

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

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™

αž˜αžΆαž“αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αŸ’αžšαž—αŸαž‘αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‚αŸ„αž›αžŠαŸ…αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ†αž–αŸ„αŸ‡αž”αžšαž·αžŸαŸ’αžαžΆαž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž”αž“αŸ’αžαŸ‚αž˜ αž¬αž…αŸ†αž–αŸ„αŸ‡αž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹/αž’αžαž·αžαž·αž‡αž“ αž¬αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαž˜αž»αž“αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžšαž˜αž½αž™αŸ” αžŸαžΆαž’αžΆαžšαžŽαŸˆ.

αžšαŸ†αž€αž·αž› (αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ "αžšαŸ†αž€αž·αž›" αž”αž“αŸ’αžαž·αž…αž˜αŸ’αžαž„αŸ—)

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

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

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

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: awesomeapp
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: awesomeapp
    spec:
      containers:
        - name: awesomeapp
          image: imagerepo-user/awesomeapp:new
          ports:
            - containerPort: 8080

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžœαž·αž›αž‡αž»αŸ†αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš manifestαŸ–

spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
       maxSurge: 25%
       maxUnavailable: 25%  
  template:
  ...

αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰

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

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

spec:
  replicas: 3
  strategy:
    type: Recreate
  template:
  ...

αžαŸ€αžœ/αž”αŸƒαžαž„ (αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αžŽαŸŒαžαŸ€αžœαž”αŸƒαžαž„)

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

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: awesomeapp-02
spec:
  template:
    metadata:
      labels:
        app: awesomeapp
        version: "02"

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αŸ†αžŽαŸ‚αž–αžŽαŸŒαžαŸ€αžœ (αžαŸ’αž˜αžΈ) αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„ αž αžΎαž™αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž›αŸ‹αž–αŸ’αžšαž˜ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αŸ’αžαžΌαžšαž‘αŸ…αžœαžΆ αž αžΎαž™αž€αŸ†αžŽαŸ‚αž–αžŽαŸŒαž”αŸƒαžαž„ (αž…αžΆαžŸαŸ‹) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžαŸ‹αŸ–

apiVersion: v1
kind: Service
metadata:
  name: awesomeapp
spec:
  selector:
    app: awesomeapp
    version: "02"
...

Canary (αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary)

Canary rollouts αž‚αžΊαžŸαŸ’αžšαžŠαŸ€αž„αž‘αŸ…αž“αžΉαž„αž€αžΆαžšαž…αŸαž‰αž–αžŽαŸŒαžαŸ€αžœαž”αŸƒαžαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž“αž·αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΆαž“αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„ αžšαžΈαž€αž…αž˜αŸ’αžšαžΎαž“ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‡αžΆαž‡αŸ†αž αžΆαž“ αŸ— αŸ” αž”αŸ’αžšαž—αŸαž‘β€‹αž“αŸαŸ‡β€‹αžšαž½αž˜β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‘αžΆαŸ†αž„β€‹αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšβ€‹αžαž»αžŸβ€‹αž‚αŸ’αž“αžΆβ€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“ αžšαž½αž˜β€‹αž‘αžΆαŸ†αž„β€‹αž€αžΆαžšβ€‹αž”αžΆαž‰αŸ‹β€‹αž”αž„αŸ’αž αŸ„αŸ‡ "αž”αŸ†αž”αžΆαŸ†αž„αž€αžΆαž™" αž“αž·αž„β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αžαŸαžŸαŸ’αž A/BαŸ”

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

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

αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“ manifest αž–αžΈαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitαŸ– manifest αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™ tag 0.1.0 αž“αž·αž„ canary manifest αž‡αžΆαž˜αž½αž™ tag 0.2.0αŸ” αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž˜αŸ’αž„αž“αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž…αŸ’αžšαž€αž•αŸ’αž›αžΌαžœαž“αž·αž˜αŸ’αž˜αž·αž Istio αž’αŸ’αž“αž€αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž…αžšαžΆαž…αžšαžŽαŸαžšαžœαžΆαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡αŸ–

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‡αžΆαž‡αŸ†αž αžΆαž“ αŸ— αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αžŠαŸ„αž™αž”αŸ’αžšαžΎ Istio αžŸαžΌαž˜αž˜αžΎαž› αž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹ GitOps αž‡αžΆαž˜αž½αž™ Istio. (αž…αŸ†αžŽαžΆαŸ†αŸ” αž”αž€αž”αŸ’αžšαŸ‚αŸ– αž™αžΎαž„β€‹αž€αŸβ€‹αž”αžΆαž“β€‹αž”αž€β€‹αž”αŸ’αžšαŸ‚β€‹αžŸαž˜αŸ’αž—αžΆαžšαŸˆβ€‹αž’αŸ†αž–αžΈβ€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™ Canary αž‘αŸ…β€‹αž‡αžΆ Istio αž“αŸ…αž‘αžΈαž“αŸαŸ‡.)

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž‡αžΆαž˜αž½αž™ Weaveworks Flagger

Weaveworks Flagger αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Canary rollouts αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ”

Flagger αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž½αž€αž‚αŸαŸ” αžœαžΆαž”αŸ’αžšαžΎ Istio ឬ AWS App Mesh αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“ αž“αž·αž„αž”αŸ’αžαžΌαžšαž…αžšαžΆαž…αžšαžŽαŸ αž“αž·αž„αž˜αŸ‰αŸ‚αžαŸ’αžš Prometheus αžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚αž›αž‘αŸ’αž’αž•αž›αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž€αžΆαžšαžœαž·αž—αžΆαž‚αž›αžΎαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ„αž™ webhooks αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αžΆαžšαž‘αž‘αž½αž›αž™αž€ αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž•αŸ’αž‘αž»αž€ αž“αž·αž„αž”αŸ’αžšαž—αŸαž‘αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αŸ”

αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Kubernetes αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž•αŸ’αžαŸαž€αž“αŸƒαž•αž (HPA) Flagger αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαžœαžαŸ’αžαž» (αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Kubernetes សេវអ ClusterIP αž“αž·αž„ Istio αž¬αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αž·αž˜αŸ’αž˜αž·αž App Mesh) αžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ CanaryαŸ–

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ (αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™),Flagger αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αžšαžΆαž…αžšαžŽαŸαž”αž“αŸ’αžαž·αž…αž˜αŸ’αžαž„αŸ—αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Canary αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžœαžΆαžŸαŸ‹αžŸαŸ’αž‘αž„αŸ‹αž“αžΌαžœαžŸαžΌαž…αž“αžΆαž€αžšαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αžŠαžΌαž…αž‡αžΆαž—αžΆαž‚αžšαž™αž“αŸƒαžŸαŸ†αžŽαžΎ HTTP αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™ αžšαž™αŸˆαž–αŸαž›αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‡αžΆαž˜αž’αŸ’αž™αž˜ αž“αž·αž„αžŸαž»αžαž—αžΆαž–αžšαž”αžŸαŸ‹ pod αŸ” αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚ KPI (αžŸαžΌαž…αž“αžΆαž€αžšαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαŸ†αžαžΆαž“αŸ‹αŸ—) Canary αž›αžΌαžαž›αžΆαžŸαŸ‹αž¬αžŠαž½αž›αžšαž›αŸ†αž αžΎαž™αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Slack αŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆ αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αŸ’αž—αžΆαžšαŸˆ αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ App Mesh.

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αž„αž„αžΉαž (αž›αžΆαž€αŸ‹) αž¬αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ A/B

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

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

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

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ– αžšαž˜αŸ€αž› αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αžαŸ€αžœ/αž”αŸƒαžαž„ αž€αžΆαžŽαžΆαžšαžΈ αž„αž„αžΉαž (αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B)

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Flagger αž“αž·αž„ A/B

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž“αžΆαŸ†αž•αŸ’αž›αžΌαžœαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž‘αž˜αŸ’αž„αž“αŸ‹ Flagger αž€αŸαž’αžΆαž…αž”αž‰αŸ’αž‡αžΌαž“αž…αžšαžΆαž…αžšαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Canary αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš HTTP αž•αž„αžŠαŸ‚αžšαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž”αž‹αž˜αž€αžαžΆ HTTP αž¬αžαžΌαž‚αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž‚αŸ„αž›αžŠαŸ…αž•αŸ’αž“αŸ‚αž€αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ frontend αžŠαŸ‚αž›αž‘αžΆαž˜αž‘αžΆαžš session binding αž‘αŸ… server (αž—αžΆαž–αžŸαŸ’αž“αž·αž‘αŸ’αž’αžŸαŸ’αž“αžΆαž›αžŸαž˜αŸαž™). αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš Flagger αŸ”

αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαžŠαžΉαž„αž‚αž»αžŽ Stefan Prodanαžœαž·αžŸαŸ’αžœαž€αžš Weaveworks (αž“αž·αž„αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž Flagger) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ†αžšαžΌαž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αŸ”

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

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

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

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