{"id":486361,"date":"2026-07-06T13:19:20","date_gmt":"2026-07-06T13:19:20","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=486361"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=486361","title":{"rendered":"KEDA \u043a\u0430\u043a \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b: scale-to-zero, \u043b\u0438\u043c\u0438\u0442\u044b \u0440\u0435\u043f\u043b\u0438\u043a \u0438 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433 \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u0432 Kubernetes"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u0430\u0447\u0438\u043d\u0441\u043a\u0438\u0439, \u044f Head of Ops \u0432 Rocketdata. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443 KEDA \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f Kubernetes-workloads \u0441 \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439: \u043e\u0447\u0435\u0440\u0435\u0434\u044f\u043c\u0438, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u043c\u0438, HTTP-\u043f\u0438\u043a\u0430\u043c\u0438 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0435 \u043f\u0440\u043e \u00ab\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438\u00bb, \u0430 \u043f\u0440\u043e production-\u043f\u043e\u0434\u0445\u043e\u0434: \u0433\u0434\u0435 KEDA \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u043f\u0438\u043b\u043e\u0442\u0430 \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u0438 \u0440\u0430\u0441\u043a\u0430\u0442\u043a\u0435.<\/p>\n<p>\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u00ab\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 FinOps\u00bb \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0447\u0435\u0442\u044b, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u043d\u043e \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u0435.<\/p>\n<h2>TL;DR<\/h2>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> HPA \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043f\u043e CPU\/Memory, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442 18 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u0438 \u0436\u0433\u0443\u0442 \u0431\u044e\u0434\u0436\u0435\u0442, \u043f\u043e\u043a\u0430 \u0436\u0434\u0443\u0442 \u0440\u0435\u0434\u043a\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> KEDA \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u044b \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u2014 \u0434\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, cron, Prometheus-\u043c\u0435\u0442\u0440\u0438\u043a\u0438, HTTP-\u0442\u0440\u0430\u0444\u0438\u043a. \u0421\u0435\u0440\u0432\u0438\u0441 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435.<\/p>\n<p><strong>FinOps-\u043f\u0440\u043e\u0444\u0438\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Scale-to-zero:<\/strong> 0 \u043f\u043e\u0434\u043e\u0432 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0442 \u2192 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043d\u0430 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435<\/p>\n<\/li>\n<li>\n<p><strong>maxReplicaCount:<\/strong> \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u043d\u0430<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f 40\u201370%<\/strong> \u043d\u0430 workloads \u0441 \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 (\u0432\u043e\u0440\u043a\u0435\u0440\u044b, batch-\u0437\u0430\u0434\u0430\u0447\u0438, dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c KEDA \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 FinOps-\u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b \u0434\u043b\u044f Kubernetes: \u0433\u0434\u0435 HPA \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d ScaledObject, \u043a\u0430\u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u043a scale-to-zero, \u043a\u0430\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 maxReplicaCount \u0438 \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e \u043f\u0438\u043b\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0446\u0438\u0444\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0412 Kubernetes \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0443\u0442\u044c \u043a \u043c\u044b\u0441\u043b\u0438, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0440\u0435\u0448\u0435\u043d\u0430. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 HPA \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 CPU \u0438 \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u043e \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0436\u0438\u0432\u0435\u0442 \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435: \u0436\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u043f\u0438\u043a\u0438 HTTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0430\u0447\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f FinOps \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0441\u043b\u043e\u0439. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u044b \u0438 \u043d\u043e\u0434\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u00ab\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u00bb, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0437\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435. KEDA \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u0438\u0436\u0435 \u043a \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435: \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c, \u043e\u0447\u0435\u0440\u0435\u0434\u044f\u043c, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, HTTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438 ownership. \u041d\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0439 \u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0413\u0434\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e HPA \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442<\/h2>\n<p>Horizontal Pod Autoscaler \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u044b\u00bb. \u0412 \u0442\u0438\u043f\u043e\u0432\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e CPU \u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0432\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u0442\u044c \u0432\u043e\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u044c CPU, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0436\u0434\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e API. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0436\u0435 \u0440\u0430\u0441\u0442\u0435\u0442, \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, SLA \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f HPA \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e:<\/p>\n<pre><code>CPU: 2%Memory: stableReplicas: 2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>Queue length: 3 250 messagesOldest message age: 18 minutesSLA: at risk<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e CPU, \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0430\u0437\u0434\u044b\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0437\u0435\u0440\u0432 \u043f\u043e\u0434\u043e\u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043b\u0430\u0442\u0438\u0442 \u0437\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 over-provisioning: \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0437\u0430\u043d\u044f\u0442\u044b, \u0441\u0447\u0435\u0442 \u0440\u0430\u0441\u0442\u0435\u0442, \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0442.<\/p>\n<h2>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 KEDA<\/h2>\n<p>KEDA, Kubernetes Event-driven Autoscaling, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 Kubernetes \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: KEDA \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 HPA, \u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0435\u0433\u043e. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 Kubernetes \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. <a href=\"https:\/\/keda.sh\/\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f KEDA<\/a>.<\/p>\n<p>KEDA \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (RabbitMQ, Kafka, SQS, Azure Service Bus);<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f (cron);<\/p>\n<\/li>\n<li>\n<p>\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (PostgreSQL, MySQL, Redis);<\/p>\n<\/li>\n<li>\n<p>HTTP-\u0442\u0440\u0430\u0444\u0438\u043a (\u0447\u0435\u0440\u0435\u0437 HTTP Add-on);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0437 Prometheus;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043d\u0435\u0448\u043d\u0438\u0435 event source \u0447\u0435\u0440\u0435\u0437 60+ \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438<\/h3>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 RabbitMQ    \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 KEDA Scaler  \u2502\u2502 Queue: 150  \u2502         \u2502 polls every  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502 30 sec       \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 External     \u2502                        \u2502 Metrics API  \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 HPA decides  \u2502                        \u2502 150\/10 = 15  \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 Deployment   \u2502                        \u2502 scales to 15 \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>KEDA \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0432 Kubernetes \u0447\u0435\u0440\u0435\u0437 External Metrics API, \u0430 HPA \u0443\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043f\u043b\u0438\u043a. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 scaling \u0434\u043b\u044f Deployments, StatefulSets \u0438 Custom Resources \u0447\u0435\u0440\u0435\u0437 scale subresource. <a href=\"https:\/\/keda.sh\/docs\/2.20\/concepts\/scaling-deployments\/\">KEDA: Scaling Deployments, StatefulSets &amp; Custom Resources<\/a>.<\/p>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 KEDA \u0447\u0435\u0440\u0435\u0437 Helm<\/h2>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Helm \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">helm repo add kedacore https:\/\/kedacore.github.io\/chartshelm repo updatehelm install keda kedacore\/keda \\  --namespace keda \\  --create-namespace<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u044b \u0432 namespace <code>keda<\/code>:<\/p>\n<pre><code class=\"bash\">kubectl get pods -n keda<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Helm-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c chart \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 namespace. <a href=\"https:\/\/keda.sh\/docs\/2.20\/deploy\/\">KEDA: Deploying KEDA<\/a>.<\/p>\n<h2>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 ScaledObject<\/h2>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f workload \u2014 \u044d\u0442\u043e <code>ScaledObject<\/code>.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: example-scalerspec:  scaleTargetRef:    name: example-deployment  minReplicaCount: 0  maxReplicaCount: 10  pollingInterval: 30  cooldownPeriod: 300  triggers:    - type: ...      metadata:        ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><strong>scaleTargetRef<\/strong> &#8212; \u0426\u0435\u043b\u0435\u0432\u043e\u0439 Deployment, StatefulSet \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 KEDA \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>minReplicaCount<\/strong> &#8212; \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a. \u0414\u043b\u044f scale-to-zero \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 0.<\/p>\n<\/li>\n<li>\n<p><strong>maxReplicaCount<\/strong> &#8212; \u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0435\u043f\u043b\u0438\u043a. \u042d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0438\u043c\u0438\u0442 \u0440\u043e\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>pollingInterval<\/strong> &#8212; \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e KEDA \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445).<\/p>\n<\/li>\n<li>\n<p><strong>cooldownPeriod<\/strong> &#8212; \u041f\u0430\u0443\u0437\u0430 \u043f\u0435\u0440\u0435\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a 0 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>triggers<\/strong> &#8212; \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <code>ScaledObject<\/code>, <code>pollingInterval<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 30 \u0441\u0435\u043a\u0443\u043d\u0434, <code>cooldownPeriod<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 300 \u0441\u0435\u043a\u0443\u043d\u0434, <code>minReplicaCount<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0, \u0430 <code>maxReplicaCount<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 100. <a href=\"https:\/\/keda.sh\/docs\/2.20\/reference\/scaledobject-spec\/\">KEDA: ScaledObject specification<\/a>.<\/p>\n<h2>Scale-to-zero \u043a\u0430\u043a FinOps-\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430<\/h2>\n<p>Scale-to-zero \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 KEDA \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f FinOps.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435\u0442, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0438\u043b\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0435\u0442, KEDA \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e 0. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u00ab\u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f\u00bb.<\/p>\n<p>\u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0435\u0440\u0432:<\/p>\n<pre><code>min replicas: 2traffic: 0queue: 0cost: continues<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 scale-to-zero \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<pre><code>min replicas: 0traffic: 0queue: 0cost for workload compute: reduced<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u0431\u0435\u0449\u0430\u0442\u044c. Scale-to-zero \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0447\u0435\u0442 \u0437\u0430 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u044b\u043c. Control plane, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u043e\u0434\u044b, \u0434\u0438\u0441\u043a\u0438, \u043b\u043e\u0433\u0438, \u0441\u0435\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442\u044c \u0434\u0435\u043d\u0435\u0433. \u041d\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e workload \u044d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439.<\/p>\n<p>FinOps-\u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043d\u0435 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0430 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u2014 \u0432\u043e\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u044b \u0438\u0437 RabbitMQ.<\/p>\n<h3>\u0414\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA<\/h3>\n<p><strong>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>Deployment \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043f\u043b\u0438\u043a: 5<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b: 24\/7<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u043a\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430: \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0434\u043d\u0438 10:00\u201318:00<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e\u0447\u044c\u044e \u0438 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e: 5 \u0440\u0435\u043f\u043b\u0438\u043a \u00d7 24 \u0447\u0430\u0441\u0430 = <strong>120 pod-hours\/\u0434\u0435\u043d\u044c<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f CPU: <strong>8%<\/strong> (\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f <strong>~18 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c compute \u0434\u043b\u044f workload: <strong>~$180\/\u043c\u0435\u0441\u044f\u0446<\/strong> (\u0438\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 $0.05\/pod-hour)<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u043f\u043b\u0430\u0442\u0438\u043c \u0437\u0430 5 \u043f\u043e\u0434\u043e\u0432 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u043e, \u0445\u043e\u0442\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 6\u20138 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0434\u0435\u043d\u044c.<\/p>\n<h3>\u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA<\/h3>\n<p><strong>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:<\/strong><\/p>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: orders-worker-scalerspec:  scaleTargetRef:    name: orders-worker  minReplicaCount: 0  maxReplicaCount: 10  triggers:    - type: rabbitmq      metadata:        queueName: orders        mode: QueueLength        value: \"20\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>10:00\u201318:00 (\u043f\u0438\u043a):<\/strong> \u043e\u0447\u0435\u0440\u0435\u0434\u044c 150\u2013200 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2192 <strong>8\u201310 \u0440\u0435\u043f\u043b\u0438\u043a<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>18:00\u201322:00 (\u0441\u043f\u0430\u0434):<\/strong> \u043e\u0447\u0435\u0440\u0435\u0434\u044c 20\u201340 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2192 <strong>1\u20132 \u0440\u0435\u043f\u043b\u0438\u043a\u0438<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>22:00\u201310:00 + \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435:<\/strong> \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f \u2192 <strong>0 \u0440\u0435\u043f\u043b\u0438\u043a<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c: <strong>~40 pod-hours\/\u0434\u0435\u043d\u044c<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f CPU \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f: <strong>45\u201360%<\/strong> (\u043f\u043e\u0434\u044b \u0437\u0430\u043d\u044f\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u043e\u0439)<\/p>\n<\/li>\n<li>\n<p>Cold start \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: <strong>~12 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong><\/p>\n<\/li>\n<li>\n<p>SLA \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (5 \u043c\u0438\u043d\u0443\u0442): <strong>\u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c compute \u0434\u043b\u044f workload: <strong>~$60\/\u043c\u0435\u0441\u044f\u0446<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f: 67%<\/strong> \u043d\u0430 \u044d\u0442\u043e\u043c workload ($120\/\u043c\u0435\u0441\u044f\u0446)<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0440\u043e\u0441\u043b\u0430<\/strong> \u0441 8% \u0434\u043e 45\u201360%<\/p>\n<\/li>\n<li>\n<p><strong>SLA \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b<\/strong> \u2014 cold start \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u043c\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><strong>maxReplicaCount: 10<\/strong> \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u043f\u0440\u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f\u0445<\/p>\n<\/li>\n<\/ul>\n<h4>\u0413\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a<\/h4>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/1fa\/99e\/e96\/1fa99ee96862771560bc3659e1c3c097.png\" alt=\"\u0414\u043e KEDA: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 5, \u043f\u043e\u0441\u043b\u0435 KEDA: \u043f\u0438\u043b\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441 \u043f\u0438\u043a\u0430\u043c\u0438 \u0434\u043d\u0435\u043c \u0438 \u043d\u0443\u043b\u044f\u043c\u0438 \u043d\u043e\u0447\u044c\u044e\" title=\"\u0414\u043e KEDA: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 5, \u043f\u043e\u0441\u043b\u0435 KEDA: \u043f\u0438\u043b\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441 \u043f\u0438\u043a\u0430\u043c\u0438 \u0434\u043d\u0435\u043c \u0438 \u043d\u0443\u043b\u044f\u043c\u0438 \u043d\u043e\u0447\u044c\u044e\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/1fa\/99e\/e96\/1fa99ee96862771560bc3659e1c3c097.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/1fa\/99e\/e96\/1fa99ee96862771560bc3659e1c3c097.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u043e KEDA: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 5, \u043f\u043e\u0441\u043b\u0435 KEDA: \u043f\u0438\u043b\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441 \u043f\u0438\u043a\u0430\u043c\u0438 \u0434\u043d\u0435\u043c \u0438 \u043d\u0443\u043b\u044f\u043c\u0438 \u043d\u043e\u0447\u044c\u044e<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0442\u0438\u043f\u0438\u0447\u0435\u043d \u0434\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439, email-\u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a<\/p>\n<\/li>\n<li>\n<p>batch-\u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u0447\u0430\u0441\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>dev\/staging \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u21161. \u041e\u0447\u0435\u0440\u0435\u0434\u0438: \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0430 \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e<\/h2>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f KEDA \u2014 \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 RabbitMQ, Kafka, SQS \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c <code>orders-worker<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>orders<\/code>.<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438:<\/p>\n<pre><code>0 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 0 \u043f\u043e\u0434\u043e\u043210 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 1 \u043f\u043e\u0434100 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 10 \u043f\u043e\u0434\u043e\u0432\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0443\u0441\u0442\u0435\u043b\u0430 -&gt; \u043f\u043e\u0434\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f RabbitMQ \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c trigger <code>rabbitmq<\/code>. \u0412 \u0440\u0435\u0436\u0438\u043c\u0435 <code>QueueLength<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>value<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 10 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u043c <code>10<\/code>. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA \u0434\u043b\u044f RabbitMQ \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e <code>mode: QueueLength<\/code> \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0430 <code>value<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 threshold per instance. \u0422\u0430\u043c \u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440: \u043f\u0440\u0438 \u043f\u043e\u0440\u043e\u0433\u0435 10 \u0438 30 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u0441\u043a\u0435\u0439\u043b\u0435\u0440 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0434\u043e 3 \u043f\u043e\u0434\u043e\u0432. <a href=\"https:\/\/keda.sh\/docs\/2.20\/scalers\/rabbitmq-queue\/\">KEDA: RabbitMQ Queue scaler<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 credentials<\/summary>\n<div class=\"spoiler__content\">\n<p> Credentials \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a RabbitMQ \u043d\u0435\u043b\u044c\u0437\u044f \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u0432 YAML. <\/p>\n<p><strong>\u274c \u041f\u043b\u043e\u0445\u043e:<\/strong><\/p>\n<pre><code class=\"yaml\">metadata:  host: \"amqp:\/\/admin:password123@rabbitmq:5672\/\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u2705 \u0425\u043e\u0440\u043e\u0448\u043e \u2014 Kubernetes Secret:<\/strong><\/p>\n<pre><code class=\"yaml\">apiVersion: v1kind: Secretmetadata:  name: rabbitmq-connection  namespace: apptype: OpaquestringData:  host: amqp:\/\/user:password@rabbitmq.app.svc.cluster.local:5672\/---apiVersion: keda.sh\/v1alpha1kind: TriggerAuthenticationmetadata:  name: rabbitmq-auth  namespace: appspec:  secretTargetRef:    - parameter: host      name: rabbitmq-connection      key: host<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u2705\u2705 \u0415\u0449\u0435 \u043b\u0443\u0447\u0448\u0435 \u2014 External Secrets Operator:<\/strong><\/p>\n<p>\u0414\u043b\u044f production \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/external-secrets.io\/\">External Secrets Operator<\/a> \u0441 Vault, AWS Secrets Manager \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1kind: ExternalSecretmetadata:  name: rabbitmq-connection  namespace: appspec:  secretStoreRef:    name: vault-backend    kind: SecretStore  target:    name: rabbitmq-connection  data:    - secretKey: host      remoteRef:        key: prod\/rabbitmq        property: connection_string<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0420\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c credentials \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0438 YAML<\/p>\n<\/li>\n<li>\n<p>\u0410\u0443\u0434\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438 \u0432 Git<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 ScaledObject \u0434\u043b\u044f RabbitMQ<\/h4>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: orders-worker-rabbitmq-scaler  namespace: appspec:  scaleTargetRef:    name: orders-worker  minReplicaCount: 0  maxReplicaCount: 10  pollingInterval: 30  cooldownPeriod: 300  triggers:    - type: rabbitmq      metadata:        protocol: amqp        queueName: orders        mode: QueueLength        value: \"10\"      authenticationRef:        name: rabbitmq-auth<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438:<\/p>\n<ol>\n<li>\n<p><code>maxReplicaCount: 10<\/code> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u043e\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>minReplicaCount: 0<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 scale-to-zero<\/p>\n<\/li>\n<li>\n<p><code>value: \"10\"<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/p>\n<\/li>\n<li>\n<p><code>cooldownPeriod: 300<\/code> \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f FinOps \u044d\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u00ab\u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u0440\u0435\u0437\u0435\u0440\u0432\u00bb \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u043e.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u21162. \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0447\u044c<\/h2>\n<p>\u041d\u0435 \u0432\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430:<\/p>\n<ol>\n<li>\n<p>\u043d\u043e\u0447\u043d\u044b\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/p>\n<\/li>\n<li>\n<p>\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0447\u0430\u0441\u044b B2B-\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043d\u043e\u0447\u044c\u044e<\/p>\n<\/li>\n<li>\n<p>dev- \u0438 staging-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 <code>cron<\/code> scaler.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, B2B-\u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0434\u043d\u0438 \u0441 08:50 \u0434\u043e 19:00. \u0412 \u044d\u0442\u043e \u043e\u043a\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c 3 \u0440\u0435\u043f\u043b\u0438\u043a\u0438. \u0412\u043d\u0435 \u043e\u043a\u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u043e 0.<\/p>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: b2b-api-office-hours  namespace: appspec:  scaleTargetRef:    name: b2b-api  minReplicaCount: 0  maxReplicaCount: 5  cooldownPeriod: 300  triggers:    - type: cron      metadata:        timezone: Europe\/Moscow        start: \"50 8 * * 1-5\"        end: \"0 19 * * 1-5\"        desiredReplicas: \"3\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e 0 \u0432\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043e\u043a\u043d\u0430 KEDA \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <code>minReplicaCount: 0<\/code> \u0432 <code>ScaledObject<\/code> \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0447\u0435\u0440\u0435\u0437 <code>desiredReplicas<\/code>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 <code>cooldownPeriod<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0447\u0435\u0440\u0435\u0437 5 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 <code>end<\/code>. <a href=\"https:\/\/keda.sh\/docs\/2.20\/scalers\/cron\/\">KEDA: Cron scaler<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043f\u0438\u0441\u0430\u043b\u0438 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash# \/opt\/scripts\/scale-dev-env.shif [ $(date +%H) -ge 19 ] || [ $(date +%H) -lt 9 ]; then  kubectl scale deployment\/api --replicas=0 -n develse  kubectl scale deployment\/api --replicas=3 -n devfi<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 cron \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446?<\/strong> \u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0433\u043e\u0434\u0430\u043c\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f. \u0422\u043e\u0433\u0434\u0430 \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u0443\u0432\u043e\u043b\u0438\u043b\u0441\u044f 2 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0434\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f?<\/strong> \u041f\u043e\u0447\u0435\u043c\u0443 3 \u0440\u0435\u043f\u043b\u0438\u043a\u0438? \u041f\u043e\u0447\u0435\u043c\u0443 19:00? \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e\u0442 namespace?<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0434\u0435 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c?<\/strong> \u0421\u043a\u0440\u0438\u043f\u0442 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u0435 \u0432 Git.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0434\u0435 observability?<\/strong> \u0423\u043f\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043b\u0438 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u2014 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u043e\u044f\u0437\u043d\u044c \u0442\u0440\u043e\u0433\u0430\u0442\u044c:<\/strong> \u201c\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u043d\u0435 \u0442\u0440\u043e\u0436\u044c\u201d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 technical debt.<\/p>\n<\/li>\n<\/ul>\n<p>Cron Scaler \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e ownership, \u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u043f\u043e\u043d\u044f\u0442\u043d\u0443\u044e Kubernetes-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 Git<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 lifecycle \u0447\u0435\u0440\u0435\u0437 kubectl\/GitOps<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0432 Kubernetes Events<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 KEDA \u0432 Prometheus<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u21163. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c Prometheus<\/h2>\n<p>\u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 Prometheus.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c API \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (RPS):<\/p>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: api-rps-scaler  namespace: appspec:  scaleTargetRef:    name: api-service  minReplicaCount: 1  maxReplicaCount: 20  pollingInterval: 30  cooldownPeriod: 300  triggers:    - type: prometheus      metadata:        serverAddress: http:\/\/prometheus.monitoring.svc.cluster.local:9090        query: sum(rate(http_requests_total{deployment=\"api-service\"}[2m]))        threshold: \"100\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA, Prometheus scaler \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 workload \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a Prometheus. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c <code>query<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u0438\u043d scalar \u0438\u043b\u0438 vector single element response, \u0430 <code>threshold<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <a href=\"https:\/\/keda.sh\/docs\/2.20\/scalers\/prometheus\/\">KEDA: Prometheus scaler<\/a>.<\/p>\n<h3>\u0412\u0430\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 production<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0430\u043c\u0443 \u043c\u0435\u0442\u0440\u0438\u043a\u0443:<\/p>\n<ol>\n<li>\n<p><strong>Query \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/strong> \u2014 scalar \u0438\u043b\u0438 vector \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439<\/strong> \u2014 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u0432 \u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043a\u043d\u043e <\/strong><code><strong>rate<\/strong><\/code><strong> \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/strong> <\/p>\n<ul>\n<li>\n<p><code>[2m]<\/code> \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u0438\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>[5m]<\/code> \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Threshold \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0443<\/strong>, \u0430 \u043d\u0435 \u043d\u0430 \u0433\u043b\u0430\u0437: <\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u0440\u0438\u0442\u044c RPS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 1 \u043f\u043e\u0434<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c threshold \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 70\u201380% \u043e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>maxReplicaCount \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b:<\/strong> <\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>Rate limits \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u043c\u0438\u0442\u044b connections pool<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<pre><code class=\"yaml\"># \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c (latency)query: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{service=\"api\"}[5m]))threshold: \"0.5\"  # 500ms \u043d\u0430 p95# \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439query: sum(nginx_connections_active{deployment=\"nginx\"})threshold: \"1000\"# \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 Redisquery: redis_list_length{list=\"tasks\"}threshold: \"50\"# \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e custom business-\u043c\u0435\u0442\u0440\u0438\u043a\u0435query: sum(rate(orders_created_total[5m]))threshold: \"10\"  # 10 \u0437\u0430\u043a\u0430\u0437\u043e\u0432\/\u0441\u0435\u043a \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f FinOps \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 RPS, \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a CPU.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u21164. HTTP-\u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u043f\u0438\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h2>\n<p>\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u0430\u043a\u0446\u0438\u044f, email-\u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u043d\u0444\u043e\u043f\u043e\u0432\u043e\u0434 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0437\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u0414\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u0438\u043a\u0443 \u0434\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044d\u0442\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f HTTP-\u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0443 KEDA \u0435\u0441\u0442\u044c <a href=\"https:\/\/keda.sh\/http-add-on\/\">HTTP Add-on<\/a>. \u041e\u043d \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 HTTP workloads \u043f\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 scale-to-zero.<\/p>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 HTTP Add-on<\/h3>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 Ingress  \u2502\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 HTTP Interceptor\u2502\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 Application \u2502\u2502          \u2502      \u2502 (queue proxy)   \u2502      \u2502 Pods        \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                           \u2502                           \u25bc                  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                  \u2502 KEDA Scaler     \u2502                  \u2502 (\u043f\u043e RPS\/pending)\u2502                  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>HTTP Interceptor \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u044b \u0435\u0441\u0442\u044c<\/strong> \u2192 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043e\u0432 0<\/strong> \u2192 \u0441\u0442\u0430\u0432\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0442 KEDA \u2192 \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u2192 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<pre><code class=\"yaml\">apiVersion: http.keda.sh\/v1alpha1kind: HTTPScaledObjectmetadata:  name: api-http-scaler  namespace: appspec:  scaleTargetRef:    name: api-service    kind: Deployment    service: api-service    port: 8080  replicas:    min: 0    max: 20  scalingMetric:    requestRate:      targetValue: 100      window: 1m<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>Production checklist \u0434\u043b\u044f HTTP Add-on<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0441\u043a\u0430\u0442\u043a\u043e\u0439 \u043d\u0430 production \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c:<\/p>\n<p><strong>1. Cold start<\/strong><\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442 0 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e ready-\u043f\u043e\u0434\u0430?<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0432 timeout \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043b\u0438 <code>initialDelaySeconds<\/code> \u0432 readiness probe?<\/p>\n<\/li>\n<\/ul>\n<p><strong>2. \u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b<\/strong><\/p>\n<ul>\n<li>\n<p>Timeout \u043d\u0430 Ingress<\/p>\n<\/li>\n<li>\n<p>Timeout \u043d\u0430 HTTP Interceptor<\/p>\n<\/li>\n<li>\n<p>Timeout \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u044b: client &gt; interceptor &gt; ingress &gt; pod<\/p>\n<\/li>\n<\/ul>\n<p><strong>3. Readiness probes<\/strong><\/p>\n<pre><code class=\"yaml\">readinessProbe:  httpGet:    path: \/health    port: 8080  initialDelaySeconds: 5  periodSeconds: 3  failureThreshold: 2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>4. \u041b\u0438\u043c\u0438\u0442\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c connection pool \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c rate limits \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>maxReplicaCount<\/code> \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u044d\u0442\u0438\u0445 \u043b\u0438\u043c\u0438\u0442\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p><strong>5. \u041f\u043b\u0430\u043d \u043e\u0442\u043a\u0430\u0442\u0430<\/strong><\/p>\n<pre><code class=\"bash\"># \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u043a\u0430\u0442: \u0441\u0442\u0430\u0432\u0438\u043c min replicas \u043e\u0431\u0440\u0430\u0442\u043d\u043ekubectl patch httpscaledobject api-http-scaler -n app \\  --type='json' -p='[{\"op\": \"replace\", \"path\": \"\/spec\/replicas\/min\", \"value\": 2}]'# \u0418\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 KEDA \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e workloadkubectl delete httpscaledobject api-http-scaler -n appkubectl scale deployment\/api-service --replicas=3 -n app<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430: maxReplicaCount \u043a\u0430\u043a \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c<\/h2>\n<p>FinOps \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u0412\u0430\u0436\u043d\u043e \u0435\u0449\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0441\u0432\u0435\u0440\u0445\u0443.<\/p>\n<p>\u0410\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433 \u0431\u0435\u0437 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0433\u043d\u0430\u0442\u044c \u0441\u0447\u0435\u0442, \u0435\u0441\u043b\u0438:<\/p>\n<ol>\n<li>\n<p>\u0432 \u043a\u043e\u0434\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0431\u0430\u0433 (\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 retry, memory leak)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u043b\u043e \u043f\u043e\u0434 \u0430\u043d\u043e\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 (DDoS, scraping)<\/p>\n<\/li>\n<li>\n<p>downstream-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0430\u043b\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u2192 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0432\u0438\u0441\u044f\u0442 \u0434\u043e\u043b\u044c\u0448\u0435 \u2192 KEDA \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0449\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432<\/p>\n<\/li>\n<\/ol>\n<p><code>maxReplicaCount<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a, \u0432\u044b\u0448\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e workload \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"yaml\">spec:  minReplicaCount: 0  maxReplicaCount: 10<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c maxReplicaCount<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c:<\/p>\n<p><strong>\u274c \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0438\u0437\u043a\u043e:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0449\u0438\u0442\u0438\u043b \u0441\u0447\u0435\u0442 \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u043e<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 SLA<\/p>\n<\/li>\n<li>\n<p>Downstream-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0430 \u0442\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0448\u044c<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u274c \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u044b\u0441\u043e\u043a\u043e:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0449\u0438\u0442\u0438\u043b SLA<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0440\u0438\u0441\u043a<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u0435\u0448\u044c \u0437\u0430\u0434\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 API<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u2705 \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/strong><\/p>\n<pre><code class=\"bash\"># \u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435# \u0421\u043a\u043e\u043b\u044c\u043a\u043e RPS \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 1 \u043f\u043e\u0434?# \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\/\u0441\u0435\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 1 \u0432\u043e\u0440\u043a\u0435\u0440?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/strong><\/p>\n<pre><code>PostgreSQL connection pool: 100\u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434 \u0434\u0435\u0440\u0436\u0438\u0442 10 connections\u2192 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 10 \u043f\u043e\u0434\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0430\u0441 \u043d\u0430 \u043f\u0438\u043a\u0438:<\/strong><\/p>\n<pre><code>\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430: 5 \u043f\u043e\u0434\u043e\u0432\u041f\u0438\u043a\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430: 8 \u043f\u043e\u0434\u043e\u0432\u2192 maxReplicaCount: 12 (50% \u0437\u0430\u043f\u0430\u0441)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u043a \u043b\u0438\u043c\u0438\u0442\u0443:<\/strong><\/p>\n<pre><code class=\"yaml\"># Prometheus alert- alert: KEDANearMaxReplicas  expr: keda_scaledobject_replicas \/ keda_scaledobject_max_replicas &gt; 0.8  for: 5m  annotations:    summary: \"ScaledObject {{ $labels.scaledobject }} at 80% of maxReplicaCount\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<\/ol>\n<p>\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u043d\u0435 \u00ab\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e\u00bb, \u0430 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043b\u0438\u043c\u0438\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<h2>cooldownPeriod \u0438 \u043f\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437<\/h2>\n<p><code>cooldownPeriod<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u0430\u0443\u0437\u0443 \u043f\u0435\u0440\u0435\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a 0 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<pre><code class=\"yaml\">spec:  cooldownPeriod: 300  # 5 \u043c\u0438\u043d\u0443\u0442<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 KEDA \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u043e\u0434\u0438\u0442\u044c workload \u0432 0. \u041f\u0430\u0443\u0437\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u043a\u0440\u0430\u0442\u043a\u0438\u0445 \u043a\u043e\u043b\u0435\u0431\u0430\u043d\u0438\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (flapping).<\/p>\n<h3>Production-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441 \u043f\u043b\u0430\u0432\u043d\u044b\u043c scale down<\/h3>\n<pre><code class=\"yaml\">apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: api-rps-scaler  namespace: appspec:  scaleTargetRef:    name: api-service  minReplicaCount: 1  maxReplicaCount: 20  cooldownPeriod: 300  advanced:    horizontalPodAutoscalerConfig:      behavior:        scaleDown:          stabilizationWindowSeconds: 300          policies:            - type: Percent              value: 50              periodSeconds: 60            - type: Pods              value: 2              periodSeconds: 60          selectPolicy: Min  # \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443        scaleUp:          stabilizationWindowSeconds: 0          policies:            - type: Percent              value: 100              periodSeconds: 15            - type: Pods              value: 4              periodSeconds: 15          selectPolicy: Max  # \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443  triggers:    - type: prometheus      metadata:        serverAddress: http:\/\/prometheus.monitoring.svc.cluster.local:9090        query: sum(rate(http_requests_total{deployment=\"api-service\"}[2m]))        threshold: \"100\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/strong><\/p>\n<p><strong>Scale Down (\u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u0439):<\/strong><\/p>\n<ul>\n<li>\n<p><code>stabilizationWindowSeconds: 300<\/code> \u2014 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 5 \u043c\u0438\u043d\u0443\u0442<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043d\u0430 50% \u043b\u0438\u0431\u043e \u043d\u0430 2 \u043f\u043e\u0434\u0430 (\u0447\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435) \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443<\/p>\n<\/li>\n<li>\n<p><code>selectPolicy: Min<\/code> \u2014 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442<\/p>\n<\/li>\n<\/ul>\n<p><strong>Scale Up (\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439):<\/strong><\/p>\n<ul>\n<li>\n<p><code>stabilizationWindowSeconds: 0<\/code> \u2014 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043d\u0430 100% \u043b\u0438\u0431\u043e \u043d\u0430 4 \u043f\u043e\u0434\u0430 (\u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435) \u043a\u0430\u0436\u0434\u044b\u0435 15 \u0441\u0435\u043a\u0443\u043d\u0434<\/p>\n<\/li>\n<li>\n<p><code>selectPolicy: Max<\/code> \u2014 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0435\u0430\u043a\u0446\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u043a production: \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0442\u0435\u043c \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0441\u0436\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u0438 \u0441\u043f\u0430\u0434\u0435.<\/p>\n<h2>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 KEDA \u0432 production<\/h2>\n<p>\u0412\u043d\u0435\u0434\u0440\u0438\u0442\u044c KEDA \u0431\u0435\u0437 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u043b\u0435\u0442\u0430\u0442\u044c \u0432\u0441\u043b\u0435\u043f\u0443\u044e. \u041a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0441 \u0430\u043b\u0435\u0440\u0442\u0430\u043c\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0430\u043b\u0435\u0440\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 ScaledObjectskeda_scaler_active# \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043akeda_scaledobject_replicas# \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a (\u0438\u0437 spec)keda_scaledobject_max_replicas# \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430keda_scaler_metrics_value# \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430rate(keda_scaler_errors_total[5m])# Latency \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430keda_scaler_metrics_latency<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b<\/h3>\n<p><strong>1. \u0423\u043f\u043e\u0440 \u0432 maxReplicaCount<\/strong><\/p>\n<pre><code class=\"yaml\">- alert: KEDAMaxReplicasReached  expr: keda_scaledobject_replicas &gt;= keda_scaledobject_max_replicas  for: 5m  labels:    severity: warning  annotations:    summary: \"ScaledObject {{ $labels.scaledobject }} reached maxReplicaCount\"    description: \"Workload hit the ceiling. Check if queue\/load is growing.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>2. \u041e\u0448\u0438\u0431\u043a\u0438 \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430<\/strong><\/p>\n<pre><code class=\"yaml\">- alert: KEDAScalerErrors  expr: rate(keda_scaler_errors_total[5m]) &gt; 0  for: 2m  labels:    severity: critical  annotations:    summary: \"KEDA scaler {{ $labels.scaler }} has errors\"    description: \"KEDA cannot fetch metrics. Autoscaling may be broken.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>3. \u0420\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u0440\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445<\/strong><\/p>\n<pre><code class=\"yaml\">- alert: QueueGrowingAtMaxScale  expr: |    keda_scaler_metrics_value{scaler=\"rabbitmq\"} &gt; 1000    and    keda_scaledobject_replicas &gt;= keda_scaledobject_max_replicas  for: 10m  labels:    severity: critical  annotations:    summary: \"Queue growing but already at max replicas\"    description: \"Need to increase maxReplicaCount or optimize workers.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>4. \u0414\u043e\u043b\u0433\u0438\u0439 cold start<\/strong><\/p>\n<pre><code class=\"yaml\">- alert: SlowColdStart  expr: |    avg_over_time(keda_scaledobject_replicas[5m]) == 0    and    avg_over_time(some_app_request_duration_seconds[5m]) &gt; 30  for: 5m  annotations:    summary: \"Cold start taking too long\"    description: \"App scaled from 0 but startup is slow. Check image size, probes.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h3>Debugging: \u0447\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<pre><code class=\"bash\"># 1. \u041b\u043e\u0433\u0438 KEDA operatorkubectl logs -n keda deployment\/keda-operator -f# 2. \u041b\u043e\u0433\u0438 metrics serverkubectl logs -n keda deployment\/keda-metrics-apiserver -f# 3. \u0421\u0442\u0430\u0442\u0443\u0441 ScaledObjectkubectl describe scaledobject &lt;name&gt; -n &lt;namespace&gt;# \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u043e\u043b\u044f:# - Status.Conditions \u2014 \u0435\u0441\u0442\u044c \u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438# - Status.ScaleTargetKind \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043b\u0438 target# - Events \u2014 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e# 4. HPA \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 KEDAkubectl get hpa -n &lt;namespace&gt;kubectl describe hpa keda-hpa-&lt;name&gt; -n &lt;namespace&gt;# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:# - Current metrics# - Desired replicas vs Current replicas# - Conditions# 5. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0432 namespacekubectl get events -n &lt;namespace&gt; --sort-by='.lastTimestamp' | tail -20# 6. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043c\u0435\u0442\u0440\u0438\u043a# \u0414\u043b\u044f Prometheus scaler:kubectl run -it --rm debug --image=curlimages\/curl --restart=Never -- \\  curl \"http:\/\/prometheus.monitoring.svc:9090\/api\/v1\/query?query=your_query\"# \u0414\u043b\u044f RabbitMQ scaler:kubectl run -it --rm debug --image=curlimages\/curl --restart=Never -- \\  curl \"http:\/\/user:pass@rabbitmq.app.svc:15672\/api\/queues\/%2F\/orders\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<h3>1. Cold start \u0441\u044a\u0435\u0434\u0430\u0435\u0442 SLA<\/h3>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0441\u043b\u0435 scale-to-zero \u0436\u0434\u0435\u0442 30+ \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p><strong>\u041f\u0440\u0438\u0447\u0438\u043d\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 Docker-\u043e\u0431\u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043b\u0433\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 warm-up connection pool<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\/\u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>\u0430) \u0415\u0441\u043b\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c scale-to-zero:<\/strong><\/p>\n<pre><code class=\"yaml\">minReplicaCount: 1  # \u0432\u043c\u0435\u0441\u0442\u043e 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0431) \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f python \u0438\u043c\u0435\u0434\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># Multi-stage buildFROM python:3.11-slim as builderRUN pip install --user package1 package2FROM python:3.11-slimCOPY --from=builder \/root\/.local \/root\/.localCOPY app.py .CMD [\"python\", \"app.py\"]# \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043e\u0431\u0440\u0430\u0437 150MB \u0432\u043c\u0435\u0441\u0442\u043e 800MB# Cold start: 8 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u043c\u0435\u0441\u0442\u043e 25<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0432) \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c readiness probe:<\/strong><\/p>\n<pre><code class=\"yaml\">readinessProbe:  httpGet:    path: \/health    port: 8080  initialDelaySeconds: 10  periodSeconds: 2  failureThreshold: 3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0433) \u0414\u043b\u044f HTTP Add-on \u2014 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f:<\/strong> HTTP Interceptor \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u043a\u0430 \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h4>2. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0441\u0442\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c scale up<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 1000\/\u0441\u0435\u043a, \u0430 \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f ~30 \u0441\u0435\u043a. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0441\u0442\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>\u0430) \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c pollingInterval:<\/strong><\/p>\n<pre><code class=\"yaml\">pollingInterval: 10  # \u0432\u043c\u0435\u0441\u0442\u043e 30<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0431) \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c maxReplicaCount \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c:<\/strong><\/p>\n<pre><code class=\"yaml\">maxReplicaCount: 20  # \u0432\u043c\u0435\u0441\u0442\u043e 10<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0432) \u0410\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 scale up:<\/strong><\/p>\n<pre><code class=\"yaml\">advanced:  horizontalPodAutoscalerConfig:    behavior:      scaleUp:        stabilizationWindowSeconds: 0        policies:          - type: Percent            value: 100            periodSeconds: 15<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0433) \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b downstream:<\/strong><\/p>\n<pre><code>\u0415\u0441\u043b\u0438 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 100 connections,\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434 \u0434\u0435\u0440\u0436\u0438\u0442 10 connections,\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 10 \u043f\u043e\u0434\u043e\u0432 = \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0420\u0435\u0448\u0435\u043d\u0438\u0435:- \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c connection pool \u0431\u0430\u0437\u044b- \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 connections \u0432 \u043a\u043e\u0434\u0435- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c connection pooler (PgBouncer)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>3. Flapping: KEDA \u0441\u043e\u0437\u0434\u0430\u0435\u0442\/\u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u044b \u043a\u0430\u0436\u0434\u044b\u0435 2 \u043c\u0438\u043d\u0443\u0442\u044b<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043b\u0435\u0431\u043b\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u043e\u0440\u043e\u0433\u0430. \u041f\u043e\u0434\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p><strong>\u0421\u0438\u043c\u043f\u0442\u043e\u043c\u044b:<\/strong><\/p>\n<pre><code>10:00 - 5 pods10:02 - 3 pods10:04 - 5 pods10:06 - 3 pods...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>\u0430) \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c cooldownPeriod:<\/strong><\/p>\n<pre><code class=\"yaml\">cooldownPeriod: 600  # 10 \u043c\u0438\u043d\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u043e 5<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0431) \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c stabilizationWindow:<\/strong><\/p>\n<pre><code class=\"yaml\">advanced:  horizontalPodAutoscalerConfig:    behavior:      scaleDown:        stabilizationWindowSeconds: 600<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0432) \u041f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c threshold:<\/strong><\/p>\n<pre><code class=\"yaml\"># \u0411\u044b\u043b\u043evalue: \"10\"  # \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e# \u0421\u0442\u0430\u043b\u043evalue: \"20\"  # \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u0443\u0431\u0430\u044f \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0433) \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0438\u0441\u0442\u0435\u0440\u0435\u0437\u0438\u0441 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438:<\/strong> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f scale up \u0438 scale down (\u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 KEDA, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 composite scaler).<\/p>\n<h4>4. KEDA \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0438\u0437 Prometheus<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong><\/p>\n<pre><code>ScaledObject Status:  Conditions:    Message: error getting metric: query returned no data<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>\u0430) \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c query \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl run -it --rm debug --image=curlimages\/curl --restart=Never -- \\  curl \"http:\/\/prometheus.monitoring.svc:9090\/api\/v1\/query?query=sum(rate(http_requests_total[2m]))\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0431) \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:<\/strong><\/p>\n<pre><code>KEDA \u0442\u0440\u0435\u0431\u0443\u0435\u0442 scalar \u0438\u043b\u0438 vector \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c:\u2705 \u0425\u043e\u0440\u043e\u0448\u043e:{  \"data\": {    \"result\": [{\"value\": [1234567890, \"42.5\"]}]  }}\u274c \u041f\u043b\u043e\u0445\u043e (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432):{  \"data\": {    \"result\": [      {\"metric\": {\"pod\": \"api-1\"}, \"value\": [1234567890, \"10\"]},      {\"metric\": {\"pod\": \"api-2\"}, \"value\": [1234567890, \"15\"]}    ]  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0432) \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c aggregation:<\/strong><\/p>\n<pre><code class=\"yaml\"># \u0411\u044b\u043b\u043equery: rate(http_requests_total{deployment=\"api\"}[2m])# \u0421\u0442\u0430\u043b\u043equery: sum(rate(http_requests_total{deployment=\"api\"}[2m]))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0433) \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c Prometheus:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl get svc -n monitoring# \u0423\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e serverAddress \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>5. maxReplicaCount \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> Workload \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 <code>maxReplicaCount: 10<\/code>, \u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0438.<\/p>\n<p><strong>\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430:<\/strong><\/p>\n<pre><code># \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 workload \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0435avg_over_time((keda_scaledobject_replicas == keda_scaledobject_max_replicas)[1h:])# \u0420\u0430\u0441\u0442\u0435\u0442 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044crate(rabbitmq_queue_messages[5m]) &gt; 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>\u0430) \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c maxReplicaCount<\/strong> (\u0435\u0441\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442):<\/p>\n<pre><code class=\"yaml\">maxReplicaCount: 20<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0431) \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0442\u0447\u0438\u043d\u0433<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0432) \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/strong><\/p>\n<pre><code class=\"yaml\">resources:  requests:    cpu: 500m  # \u0431\u044b\u043b\u043e 200m    memory: 1Gi  # \u0431\u044b\u043b\u043e 512Mi<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0433) \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c downstream:<\/strong> \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0445, \u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u043c API.<\/p>\n<h3>\u0414\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443: \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435<\/h3>\n<p>\u0421\u0430\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433 \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430.<\/p>\n<p>\u0414\u043b\u044f FinOps \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, <strong>\u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435<\/strong>.<\/p>\n<h4>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<pre><code class=\"yaml\">\u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432:  - pod-hours (\u0440\u0435\u043f\u043b\u0438\u043a \u00d7 \u0447\u0430\u0441\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b)  - replica count over time  - CPU utilization (\u0441\u0440\u0435\u0434\u043d\u0435\u0435, p50, p95)  - memory utilization (\u0441\u0440\u0435\u0434\u043d\u0435\u0435, p50, p95)\u0411\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430:  - queue length (\u0441\u0440\u0435\u0434\u043d\u0435\u0435, max)  - oldest message age  - request rate (RPS)  - throughput (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\/\u0441\u0435\u043a, \u0437\u0430\u043a\u0430\u0437\u043e\u0432\/\u0447\u0430\u0441)\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:  - latency (p50, p95, p99)  - error rate  - success rate  - cold start time (p95, p99)  - time to scale (0\u2192N \u0440\u0435\u043f\u043b\u0438\u043a)\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:  - scale up events count  - scale down events count  - time at 0 replicas  - time at max replicas<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, <strong>\u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f cost view \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c<\/strong>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 blended cost, \u0434\u0440\u0443\u0433\u0430\u044f unblended, \u0430 \u0442\u0440\u0435\u0442\u044c\u044f amortized, \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u043e\u0440 \u043e \u0446\u0438\u0444\u0440\u0430\u0445 \u0432\u043c\u0435\u0441\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"yaml\">Cost dimensions:  - \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c namespace (\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435)  - \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c workload (\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435)  - \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c node pool (\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435)  - \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c idle capacity  - \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0440\u0430\u0431\u043e\u0442\u044b (cost per order, cost per message)Cost types (\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d):  - Blended cost (\u0441\u043c\u0435\u0448\u0430\u043d\u043d\u0430\u044f: on-demand + spot + savings plans)  - Unblended cost (\u0447\u0438\u0441\u0442\u0430\u044f: \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0441\u043a\u0438\u0434\u043e\u043a)  - Amortized cost (\u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f: \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 reserved instances)  - Net cost (\u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u0441\u0435\u0445 \u0441\u043a\u0438\u0434\u043e\u043a \u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432)Time periods:  - 1 \u043d\u0435\u0434\u0435\u043b\u044f \u0434\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f  - 1 \u043c\u0435\u0441\u044f\u0446 \u0434\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f  - 1 \u043d\u0435\u0434\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f  - 1 \u043c\u0435\u0441\u044f\u0446 \u043f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<pre><code class=\"yaml\">Stability:  - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432  - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 SLA  - MTTR (mean time to recovery)Toil:  - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0443\u0447\u043d\u044b\u0445 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432  - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e manual scale \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439  - \u0432\u0440\u0435\u043c\u044f \u043d\u0430 troubleshooting autoscalingReaction time:  - \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438  - \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c scale up  - \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c scale down  - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e flapping events<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430<\/h4>\n<pre><code class=\"markdown\">Before KEDA (week 1-2)- **Pod-hours:** 336\/week (5 pods \u00d7 24h \u00d7 7d)- **Avg CPU utilization:** 8%- **Cost:** $168\/week- **Manual interventions:** 3 (weekend scale-down)After KEDA (week 3-4)- **Pod-hours:** 112\/week- **Avg CPU utilization:** 52%- **Cost:** $56\/week- **Manual interventions:** 0- **Cold start p95:** 12 seconds- **SLA violations:** 0Result- **Cost savings:** 67% ($112\/week, $5,824\/year for this workload)- **Utilization improvement:** 8% \u2192 52%- **Toil reduction:** 3 manual ops \u2192 0- **SLA:** no impact<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/07f\/e99\/b52\/07fe99b52b9b998a26e333f9cbe1f897.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/07f\/e99\/b52\/07fe99b52b9b998a26e333f9cbe1f897.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/07f\/e99\/b52\/07fe99b52b9b998a26e333f9cbe1f897.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u043b\u043e\u0442<\/h2>\n<p>KEDA \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u043e \u0432\u0441\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.<\/p>\n<p>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0438\u0434\u0442\u0438 \u043f\u043e \u0448\u0430\u0433\u0430\u043c.<\/p>\n<h3>\u0428\u0430\u0433 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 workload<\/h3>\n<p><strong>\u2705 \u0425\u043e\u0440\u043e\u0448\u0438\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0438\u043b\u043e\u0442\u0430:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0424\u043e\u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b<\/strong><\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 (email, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u043e\u0442\u0447\u0435\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p>Batch-\u0437\u0430\u0434\u0430\u0447\u0438<\/p>\n<\/li>\n<li>\n<p>ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Dev\/staging \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0435 \u043d\u0443\u0436\u043d\u044b \u043d\u043e\u0447\u044c\u044e \u0438 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u041d\u0438\u0437\u043a\u0438\u0439 \u0440\u0438\u0441\u043a \u0434\u043b\u044f production<\/p>\n<\/li>\n<li>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043a\u0430\u0436\u0443\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u0447\u0430\u0441\u0430\u043c\u0438<\/strong><\/p>\n<ul>\n<li>\n<p>B2B API (9:00\u201318:00)<\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>Admin-\u043f\u0430\u043d\u0435\u043b\u0438<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 API \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/strong><\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 (RPS, queue length)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u0438\u043a\u043e\u0432\u044b\u0435 \u043e\u043a\u043d\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0436\u0435\u0441\u0442\u043a\u0438\u0445 SLA<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>\u274c \u041f\u043b\u043e\u0445\u0438\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0438\u043b\u043e\u0442\u0430:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u041a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0439 production \u0441 \u0436\u0435\u0441\u0442\u043a\u0438\u043c SLA<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>Stateful workloads (\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445)<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u0434\u043e\u043b\u0433\u0438\u043c cold start (&gt;30 \u0441\u0435\u043a)<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u043d\u043e\u043b\u0438\u0442 \u0441 shared state<\/strong><\/p>\n<\/li>\n<\/ol>\n<h3>\u0428\u0430\u0433 2. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<pre><code>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u0435\u0442\u0440\u0438\u043a\u0438:  \u2713 \u0415\u0441\u0442\u044c \u043b\u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438?  \u2713 \u041a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439?  \u2713 \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0439 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c?  \u2713 \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d?  \u2713 \u041a\u0430\u043a\u043e\u0439 \u043b\u0430\u0433 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u0435\u0439?\u0414\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 (RabbitMQ, Kafka, SQS):  \u2713 \u041c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438?  \u2713 \u0415\u0441\u0442\u044c credentials \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f?  \u2713 \u0415\u0441\u0442\u044c \u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043e\u0447\u0435\u0440\u0435\u0434\u0438?\u0414\u043b\u044f Prometheus:  \u2713 Query \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u043a\u0430\u043b\u044f\u0440?  \u2713 \u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f?  \u2713 \u0415\u0441\u0442\u044c \u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438?\u0414\u043b\u044f cron:  \u2713 \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439?  \u2713 Timezone \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430, KEDA \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u0441\u0442\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043f\u043b\u043e\u0445\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443.<\/p>\n<h3>\u0428\u0430\u0433 3. \u0417\u0430\u0434\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0438\u043b\u043e\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"yaml\">minReplicaCount: 0      # \u0438\u043b\u0438 1 \u0435\u0441\u043b\u0438 cold start \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u043dmaxReplicaCount: 10     # \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e capacity planningpollingInterval: 30     # \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044ccooldownPeriod: 300     # \u043f\u0430\u0443\u0437\u0430 \u043f\u0435\u0440\u0435\u0434 scale-to-zero<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<pre><code class=\"yaml\">minReplicaCount:  # 0 \u2192 \u0435\u0441\u043b\u0438 cold start &lt; 15 \u0441\u0435\u043a \u0438 SLA \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442  # 1 \u2192 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f  # 2+ \u2192 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 redundancymaxReplicaCount:  # capacity = max_expected_load \/ throughput_per_pod  # + 20-50% \u0437\u0430\u043f\u0430\u0441  # \u041f\u0440\u0438\u043c\u0435\u0440: 1000 msg\/sec, 100 msg\/sec \u043d\u0430 \u043f\u043e\u0434 \u2192 10 \u043f\u043e\u0434\u043e\u0432 + 50% = 15pollingInterval:  # 30 \u0441\u0435\u043a \u2192 \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438  # 10-15 \u0441\u0435\u043a \u2192 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043f\u0438\u043a\u043e\u0432  # 5 \u0441\u0435\u043a \u2192 \u0434\u043b\u044f critical workloads (\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u0435\u0442\u0440\u0438\u043a)cooldownPeriod:  # 300 \u0441\u0435\u043a (5 \u043c\u0438\u043d) \u2192 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442  # 600 \u0441\u0435\u043a (10 \u043c\u0438\u043d) \u2192 \u0434\u043b\u044f workloads \u0441 \u0447\u0430\u0441\u0442\u044b\u043c\u0438 \u043a\u043e\u043b\u0435\u0431\u0430\u043d\u0438\u044f\u043c\u0438  # 120 \u0441\u0435\u043a (2 \u043c\u0438\u043d) \u2192 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0428\u0430\u0433 4. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c observability<\/h3>\n<p><strong>\u0414\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/strong> \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434:<\/p>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043d\u0435\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>replicas over time<\/p>\n<\/li>\n<li>\n<p>scaler metric value (queue length \/ RPS \/ etc)<\/p>\n<\/li>\n<li>\n<p>latency (p50, p95, p99)<\/p>\n<\/li>\n<li>\n<p>error rate<\/p>\n<\/li>\n<li>\n<p>CPU \/ memory utilization<\/p>\n<\/li>\n<\/ul>\n<p>FinOps \u043f\u0430\u043d\u0435\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>pod-hours per day<\/p>\n<\/li>\n<li>\n<p>cost per day (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c cost allocation)<\/p>\n<\/li>\n<li>\n<p>cost per message\/request<\/p>\n<\/li>\n<\/ul>\n<p>KEDA-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p>keda_scaler_errors_total<\/p>\n<\/li>\n<li>\n<p>distance to max replicas<\/p>\n<\/li>\n<li>\n<p>time at 0 replicas<\/p>\n<\/li>\n<li>\n<p>time at max replicas<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0410\u043b\u0435\u0440\u0442\u044b:<\/strong><\/p>\n<p>Critical:<\/p>\n<ul>\n<li>\n<p>KEDA scaler errors<\/p>\n<\/li>\n<li>\n<p>Max replicas reached + queue growing<\/p>\n<\/li>\n<li>\n<p>Cold start &gt; SLA threshold<\/p>\n<\/li>\n<\/ul>\n<p>Warning:<\/p>\n<ul>\n<li>\n<p>Distance to max replicas &lt; 20%<\/p>\n<\/li>\n<li>\n<p>Flapping (scale up\/down each 5 min)<\/p>\n<\/li>\n<li>\n<p>Queue age &gt; SLA threshold<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0435\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, KEDA \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438.<\/p>\n<h3>\u0428\u0430\u0433 5. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0438\u043b\u043e\u0442 \u043d\u0430 1-2 \u043d\u0435\u0434\u0435\u043b\u0438<\/h3>\n<h3>\u0428\u0430\u0433 6. \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c<\/h3>\n<p>\u0427\u0435\u0440\u0435\u0437 <strong>2 \u043d\u0435\u0434\u0435\u043b\u0438<\/strong> \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">Metric<\/p>\n<\/th>\n<th>\n<p align=\"left\">Before<\/p>\n<\/th>\n<th>\n<p align=\"left\">After<\/p>\n<\/th>\n<th>\n<p align=\"left\">Change<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Pod-hours\/week<\/p>\n<\/td>\n<td>\n<p align=\"left\">336<\/p>\n<\/td>\n<td>\n<p align=\"left\">112<\/p>\n<\/td>\n<td>\n<p align=\"left\">-67%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Avg CPU util<\/p>\n<\/td>\n<td>\n<p align=\"left\">8%<\/p>\n<\/td>\n<td>\n<p align=\"left\">52%<\/p>\n<\/td>\n<td>\n<p align=\"left\">+44pp<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Cost\/week<\/p>\n<\/td>\n<td>\n<p align=\"left\">$168<\/p>\n<\/td>\n<td>\n<p align=\"left\">$56<\/p>\n<\/td>\n<td>\n<p align=\"left\">-$112<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">P95 latency<\/p>\n<\/td>\n<td>\n<p align=\"left\">120ms<\/p>\n<\/td>\n<td>\n<p align=\"left\">150ms<\/p>\n<\/td>\n<td>\n<p align=\"left\">+30ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Error rate<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.01%<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.01%<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SLA violations<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Manual ops<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">-3<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0428\u0430\u0433 7. \u0420\u0435\u0448\u0438\u0442\u044c: \u0440\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c<\/h4>\n<p><strong>\u2705 \u0420\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0441\u043b\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430 \u0446\u0438\u0444\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>SLA \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>Observability \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u23f8\ufe0f \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0441\u043b\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>Cold start \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u0438\u0439 \u2192 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p>Flapping \u2192 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c behavior<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432 max replicas \u2192 capacity planning<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u274c \u041e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u0435\u0441\u043b\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>SLA \u043d\u0430\u0440\u0443\u0448\u0435\u043d<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 troubleshoot<\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0430\u0441\u044c<\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 production<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0441\u043a\u0430\u0442\u043a\u043e\u0439 \u043d\u0430 production \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442:<\/p>\n<pre><code class=\"yaml\">Application readiness:  \u2713 \u0421\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u043e 0?  \u2713 Cold start \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 SLA?  \u2713 \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 stateless?  \u2713 \u041d\u0435\u0442 in-memory state \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438?  \u2713 \u041d\u0435\u0442 dependency \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 pod IP?Kubernetes configuration:  \u2713 Readiness probe \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e?  \u2713 Liveness probe \u043d\u0435 \u0443\u0431\u0438\u0432\u0430\u0435\u0442 pod \u0432\u043e \u0432\u0440\u0435\u043c\u044f cold start?  \u2713 Resource requests \u0438 limits \u0437\u0430\u0434\u0430\u043d\u044b?  \u2713 PodDisruptionBudget \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d?  \u2713 Anti-affinity rules \u0443\u0447\u0442\u0435\u043d\u044b?KEDA configuration:  \u2713 minReplicaCount \u0432\u044b\u0431\u0440\u0430\u043d \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e?  \u2713 maxReplicaCount \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u043c\u0438\u0442\u044b downstream?  \u2713 pollingInterval \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u0435\u043d \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438?  \u2713 cooldownPeriod \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439?  \u2713 Trigger \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430?Dependencies:  \u2713 \u041f\u043e\u043d\u044f\u0442\u043d\u044b \u043b\u0438\u043c\u0438\u0442\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445?  \u2713 \u041f\u043e\u043d\u044f\u0442\u043d\u044b \u043b\u0438\u043c\u0438\u0442\u044b \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439?  \u2713 \u041f\u043e\u043d\u044f\u0442\u043d\u044b rate limits \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API?  \u2713 Connection pools \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c?Observability:  \u2713 \u0414\u0430\u0448\u0431\u043e\u0440\u0434 \u0434\u043b\u044f workload \u0433\u043e\u0442\u043e\u0432?  \u2713 \u0410\u043b\u0435\u0440\u0442\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b?  \u2713 \u041b\u043e\u0433\u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e?  \u2713 Distributed tracing \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?Ownership:  \u2713 \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 ScaledObject?  \u2713 \u0415\u0441\u0442\u044c runbook \u0434\u043b\u044f troubleshooting?  \u2713 \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f?  \u2713 \u0415\u0441\u0442\u044c \u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u0440\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438?  \u2713 \u0415\u0441\u0442\u044c \u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u0443\u043f\u043e\u0440 \u0432 maxReplicaCount?FinOps:  \u2713 Cost allocation tags \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b?  \u2713 \u0414\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u043e\u0439 cost view \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c?  \u2713 Baseline \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u044b?  \u2713 \u041f\u043b\u0430\u043d \u0437\u0430\u043c\u0435\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446?Rollback plan:  \u2713 \u0418\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043f\u043b\u0430\u043d \u043e\u0442\u043a\u0430\u0442\u0430?  \u2713 \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0442\u043a\u0430\u0442 \u043d\u0430 staging?  \u2713 \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c fixed replicas?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430, \u044d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e KEDA \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0438\u043b\u043e\u0442 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u0435.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u041d\u0415 \u043d\u0443\u0436\u0435\u043d KEDA<\/h4>\n<p>KEDA \u2014 \u043d\u0435 silver bullet. \u0415\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0433\u0434\u0435 \u043e\u043d \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d:<\/p>\n<ul>\n<li>\n<p><strong>\u274c \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 24\/7<\/strong> \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u0440\u0436\u0438\u0442 10 \u0440\u0435\u043f\u043b\u0438\u043a \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u2014 HPA \u043f\u043e CPU \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u274c Stateful workloads (\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445)<\/strong> Scale-to-zero \u0434\u043b\u044f PostgreSQL \u2014 \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f. \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (VPA, bigger nodes) \u0447\u0430\u0441\u0442\u043e \u043b\u0443\u0447\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u274c \u041e\u0447\u0435\u043d\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (&lt; 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430)<\/strong> \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 100ms, overhead \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430 (5-15 \u0441\u0435\u043a) \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a. \u041b\u0443\u0447\u0448\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c min replicas \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c serverless (Knative, Lambda).<\/p>\n<\/li>\n<li>\n<p><strong>\u274c \u041a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 SLA &lt; 1 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/strong> Cold start \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0438\u0435 SLA. \u041d\u0443\u0436\u0435\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 warm pool.<\/p>\n<\/li>\n<\/ul>\n<h3>Q&amp;A<\/h3>\n<details class=\"spoiler\">\n<summary>Q&amp;A<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>Q: KEDA \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 HPA?<\/strong><\/p>\n<p>A: \u041d\u0435\u0442, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442. KEDA \u0441\u043e\u0437\u0434\u0430\u0435\u0442 HPA \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u043c\u0443 external metrics \u0447\u0435\u0440\u0435\u0437 Metrics API Server. HPA \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043f\u043b\u0438\u043a, KEDA \u2014 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u043a.<\/p>\n<hr\/>\n<p><strong>Q: \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 stateful workloads (\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445)?<\/strong><\/p>\n<p>A: \u0421 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e. Scale-to-zero \u0434\u043b\u044f \u0411\u0414 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f (\u0434\u043e\u043b\u0433\u0438\u0439 startup, \u043f\u043e\u0442\u0435\u0440\u044f \u043a\u0435\u0448\u0430, state). \u041d\u043e:<\/p>\n<ul>\n<li>\n<p>\u2705 \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c read-replica \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u043c\u043e\u0436\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u2705 Dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441 \u0411\u0414 \u043d\u0430 \u043d\u043e\u0447\u044c \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u2014 \u043c\u043e\u0436\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u274c Production master \u0411\u0414 \u0432 scale-to-zero \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><strong>Q: \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 KEDA \u0443\u043f\u0430\u0434\u0435\u0442?<\/strong><\/p>\n<p>A: HPA \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439. \u041d\u043e:<\/p>\n<ul>\n<li>\n<p>\u041d\u043e\u0432\u044b\u0435 ScaledObject \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>Workload \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u043f\u043b\u0438\u043a \u0434\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f KEDA<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u0440\u0438\u0442\u0438\u0447\u043d\u043e:<\/strong> \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>keda-operator<\/code> \u0438 <code>keda-metrics-apiserver<\/code> pods.<\/p>\n<hr\/>\n<p><strong>Q: \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u0432 on-premise Kubernetes?<\/strong><\/p>\n<p>A: \u0414\u0430, KEDA \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u0431\u043b\u0430\u043a\u0443. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043b\u044e\u0431\u043e\u043c Kubernetes (on-premise, cloud, edge). \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u0435\u0442\u0440\u0438\u043a \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d (RabbitMQ, Prometheus, etc).<\/p>\n<hr\/>\n<p><strong>Q: \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u0438\u0442 KEDA?<\/strong><\/p>\n<p>A: Open source, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e (Apache 2.0 license). \u041f\u043b\u0430\u0442\u0438\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u0430\u043c\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (compute, storage, network)<\/p>\n<hr\/>\n<p><strong>Q: \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432?<\/strong><\/p>\n<p>A: \u0414\u0430, ScaledObject \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e triggers. \u041c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0418 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e:<\/p>\n<pre><code class=\"yaml\">triggers:  - type: rabbitmq    metadata:      queueName: orders      value: \"10\"  - type: prometheus    metadata:      query: sum(rate(http_requests_total[2m]))      threshold: \"100\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>KEDA \u0432\u043e\u0437\u044c\u043c\u0435\u0442 <strong>\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c<\/strong> \u0438\u0437 \u0432\u0441\u0435\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432.<\/p>\n<hr\/>\n<p><strong>Q: \u041a\u0430\u043a \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0435\u0441\u043b\u0438 KEDA \u0441\u043b\u043e\u043c\u0430\u043b production?<\/strong><\/p>\n<p>A: \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u043a\u0430\u0442:<\/p>\n<pre><code class=\"bash\"># 1. \u0423\u0434\u0430\u043b\u0438\u0442\u044c ScaledObject (HPA \u0442\u043e\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f)kubectl delete scaledobject &lt;name&gt; -n &lt;namespace&gt;# 2. \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043akubectl scale deployment\/&lt;name&gt; --replicas=5 -n &lt;namespace&gt;# 3. \u0418\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 Deploymentkubectl apply -f deployment-before-keda.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u0434\u0435\u0440\u0436\u0438\u0442\u0435 backup \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0434\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA.<\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435<\/h2>\n<p>KEDA \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 FinOps \u0437\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u041e\u043d \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0442\u0440\u0430\u0442<\/p>\n<\/li>\n<li>\n<p>Ownership \u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u0411\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0435 \u0430\u043b\u0435\u0440\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 cloud bill<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>Cost allocation tags \u0438 chargeback<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u043e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 <strong>\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b\u043e\u0432 \u0432 Kubernetes<\/strong>.<\/p>\n<h3>KEDA \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442:<\/h3>\n<ul>\n<li>\n<p>\u2705 <strong>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435<\/strong> \u041e\u0447\u0435\u0440\u0435\u0434\u0438, \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u2014 \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CPU\/Memory<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u041d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u201c\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u201d<\/strong> Scale-to-zero \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 maxReplicaCount<\/strong> \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c scale down<\/strong> <code>cooldownPeriod<\/code> + HPA behavior \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0438\u043b\u043e\u0442<\/strong> \u041c\u0435\u0441\u044f\u0446 \u043d\u0430 dev\/staging \u2192 \u0446\u0438\u0444\u0440\u044b \u2192 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e production<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u0421\u043d\u0438\u0436\u0430\u0442\u044c toil<\/strong> \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0440\u0443\u0447\u043d\u044b\u0445 scale \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<h3>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c<\/h3>\n<p>\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u0440\u0435\u0434\u043a\u0438\u0439 \u043f\u0438\u043a, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u043c \u0438 SLA.<\/p>\n<p>\u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443<\/strong> \u2192 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435<\/strong> \u2192 scale-to-zero \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435 \u0440\u0430\u0441\u0442\u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e<\/strong> \u2192 maxReplicaCount \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 KEDA \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440. \u042d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u0442\u044c Kubernetes-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u043d\u044c\u0448\u0435 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u043b\u0438\u043c\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<h2>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u2705 \u0412\u043e\u0440\u043a\u0435\u0440\u044b \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442 \u043d\u043e\u0447\u044c\u044e<\/p>\n<\/li>\n<li>\n<p>\u2705 Dev\/staging \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 24\/7<\/p>\n<\/li>\n<li>\n<p>\u2705 \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u0447\u0430\u0441\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u2705 Batch-\u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>\u2705 API \u0441 \u043f\u0438\u043a\u043e\u0432\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u2026\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 KEDA \u043d\u0430 <strong>\u043e\u0434\u043d\u043e\u043c workload<\/strong>.<\/p>\n<h3>\u041f\u043b\u0430\u043d \u043f\u0435\u0440\u0432\u044b\u0445 \u0448\u0430\u0433\u043e\u0432:<\/h3>\n<ol>\n<li>\n<p><strong>\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0438\u043b\u043e\u0442\u043d\u044b\u0439 workload<\/strong> (dev-\u0432\u043e\u0440\u043a\u0435\u0440 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e)<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c KEDA<\/strong> \u0447\u0435\u0440\u0435\u0437 Helm \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0442\u044c ScaledObject<\/strong> \u0441 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/strong> (\u0434\u0430\u0448\u0431\u043e\u0440\u0434 + \u0430\u043b\u0435\u0440\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 2 \u043d\u0435\u0434\u0435\u043b\u0438<\/strong> \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0434\u043e\/\u043f\u043e\u0441\u043b\u0435<\/strong> \u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u0435\u0441\u044f\u0446 \u043f\u0438\u043b\u043e\u0442\u0430 \u0434\u0430\u0441\u0442:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438<\/strong> (pod-hours, $)<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439<\/strong> \u0434\u043e \u0440\u0430\u0441\u043a\u0430\u0442\u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u044b\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/strong> \u0441 event-driven autoscaling<\/p>\n<\/li>\n<li>\n<p><strong>Baseline \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/strong><\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h4>\n<p><strong>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/keda.sh\/\">KEDA Official Docs<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/keda.sh\/docs\/2.20\/scalers\/\">KEDA Scalers<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/kedacore\/keda\">KEDA GitHub<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/kedacore\/samples\">KEDA Samples<\/a><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u043e\u043f\u044b\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0438\u043b\u0438 \u0432 \u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445.<\/strong><\/p>\n<hr\/>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u0440\u0438\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u00ab\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 FinOps\u00bb, \u0433\u0434\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438, cloud-cost \u0438 FinOps-\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c \u0432 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445.<\/p>\n<p><a href=\"https:\/\/t.me\/finops_ru\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 FinOps \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c<\/a>.<\/p>\n<\/div>\n<p>\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\/1056066\/\">https:\/\/habr.com\/ru\/articles\/1056066\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u0430\u0447\u0438\u043d\u0441\u043a\u0438\u0439, \u044f Head of Ops \u0432 Rocketdata. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443 KEDA \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f Kubernetes-workloads \u0441 \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439: \u043e\u0447\u0435\u0440\u0435\u0434\u044f\u043c\u0438, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u043c\u0438, HTTP-\u043f\u0438\u043a\u0430\u043c\u0438 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438.\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0435 \u043f\u0440\u043e \u00ab\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438\u00bb, \u0430 \u043f\u0440\u043e production-\u043f\u043e\u0434\u0445\u043e\u0434: \u0433\u0434\u0435 KEDA \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u043f\u0438\u043b\u043e\u0442\u0430 \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u0438 \u0440\u0430\u0441\u043a\u0430\u0442\u043a\u0435.\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u00ab\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 FinOps\u00bb \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0447\u0435\u0442\u044b, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u043d\u043e \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u0441\u0442\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u0435.TL;DR\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: HPA \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043f\u043e CPU\/Memory, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442 18 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u0438 \u0436\u0433\u0443\u0442 \u0431\u044e\u0434\u0436\u0435\u0442, \u043f\u043e\u043a\u0430 \u0436\u0434\u0443\u0442 \u0440\u0435\u0434\u043a\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: KEDA \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u044b \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u2014 \u0434\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, cron, Prometheus-\u043c\u0435\u0442\u0440\u0438\u043a\u0438, HTTP-\u0442\u0440\u0430\u0444\u0438\u043a. \u0421\u0435\u0440\u0432\u0438\u0441 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435.FinOps-\u043f\u0440\u043e\u0444\u0438\u0442:Scale-to-zero: 0 \u043f\u043e\u0434\u043e\u0432 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0442 \u2192 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043d\u0430 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435maxReplicaCount: \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u043d\u0430\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f 40\u201370% \u043d\u0430 workloads \u0441 \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 (\u0432\u043e\u0440\u043a\u0435\u0440\u044b, batch-\u0437\u0430\u0434\u0430\u0447\u0438, dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c KEDA \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 FinOps-\u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b \u0434\u043b\u044f Kubernetes: \u0433\u0434\u0435 HPA \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d ScaledObject, \u043a\u0430\u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u043a scale-to-zero, \u043a\u0430\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 maxReplicaCount \u0438 \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e \u043f\u0438\u043b\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0446\u0438\u0444\u0440\u0430\u043c\u0438.\u0412 Kubernetes \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0443\u0442\u044c \u043a \u043c\u044b\u0441\u043b\u0438, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0440\u0435\u0448\u0435\u043d\u0430. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 HPA \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 CPU \u0438 \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u043e \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0436\u0438\u0432\u0435\u0442 \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435: \u0436\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u043f\u0438\u043a\u0438 HTTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0430\u0447\u043a\u0430\u043c\u0438.\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f FinOps \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0441\u043b\u043e\u0439. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u044b \u0438 \u043d\u043e\u0434\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u00ab\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u00bb, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0437\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435. KEDA \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u0438\u0436\u0435 \u043a \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435: \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c, \u043e\u0447\u0435\u0440\u0435\u0434\u044f\u043c, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, HTTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0443 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c.\u042d\u0442\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438 ownership. \u041d\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0439 \u0433\u0430\u0440\u0434\u0440\u0435\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\u0413\u0434\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e HPA \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442Horizontal Pod Autoscaler \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u044b\u00bb. \u0412 \u0442\u0438\u043f\u043e\u0432\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e CPU \u0438 \u043f\u0430\u043c\u044f\u0442\u0438.\u041d\u043e \u043d\u0435 \u0432\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438.\u041f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u0442\u044c \u0432\u043e\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u044c CPU, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0436\u0434\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e API. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0436\u0435 \u0440\u0430\u0441\u0442\u0435\u0442, \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, SLA \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0442\u044c.\u0414\u043b\u044f HPA \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e:CPU: 2%Memory: stableReplicas: 2\u0410 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:Queue length: 3 250 messagesOldest message age: 18 minutesSLA: at risk\u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e CPU, \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0430\u0437\u0434\u044b\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0437\u0435\u0440\u0432 \u043f\u043e\u0434\u043e\u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043b\u0430\u0442\u0438\u0442 \u0437\u0430 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 over-provisioning: \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0437\u0430\u043d\u044f\u0442\u044b, \u0441\u0447\u0435\u0442 \u0440\u0430\u0441\u0442\u0435\u0442, \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0442.\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 KEDAKEDA, Kubernetes Event-driven Autoscaling, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 Kubernetes \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: KEDA \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 HPA, \u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0435\u0433\u043e. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 Kubernetes \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f KEDA.KEDA \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438:\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (RabbitMQ, Kafka, SQS, Azure Service Bus);\u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f (cron);\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (PostgreSQL, MySQL, Redis);HTTP-\u0442\u0440\u0430\u0444\u0438\u043a (\u0447\u0435\u0440\u0435\u0437 HTTP Add-on);\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0437 Prometheus;\u0432\u043d\u0435\u0448\u043d\u0438\u0435 event source \u0447\u0435\u0440\u0435\u0437 60+ \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u043e\u0432.\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 RabbitMQ    \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 KEDA Scaler  \u2502\u2502 Queue: 150  \u2502         \u2502 polls every  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502 30 sec       \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 External     \u2502                        \u2502 Metrics API  \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 HPA decides  \u2502                        \u2502 150\/10 = 15  \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                               \u2502                               \u25bc                        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502 Deployment   \u2502                        \u2502 scales to 15 \u2502                        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518KEDA \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0432 Kubernetes \u0447\u0435\u0440\u0435\u0437 External Metrics API, \u0430 HPA \u0443\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043f\u043b\u0438\u043a. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 scaling \u0434\u043b\u044f Deployments, StatefulSets \u0438 Custom Resources \u0447\u0435\u0440\u0435\u0437 scale subresource. KEDA: Scaling Deployments, StatefulSets &amp; Custom Resources.\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 KEDA \u0447\u0435\u0440\u0435\u0437 Helm\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Helm \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:helm repo add kedacore https:\/\/kedacore.github.io\/chartshelm repo updatehelm install keda kedacore\/keda \\  &#8212;namespace keda \\  &#8212;create-namespace\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u044b \u0432 namespace keda:kubectl get pods -n keda\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 KEDA: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Helm-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c chart \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 namespace. KEDA: Deploying KEDA.\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 ScaledObject\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f workload \u2014 \u044d\u0442\u043e ScaledObject.\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: example-scalerspec:  scaleTargetRef:    name: example-deployment  minReplicaCount: 0  maxReplicaCount: 10  pollingInterval: 30  cooldownPeriod: 300  triggers:    &#8212; type: &#8230;      metadata:        &#8230;\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:scaleTargetRef &#8212; \u0426\u0435\u043b\u0435\u0432\u043e\u0439 Deployment, StatefulSet \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 KEDA \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c.minReplicaCount &#8212; \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a. \u0414\u043b\u044f scale-to-zero \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 0.maxReplicaCount &#8212; \u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0440\u0435\u043f\u043b\u0438\u043a. \u042d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0438\u043c\u0438\u0442 \u0440\u043e\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.pollingInterval &#8212; \u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e KEDA \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445).cooldownPeriod &#8212; \u041f\u0430\u0443\u0437\u0430 \u043f\u0435\u0440\u0435\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a 0 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c.triggers &#8212; \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430.\u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 ScaledObject, pollingInterval \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 30 \u0441\u0435\u043a\u0443\u043d\u0434, cooldownPeriod \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 300 \u0441\u0435\u043a\u0443\u043d\u0434, minReplicaCount \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0, \u0430 maxReplicaCount \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 100. KEDA: ScaledObject specification.Scale-to-zero \u043a\u0430\u043a FinOps-\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430Scale-to-zero \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 KEDA \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f FinOps.\u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435\u0442, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0438\u043b\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0435\u0442, KEDA \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e 0. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u00ab\u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f\u00bb.\u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0435\u0440\u0432:min replicas: 2traffic: 0queue: 0cost: continues\u0421 scale-to-zero \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:min replicas: 0traffic: 0queue: 0cost for workload compute: reduced\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u0431\u0435\u0449\u0430\u0442\u044c. Scale-to-zero \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0447\u0435\u0442 \u0437\u0430 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u044b\u043c. Control plane, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u043e\u0434\u044b, \u0434\u0438\u0441\u043a\u0438, \u043b\u043e\u0433\u0438, \u0441\u0435\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442\u044c \u0434\u0435\u043d\u0435\u0433. \u041d\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e workload \u044d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439.FinOps-\u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043d\u0435 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0430 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441: \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u2014 \u0432\u043e\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u044b \u0438\u0437 RabbitMQ.\u0414\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:Deployment \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043f\u043b\u0438\u043a: 5\u0420\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b: 24\/7\u041f\u0438\u043a\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430: \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0434\u043d\u0438 10:00\u201318:00\u041d\u043e\u0447\u044c\u044e \u0438 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f\u041c\u0435\u0442\u0440\u0438\u043a\u0438:\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e: 5 \u0440\u0435\u043f\u043b\u0438\u043a \u00d7 24 \u0447\u0430\u0441\u0430 = 120 pod-hours\/\u0434\u0435\u043d\u044c\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f CPU: 8% (\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442)\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f ~18 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c compute \u0434\u043b\u044f workload: ~$180\/\u043c\u0435\u0441\u044f\u0446 (\u0438\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 $0.05\/pod-hour)\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043f\u043b\u0430\u0442\u0438\u043c \u0437\u0430 5 \u043f\u043e\u0434\u043e\u0432 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u043e, \u0445\u043e\u0442\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 6\u20138 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0434\u0435\u043d\u044c.\u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f KEDA\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:apiVersion: keda.sh\/v1alpha1kind: ScaledObjectmetadata:  name: orders-worker-scalerspec:  scaleTargetRef:    name: orders-worker  minReplicaCount: 0  maxReplicaCount: 10  triggers:    &#8212; type: rabbitmq      metadata:        queueName: orders        mode: QueueLength        value: &#171;20&#187;\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435:10:00\u201318:00 (\u043f\u0438\u043a): \u043e\u0447\u0435\u0440\u0435\u0434\u044c 150\u2013200 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2192 8\u201310 \u0440\u0435\u043f\u043b\u0438\u043a18:00\u201322:00 (\u0441\u043f\u0430\u0434): \u043e\u0447\u0435\u0440\u0435\u0434\u044c 20\u201340 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2192 1\u20132 \u0440\u0435\u043f\u043b\u0438\u043a\u043822:00\u201310:00 + \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\u044f \u2192 0 \u0440\u0435\u043f\u043b\u0438\u043a\u041c\u0435\u0442\u0440\u0438\u043a\u0438:\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c: ~40 pod-hours\/\u0434\u0435\u043d\u044c\u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f CPU \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f: 45\u201360% (\u043f\u043e\u0434\u044b \u0437\u0430\u043d\u044f\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u043e\u0439)Cold start \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: ~12 \u0441\u0435\u043a\u0443\u043d\u0434SLA \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (5 \u043c\u0438\u043d\u0443\u0442): \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c compute \u0434\u043b\u044f workload: ~$60\/\u043c\u0435\u0441\u044f\u0446\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f: 67% \u043d\u0430 \u044d\u0442\u043e\u043c workload ($120\/\u043c\u0435\u0441\u044f\u0446)\u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u0441 8% \u0434\u043e 45\u201360%SLA \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b \u2014 cold start \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u043c\u043a\u0438maxReplicaCount: 10 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u043f\u0440\u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f\u0445\u0413\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0414\u043e KEDA: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 5, \u043f\u043e\u0441\u043b\u0435 KEDA: \u043f\u0438\u043b\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0441 \u043f\u0438\u043a\u0430\u043c\u0438 \u0434\u043d\u0435\u043c \u0438 \u043d\u0443\u043b\u044f\u043c\u0438 \u043d\u043e\u0447\u044c\u044e\u042d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0442\u0438\u043f\u0438\u0447\u0435\u043d \u0434\u043b\u044f:\u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432, \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439, email-\u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043abatch-\u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u0447\u0430\u0441\u0430\u043c\u0438dev\/staging \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u21161. \u041e\u0447\u0435\u0440\u0435\u0434\u0438: \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0430 \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f KEDA \u2014 \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 RabbitMQ, Kafka, SQS \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c orders-worker, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 orders.\u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438:0 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 0 \u043f\u043e\u0434\u043e\u043210 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 1 \u043f\u043e\u0434100 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 -&gt; 10 \u043f\u043e\u0434\u043e\u0432\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0443\u0441\u0442\u0435\u043b\u0430 -&gt; \u043f\u043e\u0434\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c\u0414\u043b\u044f RabbitMQ \u043c\u043e\u0436\u043d\u043e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-486361","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/486361","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=486361"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/486361\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=486361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=486361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=486361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}