αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kubernetes αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž”αŸ’αžšαžΎ Prometheus αž“αž·αž„ KEDA

αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kubernetes αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž”αŸ’αžšαžΎ Prometheus αž“αž·αž„ KEDABalloon Man αžŠαŸ„αž™ Cimuanos

αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž‚αžΊαž‡αžΆαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž–αž€αŸ” αž‡αžΆαž˜αž½αž™ Kubernetes αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž…αŸ†αž“αž½αž“αž…αž˜αŸ’αž›αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αžŸαŸ’αžšαž” ឬ ReplicaSet - αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŠαŸƒαŸ”

Kubernetes αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· (αž§αž‘αžΆαž αžšαžŽαŸ Pods αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ ឬ ReplicaSet) αž€αŸ’αž“αž»αž„β€‹αž›αž€αŸ’αžαžŽαŸˆβ€‹αž”αŸ’αžšαž€αžΆαžŸβ€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αžšαž”αžŸαŸ‹ Horizontal Pod AutoscalerαŸ” αž›αž€αŸ’αžαžŽαŸˆαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‚αžΊαž‡αžΆαžšαž„αŸ’αžœαžΆαžŸαŸ‹αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸŠαžΈαž—αžΈαž™αžΌ (αžšαž„αŸ’αžœαžΆαžŸαŸ‹αž’αž“αž’αžΆαž“) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžšαž„αŸ’αžœαžΆαžŸαŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ…αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ”

αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžš Kubernetes aaS αž–αžΈ Mail.ru αž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚αž’αžαŸ’αžαž”αž‘αž˜αž½αž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹αžαžΆαž„αž€αŸ’αžšαŸ…αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kubernetes αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž”αŸ’αžšαžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹αžŸαŸ†αžŽαžΎαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ HTTP αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αžŠαŸ„αž™αž”αŸ’αžšαžΎ Prometheus αŸ”

αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαž·αŸ’αžαž•αŸ’αžαŸαž€ αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kubernetes Event Driven Autoscaling (KEDA) αžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš Kubernetes αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αŸ” αžœαžΆαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžŠαžΎαž˜αž€αŸ†αžŽαžΎαžαž‡αžΆαž˜αž½αž™ Horizontal Pod Autoscaler αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžαŸ’αž“αŸαžš (αžšαž½αž˜αž‘αžΆαŸ†αž„αž‘αŸ…/αž–αžΈαžŸαžΌαž“αŸ’αž™) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž‡αŸ†αžšαž»αž‰αžŠαŸ„αž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαŸ” αž›αŸαžαž€αžΌαžŠαž˜αžΆαž“αž“αŸ… GitHub.

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αžŸαž„αŸ’αžαŸαž”αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’

αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kubernetes αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž”αŸ’αžšαžΎ Prometheus αž“αž·αž„ KEDA

αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž”αž„αŸ’αž αžΆαž‰αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαžŸαž„αŸ’αžαŸαž”αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

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

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž±αŸ’αž™αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αŸ”

KEDA αž“αž·αž„ Prometheus

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

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

Scalers αž‚αžΆαŸ†αž‘αŸ’αžšαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αž§αž‘αžΆαž αžšαžŽαŸ Kafka, Redis, Prometheus αŸ” αž“αŸ„αŸ‡αž‚αžΊ KEDA αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Kubernetes αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž”αŸ’αžšαžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹ Prometheus αž‡αžΆαž›αž€αŸ’αžαžŽαŸˆαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ Golang αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžαžΆαž˜αžšαž™αŸˆ HTTP αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž˜αž»αžαž„αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž–αžΈαžšαŸ–

  1. αž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ Prometheus Go αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž§αž”αž€αžšαžŽαŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž•αŸ’αžαž›αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžš http_requests αžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αž“αž½αž“αž”αž»αž€αŸ” αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸαžœαžΆαžŸαŸ‹αžŸαŸ’αž‘αž„αŸ‹ Prometheus αž˜αžΆαž“αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… URI /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. αž‡αžΆαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎ GET αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αžΎαž“αžαž˜αŸ’αž›αŸƒαž“αŸƒαžŸαŸ„ (access_count) αž“αŸ…αž€αŸ’αž“αž»αž„ Redis αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž„αžΆαžšαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ HTTP αž“αž·αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž˜αŸ‰αŸ‚αžαŸ’αžšαžšαž”αžŸαŸ‹ Prometheus αž•αž„αžŠαŸ‚αžšαŸ” αžαž˜αŸ’αž›αŸƒαž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αžšαžΌαžœαžαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αžαž˜αŸ’αž›αŸƒ access_count αž“αŸ… Redis αŸ”
    func main() {
           http.Handle("/metrics", promhttp.Handler())
           http.HandleFunc("/test", func(w http.ResponseWriter, r 
    *http.Request) {
               defer httpRequestsCounter.Inc()
               count, err := client.Incr(redisCounterName).Result()
               if err != nil {
                   fmt.Println("Unable to increment redis counter", err)
                   os.Exit(1)
               }
               resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹ Kubernetes αžαžΆαž˜αžšαž™αŸˆ Deployment. αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž•αž„αžŠαŸ‚αžšαŸ” ClusterIPαžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Prometheus αž‘αž‘αž½αž›αž”αžΆαž“αž˜αŸ‰αŸ‚αžαŸ’αžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ.

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Prometheus

αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž’αŸ†αž–αžΈαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Prometheus αžšαž½αž˜αž˜αžΆαž“αŸˆ

  • ConfigMap - αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Prometheus;
  • Deployment - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Prometheus αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes;
  • ClusterIP - αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ UI Prometheus;
  • ClusterRole, ClusterRoleBinding ΠΈ ServiceAccount β€” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αžƒαžΎαž‰αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes (αž€αžΆαžšαžšαž€αžƒαžΎαž‰αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·)αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Prometheus.

αžœαžαŸ’αžαž» KEDA Prometheus ScaledObject

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

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

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžαŸ’αžαž»αž˜αž½αž™αŸ” ScaledObject αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž” αž“αž·αž™αž˜αž“αŸαž™ HPA αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαŸ‡αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž“αž·αž™αž˜αž“αŸαž™ ScaledObject αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αžœαžΆαž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžœαžΆαžŸαŸ‹αžŸαŸ’αž‘αž„αŸ‹ Prometheus:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
 name: prometheus-scaledobject
 namespace: default
 labels:
   deploymentName: go-prom-app
spec:
 scaleTargetRef:
   deploymentName: go-prom-app
 pollingInterval: 15
 cooldownPeriod:  30
 minReplicaCount: 1
 maxReplicaCount: 10
 triggers:
 - type: prometheus
   metadata:
     serverAddress: 
http://prometheus-service.default.svc.cluster.local:9090
     metricName: access_frequency
     threshold: '3'
     query: sum(rate(http_requests[2m]))

αžŸαžΌαž˜αž–αž·αž…αžΆαžšαžŽαžΆαž…αŸ†αžŽαž»αž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  1. αž‚αžΆαžαŸ‹αž…αž„αŸ’αž’αž»αž›αž‘αŸ… Deployment αž‡αžΆαž˜αž½αž™αžˆαŸ’αž˜αŸ„αŸ‡ go-prom-app.
  2. αž”αŸ’αžšαž—αŸαž‘αž€αŸαŸ‡ - Prometheus. αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Prometheus αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αž˜αŸ‰αŸ‚αžαŸ’αžš αž€αž˜αŸ’αžšαž·αž αž“αž·αž„ αžŸαŸ†αžŽαž½αžš PromQLαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ” αžŸαŸ†αžŽαž½αžš PromQL - sum(rate(http_requests[2m])).
  3. αž“αŸαŸ‡αž”αžΎαž™αŸ„αž„αžαžΆαž˜ pollingIntervalKEDA αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‚αŸ„αž›αžŠαŸ…αž–αžΈ Prometheus αžšαŸ€αž„αžšαžΆαž›αŸ‹αžŠαž”αŸ‹αž”αŸ’αžšαžΆαŸ†αžœαž·αž“αžΆαž‘αžΈαŸ” αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αž“αŸ…αž€αŸ’αžšαŸ„αž˜ (minReplicaCount) αž αžΎαž™αž…αŸ†αž“αž½αž“αž’αžαž·αž”αžšαž˜αžΆαž“αŸƒ pods αž˜αž·αž“αž›αžΎαžŸαž–αžΈ maxReplicaCount (αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ - αžŠαž”αŸ‹) αŸ”

αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ minReplicaCount αžŸαŸ’αž˜αžΎαž“αžΉαž„αžŸαžΌαž“αŸ’αž™αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ KEDA αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αžΈαžŸαžΌαž“αŸ’αž™αž‘αŸ…αž˜αž½αž™ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž„αŸ’αž αžΆαž‰ HPA αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ” αž›αŸ†αžŠαžΆαž”αŸ‹αž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸαž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαŸ‚αžš αž–αŸ„αž›αž‚αžΊαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž–αžΈαž˜αž½αž™αž‘αŸ…αžŸαžΌαž“αŸ’αž™αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŸαžΌαž“αŸ’αž™αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡αž“αŸαŸ‡αž‡αžΆαžŸαŸαžœαžΆ HTTP αž“αž·αž„αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αžœαŸαž‘αž˜αž“αŸ’αžαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ autoscaling

αž€αž˜αŸ’αžšαž·αžβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αž‡αžΆβ€‹αž‚αž“αŸ’αž›αžΉαŸ‡β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αŸ’αžœαžΎβ€‹αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αžŸαŸ†αžŽαž½αžš PromQL sum(rate (http_requests [2m])) αžαŸ’αžšαž‘αž”αŸ‹αž’αžαŸ’αžšαžΆαžŸαŸ†αžŽαžΎ HTTP αžŸαžšαž»αž” (αžŸαŸ†αžŽαžΎαž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈ) αžŠαŸ‚αž›αžœαžΆαžŸαŸ‹αžœαŸ‚αž„αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž–αžΈαžšαž“αžΆαž‘αžΈαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

αžŠαŸ„αž™αžŸαžΆαžšαžαž˜αŸ’αž›αŸƒαž€αž˜αŸ’αžšαž·αžαž‚αžΊαž”αžΈ αžœαžΆαž˜αžΆαž“αž“αŸαž™αžαžΆαž“αžΉαž„αž˜αžΆαž“αž˜αž½αž™αž“αŸ…αž€αŸ’αžšαŸ„αž˜αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžαž˜αŸ’αž›αŸƒ sum(rate (http_requests [2m])) αžαž·αž…αž‡αžΆαž„αž”αžΈαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαž˜αŸ’αž›αŸƒαž€αžΎαž“αž‘αžΎαž„ αž’αž“αž»αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžšαžΆαž›αŸ‹αž–αŸαž› sum(rate (http_requests [2m])) αž€αžΎαž“αž‘αžΎαž„αž”αžΈαŸ” αž§αž‘αžΆαž αžšαžŽαŸαž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαž˜αŸ’αž›αŸƒαž‚αžΊαž–αžΈ 12 αž‘αŸ… 14 αž“αŸ„αŸ‡αž…αŸ†αž“αž½αž“αž•αžαž‚αžΊαž”αž½αž“αŸ”

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž–αŸ’αž™αžΆαž™αžΆαž˜β€‹αžšαŸ€αž”αž…αŸ†β€‹αžœαžΆβ€‹!

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“

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

αžŠαŸ†αž‘αžΎαž„αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸ…αž›αžΎ MacαŸ–

curl -Lo minikube 
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/

αž€αŸ†αžŽαžαŸ‹ kubectlαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎαž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αŸ”

αžŠαŸ†αž‘αžΎαž„αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸ…αž›αžΎ MacαŸ–

curl -LO 
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ KEDA

αž’αŸ’αž“αž€αž’αžΆαž…αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ KEDA αžαžΆαž˜αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“ αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈ αž―αž€αžŸαžΆαžš. αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎ YAML monolithicαŸ–

kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml

KEDA αž“αž·αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž‘αŸ…αž€αŸ’αž“αž»αž„ namespace keda. αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αŸ–

kubectl get pods -n keda

αžšαž„αŸ‹αž…αžΆαŸ†αž±αŸ’αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš KEDA αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Running State. αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž”αž“αŸ’αžαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Redis αžŠαŸ„αž™αž”αŸ’αžšαžΎ Helm

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ Helm αžŸαžΌαž˜αž”αŸ’αžšαžΎαžœαžΆ αž—αžΆαž–αž‡αžΆαž’αŸ’αž“αž€αžŠαžΉαž€αž“αžΆαŸ†. αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎ Mac:

brew install kubernetes-helm
helm init --history-max 200

helm init αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αžŠαŸ†αž‘αžΎαž„αž•αž„αžŠαŸ‚αžšαŸ” Tiller αž‘αŸ…αž€αžΆαž“αŸ‹αž€αŸ’αžšαž»αž˜ Kubernetes αŸ”

kubectl get pods -n kube-system | grep tiller

αžšαž„αŸ‹αž…αžΆαŸ†αž±αŸ’αž™ Tiller pod αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚αŸ– αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž”αŸ’αžšαžΎ Helm@2 αžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αžŠαŸ†αž‘αžΎαž„αžŸαž˜αžΆαžŸαž—αžΆαž‚αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Tiller αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ Helm@3 αž‚αžΊαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ αžœαžΆαž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αŸαŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αž‘αžΎαž„ Helm αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™αž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ RedisαŸ–

helm install --name redis-server --set cluster.enabled=false --set 
usePassword=false stable/redis

αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆ Redis αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ–

kubectl get pods/redis-server-master-0

αžšαž„αŸ‹αž…αžΆαŸ† Redis αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžŠαŸ’αž‹ Running.

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ–

kubectl apply -f go-app.yaml

//output
deployment.apps/go-prom-app created
service/go-prom-app-service created

αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ–

kubectl get pods -l=app=go-prom-app

αžšαž„αŸ‹αž…αžΆαŸ† Redis αž…αžΌαž›αžšαžŠαŸ’αž‹ Running.

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Prometheus

Prometheus manifest αž”αŸ’αžšαžΎ αž€αžΆαžšαžšαž€αžƒαžΎαž‰αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Kubernetes αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Prometheus. αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžšαž€αžƒαžΎαž‰αžαžΆαž˜αžœαž“αŸ’αžαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ pods αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ’αž›αžΆαž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

kubernetes_sd_configs:
   - role: service
   relabel_configs:
   - source_labels: [__meta_kubernetes_service_label_run]
     regex: go-prom-app-service
     action: keep

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ–

kubectl apply -f prometheus.yaml

//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created

αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ–

kubectl get pods -l=app=prometheus-server

αžšαž„αŸ‹αž…αžΆαŸ† Prometheus αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžŠαŸ’αž‹ Running.

αž”αŸ’αžšαžΎ kubectl port-forward αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ Prometheus (αž¬αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ API) αž“αŸ… http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· KEDA

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš KEDAαŸ–

KEDA_POD_NAME=$(kubectl get pods -n keda 
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda

αž›αž‘αŸ’αž’αž•αž›αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with 
namespace default and name keda-hpa-go-prom-app"

αž–αž·αž“αž·αžαŸ’αž™αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ minReplicaCount αžŸαŸ’αž˜αžΎ αŸ‘αŸ–

kubectl get pods -l=app=go-prom-app

αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆαž’αž“αž’αžΆαž“ HPA αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ–

kubectl get hpa

αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αžƒαžΎαž‰αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž‡αžΆαŸ–

NAME                   REFERENCE                TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (avg)   1         10        1          45s

αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžαž—αžΆαž–αŸ– αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎαž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹ REST αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

kubectl port-forward service/go-prom-app-service 8080

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Go αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ http://localhost:8080. αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ:

curl http://localhost:8080/test

αž›αž‘αŸ’αž’αž•αž›αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Access count 1

αž“αŸ…αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡αž€αŸαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž› Redis αž•αž„αžŠαŸ‚αžšαŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αž‚αž“αŸ’αž›αžΉαŸ‡αž“αŸ„αŸ‡αŸ” access_count αž€αžΎαž“αž‘αžΎαž„αžŠαž›αŸ‹ αŸ‘αŸ–

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"

αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαžαž˜αŸ’αž›αŸƒαž˜αŸ‰αŸ‚αžαŸ’αžšαž‚αžΊ http_requests αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆ:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1

αž•αŸ’αž‘αž»αž€αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ ធេ - αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž”αž“αŸ’αž‘αž»αž€αŸ–

curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64 
&& chmod a+x hey

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž‘αžΆαž‰αž™αž€αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Linux ឬ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Windows.

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαŸ–

./hey http://localhost:8080/test

αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαž…αŸ†αž“αž½αž“ 200 αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹ Prometheus αž€αŸαžŠαžΌαž…αž‡αžΆ Redis αŸ”

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201

αž’αŸ’αžœαžΎαž±αŸ’αž™αžαž˜αŸ’αž›αŸƒαž“αŸƒαž˜αŸ‰αŸ‚αžαŸ’αžšαž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ (αžαŸ’αžšαž‘αž”αŸ‹αžŠαŸ„αž™αžŸαŸ†αžŽαž½αžš PromQL)αŸ–

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž›αž‘αŸ’αž’αž•αž›αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ 1,686057971014493 αž“αž·αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› value. αž“αŸαŸ‡αž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαž€αž˜αŸ’αžšαž·αžαžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αž‚αžΊ 3 αŸ”

αž•αŸ’αž‘αž»αž€αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“!

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αžΈαž™αžαŸ’αž˜αžΈ αžŸαžΌαž˜αžαžΆαž˜αžŠαžΆαž“αž…αŸ†αž“αž½αž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ podsαŸ–

kubectl get pods -l=app=go-prom-app -w

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαž“αž”αž“αŸ’αž‘αž»αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

./hey -n 2000 http://localhost:8080/test

αž˜αž½αž™αžŸαž“αŸ’αž‘αž»αŸ‡αž€αŸ’αžšαŸ„αž™αž˜αž€ αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰ HPA αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš pods αžαŸ’αž˜αžΈαŸ” αž–αž·αž“αž·αžαŸ’αž™ HPA αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆαŸ–

kubectl get hpa
NAME                   REFERENCE                TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   1830m/3 (avg)   1         10        6          4m22s

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

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'

αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαž

//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server

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

KEDA αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Kubernetes αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· (αž‘αŸ…/αž–αžΈαžŸαžΌαž“αŸ’αž™) αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž˜αŸ‰αŸ‚αžαŸ’αžšαžαžΆαž„αž€αŸ’αžšαŸ…αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹ Prometheus αž”αŸ’αžšαžœαŸ‚αž„αž‡αž½αžšαž€αŸ’αž“αž»αž„ Redis αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž’αžΆαž“αž”αž‘ KafkaαŸ”

KEDA αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αž–αžαžΆαž„αž€αŸ’αžšαŸ… αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžšαž„αŸ’αžœαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαžαžΆαž˜αžšαž™αŸˆ Metrics Server αž‘αŸ…αž€αžΆαž“αŸ‹ Horizontal Pod AutoscalerαŸ”

αžŸαžΌαž˜αžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’!

αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αžΆαž“αŸ–

  1. αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αž αž“αž·αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžš αž“αž·αž„ Kubernetes αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜.
  2. αž§αž”αž€αžšαžŽαŸαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ 90+ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ KubernetesαŸ– αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž…αŸ’αžšαžΎαž“αž‘αŸ€αž.
  3. αž”αŸ‰αž»αžŸαŸ’αžαž·αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž‡αž»αŸ†αžœαž·αž‰ Kubernetes αž“αŸ…αž€αŸ’αž“αž»αž„ Telegram.

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

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