αž˜αžΆαž“αžŸαŸαžœαžΆ NGINX Mesh

αž˜αžΆαž“αžŸαŸαžœαžΆ NGINX Mesh

αž™αžΎαž„αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž€αŸ†αžŽαŸ‚αž˜αžΎαž›αž‡αžΆαž˜αž»αž“ αž”αžŽαŸ’αžαžΆαž‰αžŸαŸαžœαžΆ NGINX (NSM) αžŠαŸ‚αž›αž‡αžΆαž€αž‰αŸ’αž…αž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αž˜αŸ’αž„αž“αŸ‹αžŸαŸ’αžšαžΆαž›αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ NGINX Plus αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž€αž»αž„αžαžΊαž“αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ Kubernetes αŸ”

NSM αž‚αžΊαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ αž‘αžΆαž‰αž™αž€αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ”. αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αž“αžΉαž„αžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“ dev αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„ αž αžΎαž™αž‘αž“αŸ’αž‘αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž˜αžαž·αž€αŸ‚αž›αž˜αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž“αŸ…αž›αžΎ GitHub.

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

NSM αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœ:

  • αžŸαž“αŸ’αžαž·αžŸαž»αžαžŠαŸ‚αž›αž₯αž‘αžΌαžœαž“αŸαŸ‡αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž‡αžΆαž„αž–αŸαž›αžŽαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž€αžΆαžšαž”αŸ†αž–αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αžΆαž…αž’αŸ’αžœαžΎαž²αŸ’αž™αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžαžΆαžαž”αž„αŸ‹αž…αŸ†αžŽαžΌαž› αž“αž·αž„αž€αŸαžšαŸ’αžαž·αŸαžˆαŸ’αž˜αŸ„αŸ‡αžšαžΆαž”αŸ‹αž›αžΆαž“αžŠαž»αž›αŸ’αž›αžΆαžšαž€αŸ’αž“αž»αž„αž˜αž½αž™αž†αŸ’αž“αžΆαŸ†αŸ—αŸ” NSM αž’αžΆαž“αžΆαžαžΆαžšαžΆαž›αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŠαŸ„αž™αž”αŸ’αžšαžΎ mTLS αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαžŸαžΎαž”αžŠαŸ‚αž›αž’αžΆαž…αž›αž½αž…αž”αžΆαž“αžŠαŸ„αž™αž–αž½αž€ Hacker αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž“αŸ„αŸ‡αž‘αŸαŸ” αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž”αŸ€αž”αžŠαŸ‚αž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”
  • αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸ. αž“αŸ…αž–αŸαž›αžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αž„αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαžšαžΉαžαž”αž“αŸ’αžαžΉαž„αž…αžšαžΆαž…αžšαžŽαŸαž…αžΌαž›αž˜αž€αž€αžΆαž“αŸ‹αžœαžΆ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸαž†αŸ’αž›αžΆαžαžœαŸƒαžšαž”αžŸαŸ‹ NSM αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžšαžΉαžαž”αž“αŸ’αžαžΉαž„αž…αžšαžΆαž…αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αž˜αžΈαžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž€αžΎαž“αž…αžšαžΆαž…αžšαžŽαŸαžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαŸ” αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž›αŸ’αž”αžΏαž“ αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αŸ†αž”αŸ‚αž€αžŸαŸ€αž‚αŸ’αžœαžΈ αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž–αŸαž‰αž›αŸαž‰αž›αžΎαž›αŸ†αž αžΌαžšαž…αžšαžΆαž…αžšαžŽαŸαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”
  • αž€αžΆαžšαž˜αžΎαž›αžƒαžΎαž‰. αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαžΆαž”αŸ‹αž–αžΆαž“αŸ‹αž’αžΆαž…αž‡αžΆαž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ αž“αž·αž„αž€αžΆαžšαž˜αžΎαž›αžƒαžΎαž‰αžŸαž»αž”αž·αž“αŸ’αžαž’αžΆαž€αŸ’αžšαž€αŸ‹αŸ” NSM αž‡αž½αž™αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Grafana αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ NGINX Plus αŸ” αž αžΎαž™αž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“αž€αžΆαžšαž”αžΎαž€αž…αŸ†αž αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž•αž„αžŠαŸ‚αžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αž˜αŸ’αž’αž·αžαŸ”
  • αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αžΌαž“αž€αžΆαžαŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαžΌαž…αž‡αžΆαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αž·αž“αž”αŸ’αžšαžΎαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž›αžΎ Kubernetes αž‘αŸαŸ” NSM αž’αžΆαž“αžΆαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αžΆαžŸαŸ‹αŸ—αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž…αŸ„αž›αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž˜αžΎαž›αžαŸ‚αž‘αŸαŸ” αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αž–αžΈ NGINX Kubernetes Ingress Controller αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž€αŸαžšαžŠαŸ†αžŽαŸ‚αž›αž“αžΉαž„αž’αžΆαž…αž”αŸ’αžšαžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαž€αŸ‹αž‘αž„αž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαžŸαŸ†αžŽαžΆαž‰αŸ‹ αž“αž·αž„αž…αŸ’αžšαžΆαžŸαž˜αž€αžœαž·αž‰αŸ”

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

តើ NGINX Service Mesh αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

NSM αž˜αžΆαž“αž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž„αŸ’αžšαž½αž”αž”αž„αŸ’αžšαž½αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αžšαžΆαž…αžšαžŽαŸαž•αŸ’αžŠαŸαž€ (αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜) αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆ NGINX Plus Ingress αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αžšαžΆαž…αžšαžŽαŸαž”αž‰αŸ’αžˆαžšαžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž™αž“αŸ’αžαž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΆαžαŸ‚αž˜αž½αž™αŸ”

αž™αž“αŸ’αžαž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αž‡αžΆαž–αž·αžŸαŸαžŸ αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαžŸαžΎαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™ NGINX Plus αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž…αŸ’αž”αžΆαž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„ NGINX Plus sidecars αŸ”

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

  • Grafana, αž€αžΆαžšαž˜αžΎαž›αžƒαžΎαž‰αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš Prometheus, αž”αž“αŸ’αž‘αŸ‡ NSM αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž‡αž½αž™αž’αŸ’αž“αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€;
  • Kubernetes Ingress Controllers αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž…αžΌαž› αž“αž·αž„αž…αŸαž‰αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΆαž‰αŸ‹αŸ”
  • SPIRE, CA αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž…αŸ‚αž€αž…αžΆαž™ αž“αž·αž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΆαž‰αŸ‹αŸ”
  • NATS αžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαžΆαžš αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαž•αŸ’αž›αžΌαžœ αž–αžΈαž™αž“αŸ’αžαž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΆαž‘αŸ…αžšαžαž™αž“αŸ’αžαž…αŸ†αž αŸ€αž„αŸ”
  • αž”αžΎαž€αž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“ αž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™ (αž‚αžΆαŸ†αž‘αŸ’αžš Zipkin αž“αž·αž„ Jaeger);
  • Prometheus αž”αŸ’αžšαž˜αžΌαž› αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αž€αŸ’αžαžŽαŸˆαž–αžΈ NGINX Plus sidecars αžŠαžΌαž…αž‡αžΆαž…αŸ†αž“αž½αž“αžŸαŸ†αžŽαžΎ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž€αžΆαžšαž…αžΆαž”αŸ‹αžŠαŸƒ SSLαŸ”

αž˜αž»αžαž„αžΆαžšαž“αž·αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»

NGINX Plus αž‡αžΆαž™αž“αŸ’αžαž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž›αžΎαž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈ sidecar (αž…αžšαžΆαž…αžšαžŽαŸαž•αŸ’αžŠαŸαž€) αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆ Ingress (αž”αž‰αŸ’αžˆαžš) αž€αžΆαžšαžŸαŸ’αž‘αžΆαž€αŸ‹αž…αžΆαž”αŸ‹ αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž€αž»αž„αžαžΊαž“αŸαžšαžšαžœαžΆαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžšαž½αž˜αž˜αžΆαž“:

  • αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ TLS αž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€ (mTLS)
  • αž•αŸ’αž‘αž»αž€αžαž»αž›αŸ’αž™αž—αžΆαž–;
  • αž€αžΆαžšαž’αžαŸ‹αž’αŸ’αž˜αžαŸ‹αž€αŸ†αž αž»αžŸ;
  • αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž›αŸ’αž”αžΏαž“;
  • αž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αžŸαŸ€αž‚αŸ’αžœαžΈ;
  • αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αžŽαŸŒαžαŸ€αžœαž”αŸƒαžαž„αž“αž·αž„ Canary;
  • αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαŸ”

αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš NGINX Service Mesh

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš NSM αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ–

  • αž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“ Kubernetes αŸ” NGINX Service Mesh αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆ Kubernetes αž‡αžΆαž…αŸ’αžšαžΎαž“ αžšαž½αž˜αž‘αžΆαŸ†αž„ Amazon Elastic Container Service for Kubernetes (EKS), Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), VMware vSphere αž“αž·αž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αž’αž˜αŸ’αž˜αžαžΆαžŠαŸ‚αž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αŸ”
  • αž§αž”αž€αžšαžŽαŸ kubectlαžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž› NSM αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„;
  • αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž€αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŸαŸαžœαžΆ NGINX Mesh αŸ” αž€αž‰αŸ’αž…αž”αŸ‹αž˜αžΆαž“αžšαžΌαž”αž—αžΆαž– NSM αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹αž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡αž―αž€αž‡αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αŸ” αž€αž‰αŸ’αž…αž”αŸ‹αž€αŸαž˜αžΆαž“αž•αž„αžŠαŸ‚αžšαŸ” nginx-meshctlαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ NSM αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ NSM αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž‚αŸ’αžšαžΏαž„αž”αž“αŸ’αž›αžΆαžŸαŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž αžΎαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžŸαžΆαžšαžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αžαžΆ NSM αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ namespace αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™ (αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœ αž‘αžΆαž‰αž™αž€ αž αžΎαž™αžŠαžΆαž€αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡ αž”αŸ’αžšαž αŸ‚αž› αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚):

$ DOCKER_REGISTRY=your-Docker-registry ; MESH_VER=0.6.0 ; 
 ./nginx-meshctl deploy  
  --nginx-mesh-api-image "${DOCKER_REGISTRY}/nginx-mesh-api:${MESH_VER}" 
  --nginx-mesh-sidecar-image "${DOCKER_REGISTRY}/nginx-mesh-sidecar:${MESH_VER}" 
  --nginx-mesh-init-image "${DOCKER_REGISTRY}/nginx-mesh-init:${MESH_VER}" 
  --nginx-mesh-metrics-image "${DOCKER_REGISTRY}/nginx-mesh-metrics:${MESH_VER}"
Created namespace "nginx-mesh".
Created SpiffeID CRD.
Waiting for Spire pods to be running...done.
Deployed Spire.
Deployed NATS server.
Created traffic policy CRDs.
Deployed Mesh API.
Deployed Metrics API Server.
Deployed Prometheus Server nginx-mesh/prometheus-server.
Deployed Grafana nginx-mesh/grafana.
Deployed tracing server nginx-mesh/zipkin.
All resources created. Testing the connection to the Service Mesh API Server...

Connected to the NGINX Service Mesh API successfully.
NGINX Service Mesh is running.

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αž˜αŸ’αžšαžΎαžŸαž”αž“αŸ’αžαŸ‚αž˜ αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αŸ–

$ nginx-meshctl deploy –h

αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž™αž“αŸ’αžαž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ nginx-mesh, αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αžŠαžΌαž…β€‹αž“αŸαŸ‡β€‹αž”αžΆαž“:

$ kubectl get pods –n nginx-mesh
NAME                                 READY   STATUS    RESTARTS   AGE
grafana-6cc6958cd9-dccj6             1/1     Running   0          2d19h
mesh-api-6b95576c46-8npkb            1/1     Running   0          2d19h
nats-server-6d5c57f894-225qn         1/1     Running   0          2d19h
prometheus-server-65c95b788b-zkt95   1/1     Running   0          2d19h
smi-metrics-5986dfb8d5-q6gfj         1/1     Running   0          2d19h
spire-agent-5cf87                    1/1     Running   0          2d19h
spire-agent-rr2tt                    1/1     Running   0          2d19h
spire-agent-vwjbv                    1/1     Running   0          2d19h
spire-server-0                       2/2     Running   0          2d19h
zipkin-6f7cbf5467-ns6wc              1/1     Running   0          2d19h

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

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

$ kubectl apply –f sleep.yaml
$ kubectl get pods –n default
NAME                     READY   STATUS    RESTARTS   AGE
sleep-674f75ff4d-gxjf2   2/2     Running   0          5h23m

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

$ kubectl port-forward sleep-674f75ff4d-gxjf2 8080:8886

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

αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αŸ’αžšαžΎβ€‹αž’αž“αž’αžΆαž“ Kubernetes αž“αžΈαž˜αž½αž™αŸ—β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸβ€‹αž…αžšαžΆαž…αžšαžŽαŸ αžŠαžΌαž…αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„β€‹αž€αžΆαžšβ€‹αž…αžΌαž›β€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžš αž€αžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αž’αžαŸ’αžšαžΆβ€‹αž“αž·αž„β€‹αž€αžΆαžšβ€‹αž”αŸ†αž”αŸ‚αž€β€‹αžŸαŸ€αž‚αŸ’αžœαžΈβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž“αŸαŸ‡β€‹αž˜αžΎαž› αž―αž€αžŸαžΆαžš

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

NGINX Service Mesh αž’αžΆαž…αž‘αžΆαž‰αž™αž€αžŠαŸ„αž™αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž“αŸ… αž•αžαžαž› F5. αžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ dev αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž“αž·αž„ αžŸαžšαžŸαŸαžšαž˜αž€αž™αžΎαž„αž’αŸ†αž–αžΈαž›αž‘αŸ’αž’αž•αž›.

αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ NGINX Plus Ingress Controller αžŸαžΌαž˜αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžšαž™αŸˆαž–αŸαž›αžŸαžΆαž€αž›αŸ’αž”αž„αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž™αŸˆαž–αŸαž› 30 αžαŸ’αž„αŸƒαž¬ αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž˜αž€β€‹αž–αž½αž€β€‹αž™αžΎαž„ αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αžŠαŸ„αž™ Pavel Demkovich αžœαž·αžŸαŸ’αžœαž€αžšαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ αžŸαŸ…αž”αŸ’αžšαŸŠαžΈαž. αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ RUB 15 αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚αŸ” αž αžΎαž™αž‡αžΆαž•αŸ’αž“αŸ‚αž€αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ - αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž› αž’αŸ„αž”αž’αž“αž»αžœαžαŸ’αž αž“αž·αž„αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž€αŸ’αžšαŸ…αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαŸ”

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

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