{"id":393065,"date":"2024-06-29T10:47:28","date_gmt":"2024-06-29T10:47:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=393065"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=393065","title":{"rendered":"<span>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Kubernetes \u0441 KEDA (\u0431\u0435\u0437 Prometheus)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 <\/em><a href=\"https:\/\/habr.com\/en\/company\/mailru\/blog\/515114\/\" rel=\"noopener noreferrer nofollow\"><em>\u0431\u044b\u043b<\/em><\/a><em> \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e <abbr title=\"Kubernetes Event-driven Autoscaling\">KEDA<\/abbr>. \u0412 \u043d\u0435\u0439 \u0430\u0432\u0442\u043e\u0440 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043e \u0442\u043e\u043c \u043a\u0430\u043a KEDA \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 Prometheus, \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0441 Redis, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u0433\u043e \u0436\u0435 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/em><\/p>\n<p><em>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0438\u043c. \u0412\u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 KEDA \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442. Prometheus \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/em><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e Kubernetes \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e stateless-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041e\u0441\u043e\u0431\u043e <a href=\"https:\/\/habr.com\/en\/company\/flant\/blog\/549040\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0431\u044f\u0442\u0430<\/a> \u0434\u0430\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0443\u0431\u0435\u0440\u0435, \u0430 \u0441\u0430\u043c\u044b\u0435 \u0441\u043c\u0435\u043b\u044b\u0435 \u0434\u0430\u0436\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435. \u041d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0442\u0438\u043f\u0430 RDS \u0438\u043b\u0438 \u0436\u0435 \u0411\u0414 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 Kubernetes, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043b-\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 AWS SQS \u0438\u043b\u0438 Kafka, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0432 PostgreSQL\/MySQL\/\u0438 \u0442.\u0434) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cloud.google.com\/kubernetes-engine\/docs\/concepts\/custom-and-external-metrics#external_metrics\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0435\u0448\u043d\u0438\u0435 (external) \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/a>. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a \u0432 Prometheus, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u0432 \u043f\u0440\u043e\u043c\u0435.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, KEDA \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u0432 Prometheus. \u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e CRD-\u0448\u0435\u043a, \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u044f\u043c\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0436\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/39c\/322\/033\/39c322033c8e0230a051055faef69e43.png\" alt=\"\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 KEDA, \u0432\u0437\u044f\u0442\u043e \u043e\u0442\u0441\u044e\u0434\u0430: https:\/\/www.codit.eu\/blog\/exploring-kubernetes-based-event-driven-autoscaling-keda\/\" title=\"\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 KEDA, \u0432\u0437\u044f\u0442\u043e \u043e\u0442\u0441\u044e\u0434\u0430: https:\/\/www.codit.eu\/blog\/exploring-kubernetes-based-event-driven-autoscaling-keda\/\" width=\"768\" height=\"659\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/39c\/322\/033\/39c322033c8e0230a051055faef69e43.png\"\/><figcaption>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 KEDA, \u0432\u0437\u044f\u0442\u043e \u043e\u0442\u0441\u044e\u0434\u0430: https:\/\/www.codit.eu\/blog\/exploring-kubernetes-based-event-driven-autoscaling-keda\/<\/figcaption><\/figure>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 KEDA<\/h3>\n<p><em>\u042f \u043f\u0440\u043e\u0432\u043e\u0436\u0443 \u0441\u0432\u043e\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430 macOS, \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Docker for Mac. \u041c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u043b\u044e\u0431\u043e\u0439 \u043a\u0443\u0431\u0435\u0440 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442.<\/em><\/p>\n<p><a href=\"https:\/\/keda.sh\/docs\/2.3\/deploy\/#install\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/a> KEDA \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e helm:<\/p>\n<pre><code class=\"bash\">$ helm repo add kedacore https:\/\/kedacore.github.io\/charts $ helm repo update $ helm install keda kedacore\/keda --namespace keda --create-namespace<\/code><\/pre>\n<p>\u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438 \u0447\u0430\u0440\u0442, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u0434 KEDA-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u043c\u0435\u0442\u0440\u0438\u043ac-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c:<\/p>\n<pre><code class=\"bash\">$ kubectl get po -n keda NAME                                               READY   STATUS    RESTARTS   AGE keda-operator-7fc5699d47-ng7rk                     1\/1     Running   0          75s keda-operator-metrics-apiserver-57fc85685f-zqnzr   1\/1     Running   0          75s  $ kubectl get apiservices v1beta1.external.metrics.k8s.io NAME                              SERVICE                                AVAILABLE   AGE v1beta1.external.metrics.k8s.io   keda\/keda-operator-metrics-apiserver   True        95s<\/code><\/pre>\n<p>\u0412\u0441\u0435, KEDA-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h3>\u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c &#171;Hello World&#187;<\/h3>\n<p>\u0423 Kubernetes \u0441\u0432\u043e\u0439 &#171;Hello World&#187;, \u044d\u0442\u043e <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/#creating-a-deployment\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442 nginx<\/a>, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0434\u0442\u0438 \u043f\u043e \u043a\u0430\u043d\u043e\u043d\u0430\u043c \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">$ kubectl create ns nginx-demo $ kubectl apply -n nginx-demo -f https:\/\/raw.githubusercontent.com\/kubernetes\/website\/main\/content\/en\/examples\/controllers\/nginx-deployment.yaml<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"bash\">$ kg po -n nginx-demo NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-2g24q   1\/1     Running   0          36s nginx-deployment-66b6c48dd5-67kgv   1\/1     Running   0          36s nginx-deployment-66b6c48dd5-fj4lq   1\/1     Running   0          36s<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0435 3 \u043f\u043e\u0434\u0430, \u043a\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 RabbitMQ.<\/p>\n<p><em>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 KEDA \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <\/em><a href=\"https:\/\/keda.sh\/docs\/2.3\/scalers\/\" rel=\"noopener noreferrer nofollow\"><em>36 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/em><\/a><em>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0432\u044b\u0431\u0440\u0430\u043b RabbitMQ, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u0437\u0430\u0445\u043e\u0442\u0435\u043b.<\/em><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 RabbitMQ<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0441\u0432\u043e\u0438 \u0442\u0435\u0441\u0442\u044b \u044f \u0434\u0435\u043b\u0430\u044e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Docker for Mac, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u043e\u0447\u0443 \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 RabbitMQ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 Kubernetes, \u0430, \u0441\u043a\u0430\u0436\u0435\u043c, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u044f \u0431\u0443\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 brew-\u043f\u0430\u043a\u0435\u0442. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u043c IP-\u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u043e\u043d \u043d\u0430\u043c \u0441\u043a\u043e\u0440\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"bash\">$ ipconfig getifaddr en0 192.168.2.101<\/code><\/pre>\n<p>\u0412\u0441\u0435, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c RabbitMQ \u0438 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">$ brew install rabbitmq $ RABBITMQ_NODE_IP_ADDRESS=0.0.0.0 \/usr\/local\/sbin\/rabbitmq-server    ...   ##  ##      RabbitMQ 3.8.19   ##  ##   ##########  Copyright (c) 2007-2021 VMware, Inc. or its affiliates.   ######  ##   ##########  Licensed under the MPL 2.0. Website: https:\/\/rabbitmq.com   ...   Starting broker... completed with 6 plugins.<\/code><\/pre>\n<p>\u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 127.0.0.1 -u guest -p guest \\     list connections No items<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c <code>guest<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 127.0.0.1, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043a\u0430\u0436\u0435\u043c (<code>demo<\/code>\/<code>demo<\/code>), \u043d\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c (<code>demo_queue<\/code>) \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare user name=demo password=demo tags=administrator user declared  $ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare permission vhost=\/ user=demo configure=\".*\" write=\".*\" read=\".*\" permission declared  $ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare queue name=demo_queue queue declared<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e &#171;\u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443&#187; IP-\u0430\u0434\u0440\u0435\u0441\u0443 \u043a \u043a\u0440\u043e\u043b\u0438\u043a\u0443:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 0        | +------------+----------+<\/code><\/pre>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e YAML<\/h3>\n<p>RabbitMQ \u0433\u043e\u0442\u043e\u0432, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 KEDA, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><code>Secret<\/code> \u2014 \u0432 \u043d\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a RabbitMQ, \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435: <code>amqp:\/\/demo:demo@192.168.2.101:5672\/<\/code><\/p>\n<\/li>\n<li>\n<p><code>TriggerAuthentication<\/code> \u2014 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0432\u044b\u0448\u0435<\/p>\n<\/li>\n<li>\n<p><code>ScaledObject<\/code> \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 <a href=\"https:\/\/keda.sh\/docs\/2.3\/concepts\/scaling-deployments\/#scaledobject-spec\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0435\u043f\u043b\u043e\u0438\u043c:<\/p>\n<pre><code class=\"yaml\">$ cat &lt;&lt;EOF | kubectl apply -n nginx-demo -f - --- apiVersion: v1 kind: Secret metadata:   name: keda-rabbitmq-secret data:   host: YW1xcDovL2RlbW86ZGVtb0AxOTIuMTY4LjIuMTAxOjU2NzIv # echo -n amqp:\/\/demo:demo@192.168.2.101:5672\/ | base64 --- apiVersion: keda.sh\/v1alpha1 kind: TriggerAuthentication metadata:   name: keda-trigger-auth-rabbitmq-conn spec:   secretTargetRef:     - parameter: host       name: keda-rabbitmq-secret # \u0418\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430       key: host --- apiVersion: keda.sh\/v1alpha1 kind: ScaledObject metadata:   name: rabbitmq-scaledobject spec:   scaleTargetRef:     name: nginx-deployment # \u0418\u043c\u044f nginx-\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c   minReplicaCount: 1       # \u041c\u0435\u043d\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c   maxReplicaCount: 5       # \u0410 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u044f\u0442\u0438 \u0442\u043e\u0436\u0435   pollingInterval: 10      # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439   cooldownPeriod:  120     # \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0430\u0443\u043d\u0441\u043a\u0435\u0439\u043b\u0430   triggers:   - type: rabbitmq     metadata:       protocol: amqp       queueName: demo_queue # \u041d\u0430\u0448\u0430 \u0434\u0435\u043c\u043e-\u043e\u0447\u0435\u0440\u0435\u0434\u044c       mode: QueueLength       value: \"3\" # \u0415\u0441\u043b\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0442\u0440\u0438 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434     authenticationRef:       name: keda-trigger-auth-rabbitmq-conn EOF<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"bash\">$ kubectl get scaledobject                       NAME                    SCALETARGETKIND      SCALETARGETNAME    MIN   MAX   TRIGGERS   AUTHENTICATION                    READY   ACTIVE   AGE rabbitmq-scaledobject   apps\/v1.Deployment   nginx-deployment   1     5     rabbitmq   keda-trigger-auth-rabbitmq-conn   True    False    14m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   0          3m46s  $ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   0\/3 (avg)   1         5         1          12m<\/code><\/pre>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c 5 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043d\u0430\u0448\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432 RabbitMQ:<\/p>\n<pre><code class=\"bash\">$ for i in {1..5}; do     \/usr\/local\/sbin\/rabbitmqadmin --host 192.168.2.101 -u demo -p demo \\         publish exchange=amq.default routing_key=demo_queue payload=\"message ${i}\" done  $ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 5        | +------------+----------+<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0435\u043c 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u043a\u0430 KEDA \u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u043e\u0434\u044b (\u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c 2 \u043f\u043e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u0435\u0439\u043b\u0438\u043c\u0441\u044f \u043f\u043e 1 \u043f\u043e\u0434\u0443, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 3 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438):<\/p>\n<pre><code class=\"bash\">$ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   5\/3 (avg)   1         5         1          22m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   0          14m nginx-deployment-66b6c48dd5-2d4w2   1\/1     Running   0          66s<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0431\u0430\u0432\u0438\u043c \u0433\u0430\u0437\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 7 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<pre><code class=\"bash\">$ for i in {6..12}; do     \/usr\/local\/sbin\/rabbitmqadmin --host 192.168.2.101 -u demo -p demo \\         publish exchange=amq.default routing_key=demo_queue payload=\"message ${i}\" done  $ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 12       | +------------+----------+<\/code><\/pre>\n<p>12 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e \u0438\u0434\u0435\u0435 \u0443\u0436\u0435 4 \u043f\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"bash\">$ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   12\/3 (avg)  1         5         2          24m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   1          17m nginx-deployment-66b6c48dd5-78d54   1\/1     Running   0          38s nginx-deployment-66b6c48dd5-jxtr8   1\/1     Running   0          38s nginx-deployment-66b6c48dd5-sl4p8   1\/1     Running   0          38s<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0438\u0441\u0442\u0438\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 1 \u043f\u043e\u0434):<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     purge queue name=demo_queue queue purged  $ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 0        | +------------+----------+  $ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   0\/3 (avg)   1         5         1          28h  $ kubectl get po  NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   0          20m<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043d\u0438\u0437, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u041f\u0440\u0438\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"bash\">$ helm uninstall keda -n keda $ kubectl delete ns keda $ kubectl delete ns nginx-demo<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, Prometheus \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f, \u0432\u0441\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 RabbitMQ, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043f\u043b\u043e\u044f \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f KEDA \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442.<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/kedacore\/keda\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 GitHub<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/keda.sh\/docs\/2.3\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f KEDA<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/kedacore\/samples\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/569760\/\"> https:\/\/habr.com\/ru\/articles\/569760\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 <\/em><a href=\"https:\/\/habr.com\/en\/company\/mailru\/blog\/515114\/\" rel=\"noopener noreferrer nofollow\"><em>\u0431\u044b\u043b<\/em><\/a><em> \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e <abbr title=\"Kubernetes Event-driven Autoscaling\">KEDA<\/abbr>. \u0412 \u043d\u0435\u0439 \u0430\u0432\u0442\u043e\u0440 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043e \u0442\u043e\u043c \u043a\u0430\u043a KEDA \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 Prometheus, \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0441 Redis, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u0433\u043e \u0436\u0435 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/em><\/p>\n<p><em>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0438\u043c. \u0412\u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 KEDA \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442. Prometheus \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/em><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e Kubernetes \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e stateless-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041e\u0441\u043e\u0431\u043e <a href=\"https:\/\/habr.com\/en\/company\/flant\/blog\/549040\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0431\u044f\u0442\u0430<\/a> \u0434\u0430\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0443\u0431\u0435\u0440\u0435, \u0430 \u0441\u0430\u043c\u044b\u0435 \u0441\u043c\u0435\u043b\u044b\u0435 \u0434\u0430\u0436\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435. \u041d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0442\u0438\u043f\u0430 RDS \u0438\u043b\u0438 \u0436\u0435 \u0411\u0414 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 Kubernetes, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043b-\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 AWS SQS \u0438\u043b\u0438 Kafka, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0432 PostgreSQL\/MySQL\/\u0438 \u0442.\u0434) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cloud.google.com\/kubernetes-engine\/docs\/concepts\/custom-and-external-metrics#external_metrics\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0435\u0448\u043d\u0438\u0435 (external) \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/a>. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a \u0432 Prometheus, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u0432 \u043f\u0440\u043e\u043c\u0435.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, KEDA \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u0432 Prometheus. \u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e CRD-\u0448\u0435\u043a, \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u044f\u043c\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0436\u0443.<\/p>\n<figure class=\"full-width\"><figcaption>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 KEDA, \u0432\u0437\u044f\u0442\u043e \u043e\u0442\u0441\u044e\u0434\u0430: https:\/\/www.codit.eu\/blog\/exploring-kubernetes-based-event-driven-autoscaling-keda\/<\/figcaption><\/figure>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 KEDA<\/h3>\n<p><em>\u042f \u043f\u0440\u043e\u0432\u043e\u0436\u0443 \u0441\u0432\u043e\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430 macOS, \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Docker for Mac. \u041c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u043b\u044e\u0431\u043e\u0439 \u043a\u0443\u0431\u0435\u0440 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442.<\/em><\/p>\n<p><a href=\"https:\/\/keda.sh\/docs\/2.3\/deploy\/#install\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/a> KEDA \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e helm:<\/p>\n<pre><code class=\"bash\">$ helm repo add kedacore https:\/\/kedacore.github.io\/charts $ helm repo update $ helm install keda kedacore\/keda --namespace keda --create-namespace<\/code><\/pre>\n<p>\u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438 \u0447\u0430\u0440\u0442, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u0434 KEDA-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u043c\u0435\u0442\u0440\u0438\u043ac-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c:<\/p>\n<pre><code class=\"bash\">$ kubectl get po -n keda NAME                                               READY   STATUS    RESTARTS   AGE keda-operator-7fc5699d47-ng7rk                     1\/1     Running   0          75s keda-operator-metrics-apiserver-57fc85685f-zqnzr   1\/1     Running   0          75s  $ kubectl get apiservices v1beta1.external.metrics.k8s.io NAME                              SERVICE                                AVAILABLE   AGE v1beta1.external.metrics.k8s.io   keda\/keda-operator-metrics-apiserver   True        95s<\/code><\/pre>\n<p>\u0412\u0441\u0435, KEDA-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h3>\u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c &#171;Hello World&#187;<\/h3>\n<p>\u0423 Kubernetes \u0441\u0432\u043e\u0439 &#171;Hello World&#187;, \u044d\u0442\u043e <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/#creating-a-deployment\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442 nginx<\/a>, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0434\u0442\u0438 \u043f\u043e \u043a\u0430\u043d\u043e\u043d\u0430\u043c \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">$ kubectl create ns nginx-demo $ kubectl apply -n nginx-demo -f https:\/\/raw.githubusercontent.com\/kubernetes\/website\/main\/content\/en\/examples\/controllers\/nginx-deployment.yaml<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"bash\">$ kg po -n nginx-demo NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-2g24q   1\/1     Running   0          36s nginx-deployment-66b6c48dd5-67kgv   1\/1     Running   0          36s nginx-deployment-66b6c48dd5-fj4lq   1\/1     Running   0          36s<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0435 3 \u043f\u043e\u0434\u0430, \u043a\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 RabbitMQ.<\/p>\n<p><em>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 KEDA \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <\/em><a href=\"https:\/\/keda.sh\/docs\/2.3\/scalers\/\" rel=\"noopener noreferrer nofollow\"><em>36 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/em><\/a><em>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0432\u044b\u0431\u0440\u0430\u043b RabbitMQ, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u0437\u0430\u0445\u043e\u0442\u0435\u043b.<\/em><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 RabbitMQ<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0441\u0432\u043e\u0438 \u0442\u0435\u0441\u0442\u044b \u044f \u0434\u0435\u043b\u0430\u044e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Docker for Mac, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u043e\u0447\u0443 \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 RabbitMQ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 Kubernetes, \u0430, \u0441\u043a\u0430\u0436\u0435\u043c, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u044f \u0431\u0443\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 brew-\u043f\u0430\u043a\u0435\u0442. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u043c IP-\u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u043e\u043d \u043d\u0430\u043c \u0441\u043a\u043e\u0440\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"bash\">$ ipconfig getifaddr en0 192.168.2.101<\/code><\/pre>\n<p>\u0412\u0441\u0435, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c RabbitMQ \u0438 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">$ brew install rabbitmq $ RABBITMQ_NODE_IP_ADDRESS=0.0.0.0 \/usr\/local\/sbin\/rabbitmq-server    ...   ##  ##      RabbitMQ 3.8.19   ##  ##   ##########  Copyright (c) 2007-2021 VMware, Inc. or its affiliates.   ######  ##   ##########  Licensed under the MPL 2.0. Website: https:\/\/rabbitmq.com   ...   Starting broker... completed with 6 plugins.<\/code><\/pre>\n<p>\u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 127.0.0.1 -u guest -p guest \\     list connections No items<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c <code>guest<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 127.0.0.1, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043a\u0430\u0436\u0435\u043c (<code>demo<\/code>\/<code>demo<\/code>), \u043d\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c (<code>demo_queue<\/code>) \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare user name=demo password=demo tags=administrator user declared  $ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare permission vhost=\/ user=demo configure=\".*\" write=\".*\" read=\".*\" permission declared  $ \/usr\/local\/sbin\/rabbitmqadmin --host 127.0.0.1 -u guest -p guest \\     declare queue name=demo_queue queue declared<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e &#171;\u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443&#187; IP-\u0430\u0434\u0440\u0435\u0441\u0443 \u043a \u043a\u0440\u043e\u043b\u0438\u043a\u0443:<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 0        | +------------+----------+<\/code><\/pre>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e YAML<\/h3>\n<p>RabbitMQ \u0433\u043e\u0442\u043e\u0432, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 KEDA, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><code>Secret<\/code> \u2014 \u0432 \u043d\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a RabbitMQ, \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435: <code>amqp:\/\/demo:demo@192.168.2.101:5672\/<\/code><\/p>\n<\/li>\n<li>\n<p><code>TriggerAuthentication<\/code> \u2014 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0432\u044b\u0448\u0435<\/p>\n<\/li>\n<li>\n<p><code>ScaledObject<\/code> \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 <a href=\"https:\/\/keda.sh\/docs\/2.3\/concepts\/scaling-deployments\/#scaledobject-spec\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0435\u043f\u043b\u043e\u0438\u043c:<\/p>\n<pre><code class=\"yaml\">$ cat &lt;&lt;EOF | kubectl apply -n nginx-demo -f - --- apiVersion: v1 kind: Secret metadata:   name: keda-rabbitmq-secret data:   host: YW1xcDovL2RlbW86ZGVtb0AxOTIuMTY4LjIuMTAxOjU2NzIv # echo -n amqp:\/\/demo:demo@192.168.2.101:5672\/ | base64 --- apiVersion: keda.sh\/v1alpha1 kind: TriggerAuthentication metadata:   name: keda-trigger-auth-rabbitmq-conn spec:   secretTargetRef:     - parameter: host       name: keda-rabbitmq-secret # \u0418\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430       key: host --- apiVersion: keda.sh\/v1alpha1 kind: ScaledObject metadata:   name: rabbitmq-scaledobject spec:   scaleTargetRef:     name: nginx-deployment # \u0418\u043c\u044f nginx-\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c   minReplicaCount: 1       # \u041c\u0435\u043d\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c   maxReplicaCount: 5       # \u0410 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u044f\u0442\u0438 \u0442\u043e\u0436\u0435   pollingInterval: 10      # \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439   cooldownPeriod:  120     # \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0430\u0443\u043d\u0441\u043a\u0435\u0439\u043b\u0430   triggers:   - type: rabbitmq     metadata:       protocol: amqp       queueName: demo_queue # \u041d\u0430\u0448\u0430 \u0434\u0435\u043c\u043e-\u043e\u0447\u0435\u0440\u0435\u0434\u044c       mode: QueueLength       value: \"3\" # \u0415\u0441\u043b\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0442\u0440\u0438 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434     authenticationRef:       name: keda-trigger-auth-rabbitmq-conn EOF<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"bash\">$ kubectl get scaledobject                       NAME                    SCALETARGETKIND      SCALETARGETNAME    MIN   MAX   TRIGGERS   AUTHENTICATION                    READY   ACTIVE   AGE rabbitmq-scaledobject   apps\/v1.Deployment   nginx-deployment   1     5     rabbitmq   keda-trigger-auth-rabbitmq-conn   True    False    14m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   0          3m46s  $ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   0\/3 (avg)   1         5         1          12m<\/code><\/pre>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c 5 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043d\u0430\u0448\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432 RabbitMQ:<\/p>\n<pre><code class=\"bash\">$ for i in {1..5}; do     \/usr\/local\/sbin\/rabbitmqadmin --host 192.168.2.101 -u demo -p demo \\         publish exchange=amq.default routing_key=demo_queue payload=\"message ${i}\" done  $ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 5        | +------------+----------+<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0435\u043c 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u043a\u0430 KEDA \u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u043e\u0434\u044b (\u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c 2 \u043f\u043e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u0435\u0439\u043b\u0438\u043c\u0441\u044f \u043f\u043e 1 \u043f\u043e\u0434\u0443, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 3 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438):<\/p>\n<pre><code class=\"bash\">$ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   5\/3 (avg)   1         5         1          22m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   0          14m nginx-deployment-66b6c48dd5-2d4w2   1\/1     Running   0          66s<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0431\u0430\u0432\u0438\u043c \u0433\u0430\u0437\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 7 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<pre><code class=\"bash\">$ for i in {6..12}; do     \/usr\/local\/sbin\/rabbitmqadmin --host 192.168.2.101 -u demo -p demo \\         publish exchange=amq.default routing_key=demo_queue payload=\"message ${i}\" done  $ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     list queues +------------+----------+ |    name    | messages | +------------+----------+ | demo_queue | 12       | +------------+----------+<\/code><\/pre>\n<p>12 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e \u0438\u0434\u0435\u0435 \u0443\u0436\u0435 4 \u043f\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"bash\">$ kubectl get hpa NAME                             REFERENCE                     TARGETS     MINPODS   MAXPODS   REPLICAS   AGE keda-hpa-rabbitmq-scaledobject   Deployment\/nginx-deployment   12\/3 (avg)  1         5         2          24m  $ kubectl get po NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-66b6c48dd5-24qp7   1\/1     Running   1          17m nginx-deployment-66b6c48dd5-78d54   1\/1     Running   0          38s nginx-deployment-66b6c48dd5-jxtr8   1\/1     Running   0          38s nginx-deployment-66b6c48dd5-sl4p8   1\/1     Running   0          38s<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0438\u0441\u0442\u0438\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 1 \u043f\u043e\u0434):<\/p>\n<pre><code class=\"bash\">$ \/usr\/local\/sbin\/rabbitmqadmin -H 192.168.2.101 -u demo -p demo \\     <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-393065","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=393065"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393065\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=393065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=393065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=393065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}