{"id":366043,"date":"2024-05-21T02:51:03","date_gmt":"2024-05-21T02:51:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=366043"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:51:03","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=366043","title":{"rendered":"<span>Personal (jesus) \u0441\u0442\u0435\u043d\u0434 \u2014 \u0440\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u0432 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/228\/bbd\/03f\/228bbd03f9ab806ad55eee8f214090c1.jpg\" width=\"1560\" height=\"880\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/228\/bbd\/03f\/228bbd03f9ab806ad55eee8f214090c1.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0417\u0430\u0445\u0430\u0440\u043e\u0432 \u0410\u043d\u0442\u043e\u043d, \u0438 \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Bimeister! \u0412\u0435\u0441\u044c \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0437\u0430 5 \u043b\u0435\u0442 \u043f\u0440\u043e\u0448\u0435\u043b \u043f\u0443\u0442\u044c \u043e\u0442 \u044d\u043d\u0438\u043a\u0435\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0435\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u0435\u0439\u0447\u0430\u0441 (\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c!). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b0\/601\/513\/8b06015134ec3aab351c7c674b8d17c5.png\" alt=\"\u0422\u043e\u0433\u0434\u0430\" title=\"\u0422\u043e\u0433\u0434\u0430\" width=\"300\" height=\"168\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b0\/601\/513\/8b06015134ec3aab351c7c674b8d17c5.png\"\/><\/p>\n<div><figcaption>\u0422\u043e\u0433\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2018 \u0433\u043e\u0434\u0430<\/strong>: \u043d\u0430\u0441 20 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0431\u044d\u043a-\u043e\u0444\u0438\u0441, \u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0442\u0440\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043b\u043b\u0435\u0433 \u0443\u0434\u043e\u0431\u043d\u043e\u0439. \u041e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434 \u0431\u044d\u043a-\u043e\u0444\u0438\u0441, \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0434\u0430\u043b\u0438 \u043d\u0430\u043c. \u041c\u044b \u0442\u043e\u043b\u044c\u043a\u043e-\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u0432 gitlab (\u0431\u044b\u043b bitbucket \u0438 jenkins) \u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448 ci\/cd. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b99\/dcb\/8a8\/b99dcb8a8dee5e2b7aecfb8dd365ef0c.png\" alt=\"\u0421 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c\" title=\"\u0421 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c\" width=\"868\" height=\"532\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b99\/dcb\/8a8\/b99dcb8a8dee5e2b7aecfb8dd365ef0c.png\"\/><\/p>\n<div><figcaption>\u0421 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0432\u043d\u0430\u0447\u0430\u043b\u0435. \u0411\u0438\u043b\u0434, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 docker-compose.yml \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0435\u043d\u0434\u044b \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0439\u0442\u0438 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438, \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>dev \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432,\u00a0<\/p>\n<\/li>\n<li>\n<p>test \u2014 \u0434\u043b\u044f QA,\u00a0<\/p>\n<\/li>\n<li>\n<p>prod \u2014 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438,\u00a0<\/p>\n<\/li>\n<li>\n<p>demo \u2014 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430\u043c,\u00a0<\/p>\n<\/li>\n<li>\n<p>sandbox \u2014 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b, \u043e\u0431\u0449\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u044b. \u041a\u0442\u043e \u0443\u0441\u043f\u0435\u043b, \u0442\u043e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043f\u0440\u043e \u043d\u0438\u0445 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0430\u0434\u043e, \u0438\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p><strong>\u041e\u043a\u0442\u044f\u0431\u0440\u044c 2020:<\/strong> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u043b\u044e\u0434\u0438, \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u0438\u0445 \u0443\u0436\u0435 \u043f\u044f\u0442\u044c.<\/p>\n<p><strong>\u0410\u043f\u0440\u0435\u043b\u044c 2021:<\/strong> \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0435, \u0438 \u0432\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 13 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432. \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0435. \u0414\u0430 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0448\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0443 \u0442\u0435\u0431\u044f \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e. \u041e\u043a\u043e\u043b\u043e 30 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.  <\/p>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2021:<\/strong> 19 sb \u0441\u0442\u0435\u043d\u0434\u043e\u0432. \u041e\u0434\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430 \u043d\u0430 24 GB RAM, 8 CPU, 300 GB disk.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f6\/76c\/232\/9f676c232d851fad243346a48304f1e3.png\" alt=\"\u041d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u0434\u044b - 2021\" title=\"\u041d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u0434\u044b - 2021\" width=\"462\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9f6\/76c\/232\/9f676c232d851fad243346a48304f1e3.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u0434\u044b &#8212; 2021<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0447\u0430\u0442\u0435 \u0442\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432\u0430\u043a\u0445\u0430\u043d\u0430\u043b\u0438\u044f \u00ab\u042f \u0437\u0430\u043d\u044f\u043b \u0442\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u0435\u043d\u0434, \u0430 \u043a\u0442\u043e \u043c\u043d\u0435 \u0432\u0441\u0435 \u0441\u043b\u043e\u043c\u0430\u043b?! \u042d\u0442\u043e \u0436\u0435 \u0431\u044b\u043b \u043c\u043e\u0439 \u0441\u0442\u0435\u043d\u0434\u00bb. \u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u043e\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0438, \u0435\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0434 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0434\u0443\u043c\u0430\u043b\u0438 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 kubernetes. \u0414\u0430\u0436\u0435 \u0431\u044b\u043b\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043c, \u043d\u043e \u0440\u0443\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u0438 \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0434\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430. \u041c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 DevOps.<\/p>\n<p><strong>\u0424\u0435\u0432\u0440\u0430\u043b\u044c 2022:<\/strong> \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 kubernetes, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 helm chart \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0432 \u043a\u0443\u0431\u0435\u0440\u0435 \u2014 ksb, \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043d\u0434 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf3\/05e\/db4\/bf305edb4da46502fad1d6a8aea50228.png\" alt=\"\u041f\u0435\u0440\u0432\u044b\u0435 ksb\" title=\"\u041f\u0435\u0440\u0432\u044b\u0435 ksb\" width=\"846\" height=\"347\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bf3\/05e\/db4\/bf305edb4da46502fad1d6a8aea50228.png\"\/><\/p>\n<div><figcaption>\u041f\u0435\u0440\u0432\u044b\u0435 ksb<\/figcaption><\/div>\n<\/figure>\n<p>to personal k8s &#8212; \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c<br \/>from personal k8s &#8212; \u0443\u0434\u0430\u043b\u0438\u0442\u044c<\/p>\n<p>\u0417\u0430\u0434\u0443\u043c\u043a\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0442\u043a\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0439, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u043d\u0430\u0436\u0430\u043b (ksb-firstname-lastname) \u0432\u0441\u0435 \u044d\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043e\u0442\u0434\u0430\u0435\u0442\u0441\u044f \u0432 QA \u0438\u043b\u0438 \u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443. \u041f\u043e\u0441\u043b\u0435, \u0441\u0442\u0435\u043d\u0434 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0414\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0430 \u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u0430.<\/p>\n<p>\u0410\u0434\u0440\u0435\u0441, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u0442\u0435\u043d\u0434 : <u>https:\/\/$ENV_NAME.dev.example.io<\/u> <\/p>\n<pre><code>ENV_NAME=\"ksb-$(echo ${GITLAB_USER_LOGIN::45} | sed -r 's\/\\.\/-\/g;s\/\\-$\/\/')-$ENV_NUM\"<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f ksb-anton-zakharov-1.dev.example.io \u2014 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434,<br \/>ksb-anton-zakharov-2.dev.example.io \u2014 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435, \u0438 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u00ab\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u043f\u043e\u043f\u043e\u0437\u0436\u0435\u00bb. <\/p>\n<pre><code>ST_KUBE_ENV_NUM=$(kubectl get ns --no-headers -o custom-columns=\":metadata.name\" | grep -c \"^ksb\" ) || ST_KUBE_ENV_NUM=0 ; ENV_EXISTS=$(kubectl get ns --no-headers -o custom-columns=\":metadata.name\" | grep -c -x \"$ENV_NAME\") || ENV_EXISTS=0 ; echo -e \"${TXT_CYAN}Number of deployed kubernetes environments now is ${ST_KUBE_ENV_NUM}${TXT_CLEAR}\" ; if ([ \"$ST_KUBE_ENV_NUM\" -ge \"$MAX_KUBE_ENV_NUM\" ] &amp;&amp; [ \"$ENV_EXISTS\" -eq 0 ]); then echo -e \"${TXT_RED}The number of kubernetes environments exceeded ($MAX_KUBE_ENV_NUM is maximum)!${TXT_CLEAR}\" &amp;&amp; exit 1; fi ;<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b, \u0441\u0440\u043e\u043a \u0438\u0445 \u0436\u0438\u0437\u043d\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u0438 \u043d\u0430 \u0441\u0443\u0442\u043a\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043b\u043e\u044f. \u0421\u0440\u043e\u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u0438\u0442\u043b\u0430\u0431 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 auto_stop:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a0\/bf5\/b07\/2a0bf5b07b8deb87fde57a920adfd672.png\" alt=\"gitlab auto_stop\" title=\"gitlab auto_stop\" width=\"302\" height=\"382\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a0\/bf5\/b07\/2a0bf5b07b8deb87fde57a920adfd672.png\"\/><\/p>\n<div><figcaption>gitlab auto_stop<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u0441\u0442\u0435\u043d\u0434 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u043e\u0442\u0441\u0447\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u0421\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>pin \u2014 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c auto_stop,\u00a0<\/p>\n<\/li>\n<li>\n<p>view deployment \u2014 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f,\u00a0<\/p>\n<\/li>\n<li>\n<p>stop \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c undeploy.<\/p>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6cf\/633\/bd5\/6cf633bd5cd1b92339bbdeec8d0b32f0.png\" alt=\"Environments\" title=\"Environments\" width=\"1210\" height=\"204\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6cf\/633\/bd5\/6cf633bd5cd1b92339bbdeec8d0b32f0.png\"\/><\/p>\n<div><figcaption>Environments<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0442\u0435\u043d\u0434\u044b \u0441 docker-\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c, \u0438\u0445 \u0441\u0442\u0430\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u0422\u0430\u043a \u043c\u044b \u0438 \u0436\u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0440\u043e\u0441\u043b\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><strong>dev<\/strong> \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0442\u0435\u043d\u0434\u0430\u043c\u0438,<\/p>\n<\/li>\n<li>\n<p><strong>regress<\/strong> \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f,<\/p>\n<\/li>\n<li>\n<p><strong>stress<\/strong> \u2014 \u0434\u043b\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0440.,<\/p>\n<\/li>\n<li>\n<p><strong>\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/strong> \u2014 \u043c\u043e\u0436\u0435\u043c \u043b\u043e\u043c\u0430\u0442\u044c \u0435\u0433\u043e, \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0448 dev \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0443\u043c\u0438\u0440\u0430\u043b \u0431\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e \u0438\u0437-\u0437\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c. \u0414\u0443\u043c\u0430\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2023:<\/strong> \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0432 k8s \u2014 60 \u0448\u0442\u0443\u043a. \u00ab\u041c\u0410\u041b\u041e! \u2014 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043b\u044e\u0434\u0438, \u2014 \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442!\u00bb  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cc7\/bf9\/405\/cc7bf9405c7803e7855ff2cdf4ad8344.png\" alt=\"\u0414\u0430\u0439\u0442\u0435 \u0435\u0449\u0435!!!\" title=\"\u0414\u0430\u0439\u0442\u0435 \u0435\u0449\u0435!!!\" width=\"1400\" height=\"966\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc7\/bf9\/405\/cc7bf9405c7803e7855ff2cdf4ad8344.png\"\/><\/p>\n<div><figcaption>\u0414\u0430\u0439\u0442\u0435 \u0435\u0449\u0435!!!<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0414\u0435\u043a\u0430\u0431\u0440\u044c 2023:<\/strong> \u0432\u043e\u0442 \u043a \u0447\u0435\u043c\u0443 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/631\/22c\/471\/63122c4712ae3051a49f15524f86c1f1.png\" alt=\"\u0421\u0435\u0439\u0447\u0430\u0441\" title=\"\u0421\u0435\u0439\u0447\u0430\u0441\" width=\"300\" height=\"168\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/631\/22c\/471\/63122c4712ae3051a49f15524f86c1f1.png\"\/><\/p>\n<div><figcaption>\u0421\u0435\u0439\u0447\u0430\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u043c \u043a\u0443\u043f\u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432.<\/p>\n<p>\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437\u0440\u044f\u0434\u043d\u043e \u043f\u043e\u0445\u0443\u0434\u0435\u043b, \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u0448 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 pipeline (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d stage):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b93\/442\/d56\/b93442d5615ab14a83605d8ea133e1d7.png\" alt=\"\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\" title=\"\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\" width=\"1600\" height=\"465\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b93\/442\/d56\/b93442d5615ab14a83605d8ea133e1d7.png\"\/><\/p>\n<div><figcaption>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 sandboxes:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c69\/f9c\/d3b\/c69f9cd3bc8712f6b5be56fdd995a5c5.png\" alt=\"Sandboxes\" title=\"Sandboxes\" width=\"1495\" height=\"719\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c69\/f9c\/d3b\/c69f9cd3bc8712f6b5be56fdd995a5c5.png\"\/><\/p>\n<div><figcaption>Sandboxes<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 to personal ksb 1, <em>to personal k8s 1 manual<\/em> \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/738\/eed\/908\/738eed9080366a93b7600b905c639cce.png\" alt=\"\u0412\u043d\u0443\u0442\u0440\u0438 to personal ksb 1\" title=\"\u0412\u043d\u0443\u0442\u0440\u0438 to personal ksb 1\" width=\"864\" height=\"149\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/738\/eed\/908\/738eed9080366a93b7600b905c639cce.png\"\/><\/p>\n<div><figcaption>\u0412\u043d\u0443\u0442\u0440\u0438 to personal ksb 1<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0433\u043b\u0443\u0431\u0436\u0435, \u043b\u043e\u0433 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0434\u0436\u043e\u0431\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/be7\/5e5\/c55\/be75e5c55bc1bc7245ed9e96de485507.png\" alt=\"\u041b\u043e\u0433 \u0434\u0436\u043e\u0431\u044b\" title=\"\u041b\u043e\u0433 \u0434\u0436\u043e\u0431\u044b\" width=\"1188\" height=\"644\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be7\/5e5\/c55\/be75e5c55bc1bc7245ed9e96de485507.png\"\/><\/p>\n<div><figcaption>\u041b\u043e\u0433 \u0434\u0436\u043e\u0431\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0434\u0436\u043e\u0431\u044b \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0435\u043d\u0434\u0430, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 kube-dashboard, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:<br \/><a href=\"https:\/\/habr.com\/ru\/companies\/bimeister\/articles\/779768\/\"><u>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f DevOps: \u041a\u0430\u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0438 Grafana \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/u><\/a><\/p>\n<p>Debug-proxy \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 not found), \u044d\u0442\u043e <a href=\"https:\/\/github.com\/Tecnativa\/docker-tcp-proxy\"><u>tcp-proxy<\/u><\/a>. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c external-ip \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b, \u2014 \u0442\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 QA \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u0434\u0430\u043c \u0441\u0432\u043e\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u043e\u043a \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041c\u0438\u043d\u0443\u0441 \u2014 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0435 ip).  <\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f: \u0438\u043d\u0444\u0440\u0430, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430\u0432\u0442\u043e\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043d\u0435\u0432\u0435\u0437\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0438\u0445 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0434\u0436\u043e\u0431\u0435, \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c: <\/p>\n<pre><code>helm upgrade --install ${RELEASE_NAME} \"${CHART_FOLDER}\/\" \\   --namespace \"$ENV_NAME\"  \\   -f ${CHART_FOLDER}\/values.yaml ${PRODUCT_NAME:+-f ${CHART_FOLDER}\/}${PRODUCT_NAME}${PRODUCT_NAME:+-values.yaml} $ADDITIONAL_ENV_VALUES  \\   --set image.tag=\"${REWRITE_CONTAINER_VERSION:-$CONTAINER_VERSION}\"  \\   --set global.ingress.enabled=\"true\"  \\   --set global.ingress.hosts[0]=\"$ENV_URL\"  \\   --set global.image.pullPolicy=\"$HELM_IMAGE_PULL_POLICY\"  \\   --set debug_proxy.enabled=true  \\   --wait  \\   --timeout ${TIMEOUT}m ${HELM_EXTRA_FLAGS}  \\ &amp;&amp; mkdir -p \"${DEPLOYED_STANDS_FOLDER}\"  \\ &amp;&amp; echo ${DYNAMIC_ENVIRONMENT_URL} > \"${DEPLOYED_STANDS_FOLDER}\/$ENV_NAME\"  \\ &amp;&amp; echo -e \"${TXT_CYAN}Environment API address - https:\/\/$ENV_URL${TXT_CLEAR}\"  \\ &amp;&amp; echo -e \"${TXT_CYAN}Kubernetes Dashboard - $KUBE_DASH_URL${TXT_CLEAR}\"  \\ ) || (  \\ export JOB_EXIT_CODE=\"$?\"  \\ &amp;&amp; echo -e \"${TXT_RED}========================  \u0427\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a!!!  ========================${TXT_CLEAR}\"  \\ &amp;&amp; export RELEASE_NAME=${RELEASE_NAME} \\ &amp;&amp; export ENV_NAME=${ENV_NAME} \\ &amp;&amp; export TIMEOUT=${TIMEOUT} \\ &amp;&amp; .\/kubectl_show_error.sh  \\ &amp;&amp; echo -e \"${TXT_RED}Helm  \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.${TXT_CLEAR}\" \\ &amp;&amp; echo -e \"${TXT_GREEN}\u041b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: ${TXT_CYAN}https:\/\/monitoring.example.io\/d\/o6-BGgnnk\/loki-kubernetes-logs?orgId=1&amp;var-query=&amp;var-namespace=${ENV_NAME}&amp;var-stream=All&amp;var-container=All&amp;from=${TIME_IN_UTC_MILLISECONDS_HELM_STARTED_AT}&amp;to=now${TXT_CLEAR}\" \\ <\/code><\/pre>\n<p>\u0433\u0434\u0435 kubectl_show_error.sh:<\/p>\n<pre><code>#!\/bin\/sh   export RELEASE_NAME=${RELEASE_NAME:-\"bimeister\"} export ENV_NAME=${ENV_NAME:-\"bimeister\"} export TAIL=${TAIL:-20} export TIMEOUT=$(( ${TIMEOUT:-20} + 5 ))   PROBLEM_PODS=\"$(kubectl get pods -n $ENV_NAME -o jsonpath='{range .items[*]}{.status.containerStatuses[*].ready} {.metadata.name} {end}' | grep \"false\" | rev |cut -d ' ' -f1 | rev )\"   for POD in $PROBLEM_PODS do     JS=$(kubectl get pod -n $ENV_NAME $POD -o json)       # init-container \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0435\u0433\u043e, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0441\u0442\u0440\u043e\u043a\u0438 \u043b\u043e\u0433\u0430     if [[ \"true\" == \"$(echo $JS | jq '.status.initContainerStatuses[].state | any(paths; .[] == \"running\")' | grep true | head -n1)\" ]] ; then         echo -e \"======================         ${TXT_RED}init-container \u0432 \u043f\u043e\u0434\u0435 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b${TXT_CLEAR}\" ;         kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --all-containers=true --tail=3 ;     # CrahLoopBackOff     elif [[ \"\" != \"$(echo $JS | jq '.status.containerStatuses[] | select(.state.waiting.reason == \"CrashLoopBackOff\")')\" ]] ; then         echo -e \"=====================             ${TXT_RED}\u041f\u043e\u0434 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c.             \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u0432: ${TXT_GREED}$(echo $JS | jq '.status.containerStatuses[].restartCount')${TXT_RED}             \u041b\u043e\u0433 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: ${TXT_CLEAR}\" ;             kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --since=${TIMEOUT}m ;     # imagePullBackOff     elif [[ \"true\" == \"$(echo $JS | jq '.status.containerStatuses[].state | any(paths; .[-1] == \"waiting\")')\" ]] ; then         echo -e \"======================             ${TXT_RED}\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u043e\u0434\u0435 ${TXT_GREED}${POD}${TXT_RED}             \u0438\u043b\u0438 \u043f\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043d\u043e\u0434\u0443.             \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0436\u0435:${TXT_CLEAR}\" ;         echo $JS | jq '.status.containerStatuses[].state.waiting' ;         echo -e \"${TXT_RED}\u041b\u043e\u0433 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438:${TXT_CLEAR}\" ;         kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --since=${TIMEOUT}m ;     # \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 unready     elif [[ \"false\" == \"$(echo $JS | jq '.status.containerStatuses[].ready')\" ]] ; then         echo -e \"======================             ${TXT_RED}\u041f\u043e\u0434 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 ready. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 healthcheck'a \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442.             \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u0432: ${TXT_GREED}$(echo $JS | jq '.status.containerStatuses[].restartCount')${TXT_RED}             \u041b\u043e\u0433 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: ${TXT_CLEAR}\" ;         kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --since=${TIMEOUT}m ;     # \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c (\u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043b\u043e\u0433\u0438)     else         echo -e \"======================             ${TXT_RED}\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043f\u043e\u0434\u0435 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b. \u041d\u0438\u0436\u0435 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043b\u043e\u0433: ${TXT_CLEAR}\"         echo $JS | jq '.status.conditions'   ;         kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --since=${TIMEOUT}m ;     fi done echo -e \"${TXT_CYAN}\u0421\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0432:${TXT_CLEAR}\" kubectl get pods $PROBLEM_PODS -n $ENV_NAME -o=custom-columns=POD_NAME:.metadata.name,STATUS:.status.phase,INIT_CONTAINERS:.spec.initContainers[*].name<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/65b\/b4c\/d5b\/65bb4cd5b7b158a837903803b8d96c5d.png\" alt=\"Error\" title=\"Error\" width=\"1560\" height=\"521\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/65b\/b4c\/d5b\/65bb4cd5b7b158a837903803b8d96c5d.png\"\/><\/p>\n<div><figcaption>Error<\/figcaption><\/div>\n<\/figure>\n<p>Dashboard \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u0443\u0431\u0435\u0440\u043e\u0432\u0441\u043a\u0438\u0439, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 AD + keycloak.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 k8s \u0442\u0430\u043a\u043e\u0439 \u0436\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432 AD, \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u043c, \u0438\u043b\u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c kubeconfig, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 kubectl \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f k8s (lens, k9s, \u0438 \u0442.\u0434).<\/p>\n<p>\u0413\u0438\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 auto_stop \u0438 \u0437\u0430\u043f\u0438\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0438\u043b\u0430, \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u044b \u0432 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u043b\u044f\u043b\u0438\u0441\u044c. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e:  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a1\/b38\/6a9\/6a1b386a949511c321cdcf829cbce9b1.png\" alt=\"pin\/unpin\" title=\"pin\/unpin\" width=\"342\" height=\"229\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a1\/b38\/6a9\/6a1b386a949511c321cdcf829cbce9b1.png\"\/><\/p>\n<div><figcaption>pin\/unpin<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0434\u0435\u043f\u043b\u043e\u0435 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u0439\u0431\u043b \u0441 \u0434\u0430\u0442\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u0436\u043e\u0431\u0430 pin \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0435\u0439\u0431\u043b bimeister\/stand.pinned=true, unpin \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<p>\u041d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u043f\u043e \u043a\u0440\u043e\u043d\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u044d\u0442\u0438 \u043b\u0435\u0439\u0431\u043b\u044b. \u0415\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0434 \u0436\u0438\u0432\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0443\u0442\u043e\u043a \u0438 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043b\u0435\u0439\u0431\u043b\u0430 bimeister\/stand.pinned=true, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 bimeister\/stand.pinned=true, \u043e\u043d \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043d\u0438\u043c\u0435\u0448\u044c \u044d\u0442\u043e\u0442 \u043b\u0435\u0439\u0431\u043b, \u0438\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0448\u044c \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041f\u043e\u0441\u043b\u0435 \u0430\u0432\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u00ab\u0438\u0437\u0432\u0438\u043d\u0438, \u043d\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442\u00bb. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u043d\u0435\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0436\u0438\u0432\u0435\u0442 5 \u0434\u043d\u0435\u0439, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u0441 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u00ab\u0430 \u0442\u044b \u0442\u043e\u0447\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0440\u0430 \u0435\u0433\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c?\u00bb<\/p>\n<pre><code>#!\/bin\/bash  email_on_namespace_deletion(){     LABELS=$(kubectl get ns $1 -o json | jq -r '.metadata.labels' | grep 'bimeister\/' | sed 's\/\"\/\/g' | sed 's\/,\/\/g' | sed  ':a;N;$!ba;s\/\\n\/\\\\n\/g')     curl --header \"Content-Type: application\/json\"  --request POST  --data \"{\\\"namespace\\\":\\\"$1\\\",\\\"whoami\\\":\\\"\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043d\u0435\u0437\u0430\u043f\u0438\u043d\u0435\u043d\u044b\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432 delete_not_pinned_namespace.sh\\\", \\\"additional_info\\\": \\\"\u0412\u0440\u0435\u043c\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438 \u044f: $(date)\\\", \\\"labels\\\":\\\"$LABELS\\\"}\" https:\/\/devops-api.dev.example.io\/namespace_deleted }  # Define the current time and the time threshold (24 hours ago)  THRESHHOLD_TO_DELETE_IN_DAYS=${THRESHHOLD_TO_DELETE_IN_DAYS:-1} THRESHHOLD_TO_DELETE_IN_SECONDS=$(( 27 * 3600 * $THRESHHOLD_TO_DELETE_IN_DAYS )) current_time=$(date +%s) threshold_time=$((current_time - \"$THRESHHOLD_TO_DELETE_IN_SECONDS\")) # 86400 seconds in a day echo $THRESHHOLD_TO_DELETE_IN_SECONDS # List all namespaces and iterate through them for namespace in $(kubectl get ns -l bimeister\/stand.updated.time -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\\n' |  grep -E 'ksb-[a-z]+-[a-z]+' | sort) do     # Get the stand.started_time label value     started_time_label=$(kubectl get ns \"$namespace\" -o jsonpath='{.metadata.labels.bimeister\\\/stand\\.updated\\.time}')      # Convert label time to Unix timestamp     # Convert YYYY-MM-DDTHH-MM to YYYY-MM-DD HH:MM     formatted_time_label=\"${started_time_label:0:10} ${started_time_label:11:2}:${started_time_label:14:2}\"      # Use 'date' to convert to Unix timestamp     label_time=$(date -d \"$formatted_time_label\" +%s)      # Check if stand.pinned label exists     pinned_label=$(kubectl get ns \"$namespace\" -o jsonpath='{.metadata.labels.bimeister\\\/stand\\.pinned}')      # If label time is older than the threshold and pinned label is not true, delete the namespace     if [[ $label_time -le $threshold_time  ]] &amp;&amp; [[ $pinned_label != \"true\" ]]; then         echo label_time=$label_time threshold_time=$threshold_time         echo \"Deleting namespace: $namespace\"          email_on_namespace_deletion $namespace                  kubectl delete ns $namespace     fi done <\/code><\/pre>\n<p><a href=\"https:\/\/devops-api.dev.bimeister.io\">https:\/\/devops-api.dev.example.io<\/a> &#8212; \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u043e\u0435 api \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/42e\/cb1\/d75\/42ecb1d75afbbefdc32478431416b04a.png\" alt=\"devops-api\" title=\"devops-api\" width=\"667\" height=\"253\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42e\/cb1\/d75\/42ecb1d75afbbefdc32478431416b04a.png\"\/><\/p>\n<div><figcaption>devops-api<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0438\u0437 \u043f\u043b\u044e\u0448\u0435\u043a:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0434\u0438 \u0441\u0430\u043c\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0443\u043f\u0430\u043b\u043e, \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c. \u041f\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0443\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>pg_admin \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u043c \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435. \u041b\u044e\u0431\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0443\u043a\u0430\u0437\u0430\u0432 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0435\u043a\u0430\u043f\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 kubernetes (k3s, deckhouse, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 telepresence). \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u0435\u0441\u0441 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432: \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e-\u0442\u043e, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e-\u0442\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 ~200 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434. \u0414\u043b\u044f \u043d\u0438\u0445 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c ~20 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c \u0438 130 \u0432 kubernetes.\u00a0<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u2014 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435. \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0448\u0435\u0433\u043e RND \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0435, \u043e \u0447\u0435\u043c \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/788234\/\"> https:\/\/habr.com\/ru\/articles\/788234\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0417\u0430\u0445\u0430\u0440\u043e\u0432 \u0410\u043d\u0442\u043e\u043d, \u0438 \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Bimeister! \u0412\u0435\u0441\u044c \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0437\u0430 5 \u043b\u0435\u0442 \u043f\u0440\u043e\u0448\u0435\u043b \u043f\u0443\u0442\u044c \u043e\u0442 \u044d\u043d\u0438\u043a\u0435\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0435\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u0435\u0439\u0447\u0430\u0441 (\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c!). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.  <\/p>\n<figure class=\"\">\n<div><figcaption>\u0422\u043e\u0433\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2018 \u0433\u043e\u0434\u0430<\/strong>: \u043d\u0430\u0441 20 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0431\u044d\u043a-\u043e\u0444\u0438\u0441, \u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0442\u0440\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043b\u043b\u0435\u0433 \u0443\u0434\u043e\u0431\u043d\u043e\u0439. \u041e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434 \u0431\u044d\u043a-\u043e\u0444\u0438\u0441, \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0434\u0430\u043b\u0438 \u043d\u0430\u043c. \u041c\u044b \u0442\u043e\u043b\u044c\u043a\u043e-\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u0432 gitlab (\u0431\u044b\u043b bitbucket \u0438 jenkins) \u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448 ci\/cd. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0432\u043d\u0430\u0447\u0430\u043b\u0435. \u0411\u0438\u043b\u0434, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 docker-compose.yml \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0435\u043d\u0434\u044b \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0439\u0442\u0438 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438, \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>dev \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432,\u00a0<\/p>\n<\/li>\n<li>\n<p>test \u2014 \u0434\u043b\u044f QA,\u00a0<\/p>\n<\/li>\n<li>\n<p>prod \u2014 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438,\u00a0<\/p>\n<\/li>\n<li>\n<p>demo \u2014 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430\u043c,\u00a0<\/p>\n<\/li>\n<li>\n<p>sandbox \u2014 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b, \u043e\u0431\u0449\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u044b. \u041a\u0442\u043e \u0443\u0441\u043f\u0435\u043b, \u0442\u043e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043f\u0440\u043e \u043d\u0438\u0445 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0430\u0434\u043e, \u0438\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p><strong>\u041e\u043a\u0442\u044f\u0431\u0440\u044c 2020:<\/strong> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u043b\u044e\u0434\u0438, \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u0438\u0445 \u0443\u0436\u0435 \u043f\u044f\u0442\u044c.<\/p>\n<p><strong>\u0410\u043f\u0440\u0435\u043b\u044c 2021:<\/strong> \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0435, \u0438 \u0432\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 13 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432. \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0435. \u0414\u0430 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0448\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0443 \u0442\u0435\u0431\u044f \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e. \u041e\u043a\u043e\u043b\u043e 30 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.  <\/p>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2021:<\/strong> 19 sb \u0441\u0442\u0435\u043d\u0434\u043e\u0432. \u041e\u0434\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430 \u043d\u0430 24 GB RAM, 8 CPU, 300 GB disk.<\/p>\n<figure class=\"\">\n<div><figcaption>\u041d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u0434\u044b &#8212; 2021<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0447\u0430\u0442\u0435 \u0442\u0432\u043e\u0440\u0438\u0442\u0441\u044f \u0432\u0430\u043a\u0445\u0430\u043d\u0430\u043b\u0438\u044f \u00ab\u042f \u0437\u0430\u043d\u044f\u043b \u0442\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u0435\u043d\u0434, \u0430 \u043a\u0442\u043e \u043c\u043d\u0435 \u0432\u0441\u0435 \u0441\u043b\u043e\u043c\u0430\u043b?! \u042d\u0442\u043e \u0436\u0435 \u0431\u044b\u043b \u043c\u043e\u0439 \u0441\u0442\u0435\u043d\u0434\u00bb. \u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u043e\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0438, \u0435\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0434 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0434\u0443\u043c\u0430\u043b\u0438 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 kubernetes. \u0414\u0430\u0436\u0435 \u0431\u044b\u043b\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043c, \u043d\u043e \u0440\u0443\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u0438 \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0434\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430. \u041c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 DevOps.<\/p>\n<p><strong>\u0424\u0435\u0432\u0440\u0430\u043b\u044c 2022:<\/strong> \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 kubernetes, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 helm chart \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0432 \u043a\u0443\u0431\u0435\u0440\u0435 \u2014 ksb, \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043d\u0434 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0435\u0440\u0432\u044b\u0435 ksb<\/figcaption><\/div>\n<\/figure>\n<p>to personal k8s &#8212; \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c<br \/>from personal k8s &#8212; \u0443\u0434\u0430\u043b\u0438\u0442\u044c<\/p>\n<p>\u0417\u0430\u0434\u0443\u043c\u043a\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0442\u043a\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0439, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u043d\u0430\u0436\u0430\u043b (ksb-firstname-lastname) \u0432\u0441\u0435 \u044d\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043e\u0442\u0434\u0430\u0435\u0442\u0441\u044f \u0432 QA \u0438\u043b\u0438 \u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443. \u041f\u043e\u0441\u043b\u0435, \u0441\u0442\u0435\u043d\u0434 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0414\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0430 \u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u0430.<\/p>\n<p>\u0410\u0434\u0440\u0435\u0441, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u0442\u0435\u043d\u0434 : <u>https:\/\/$ENV_NAME.dev.example.io<\/u> <\/p>\n<pre><code>ENV_NAME=\"ksb-$(echo ${GITLAB_USER_LOGIN::45} | sed -r 's\/\\.\/-\/g;s\/\\-$\/\/')-$ENV_NUM\"<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f ksb-anton-zakharov-1.dev.example.io \u2014 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434,<br \/>ksb-anton-zakharov-2.dev.example.io \u2014 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435, \u0438 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u00ab\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u043f\u043e\u043f\u043e\u0437\u0436\u0435\u00bb. <\/p>\n<pre><code>ST_KUBE_ENV_NUM=$(kubectl get ns --no-headers -o custom-columns=\":metadata.name\" | grep -c \"^ksb\" ) || ST_KUBE_ENV_NUM=0 ; ENV_EXISTS=$(kubectl get ns --no-headers -o custom-columns=\":metadata.name\" | grep -c -x \"$ENV_NAME\") || ENV_EXISTS=0 ; echo -e \"${TXT_CYAN}Number of deployed kubernetes environments now is ${ST_KUBE_ENV_NUM}${TXT_CLEAR}\" ; if ([ \"$ST_KUBE_ENV_NUM\" -ge \"$MAX_KUBE_ENV_NUM\" ] &amp;&amp; [ \"$ENV_EXISTS\" -eq 0 ]); then echo -e \"${TXT_RED}The number of kubernetes environments exceeded ($MAX_KUBE_ENV_NUM is maximum)!${TXT_CLEAR}\" &amp;&amp; exit 1; fi ;<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b, \u0441\u0440\u043e\u043a \u0438\u0445 \u0436\u0438\u0437\u043d\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u0438 \u043d\u0430 \u0441\u0443\u0442\u043a\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043b\u043e\u044f. \u0421\u0440\u043e\u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u0438\u0442\u043b\u0430\u0431 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 auto_stop:<\/p>\n<figure class=\"\">\n<div><figcaption>gitlab auto_stop<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u0441\u0442\u0435\u043d\u0434 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u043e\u0442\u0441\u0447\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u0421\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>pin \u2014 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c auto_stop,\u00a0<\/p>\n<\/li>\n<li>\n<p>view deployment \u2014 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f,\u00a0<\/p>\n<\/li>\n<li>\n<p>stop \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c undeploy.<\/p>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>Environments<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0442\u0435\u043d\u0434\u044b \u0441 docker-\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c, \u0438\u0445 \u0441\u0442\u0430\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u0422\u0430\u043a \u043c\u044b \u0438 \u0436\u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0440\u043e\u0441\u043b\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><strong>dev<\/strong> \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0442\u0435\u043d\u0434\u0430\u043c\u0438,<\/p>\n<\/li>\n<li>\n<p><strong>regress<\/strong> \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f,<\/p>\n<\/li>\n<li>\n<p><strong>stress<\/strong> \u2014 \u0434\u043b\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0440.,<\/p>\n<\/li>\n<li>\n<p><strong>\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/strong> \u2014 \u043c\u043e\u0436\u0435\u043c \u043b\u043e\u043c\u0430\u0442\u044c \u0435\u0433\u043e, \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0448 dev \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0443\u043c\u0438\u0440\u0430\u043b \u0431\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e \u0438\u0437-\u0437\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c. \u0414\u0443\u043c\u0430\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<p><strong>\u041d\u043e\u044f\u0431\u0440\u044c 2023:<\/strong> \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0432 k8s \u2014 60 \u0448\u0442\u0443\u043a. \u00ab\u041c\u0410\u041b\u041e! \u2014 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043b\u044e\u0434\u0438, \u2014 \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442!\u00bb  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0430\u0439\u0442\u0435 \u0435\u0449\u0435!!!<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0414\u0435\u043a\u0430\u0431\u0440\u044c 2023:<\/strong> \u0432\u043e\u0442 \u043a \u0447\u0435\u043c\u0443 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438. <\/p>\n<figure class=\"\">\n<div><figcaption>\u0421\u0435\u0439\u0447\u0430\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u043c \u043a\u0443\u043f\u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432.<\/p>\n<p>\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437\u0440\u044f\u0434\u043d\u043e \u043f\u043e\u0445\u0443\u0434\u0435\u043b, \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<p>\u041d\u0430\u0448 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 pipeline (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d stage):<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 sandboxes:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Sandboxes<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 to personal ksb 1, <em>to personal k8s 1 manual<\/em> \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u043d\u0443\u0442\u0440\u0438 to personal ksb 1<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0433\u043b\u0443\u0431\u0436\u0435, \u043b\u043e\u0433 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0434\u0436\u043e\u0431\u044b:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041b\u043e\u0433 \u0434\u0436\u043e\u0431\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0434\u0436\u043e\u0431\u044b \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0435\u043d\u0434\u0430, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 kube-dashboard, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:<br \/><a href=\"https:\/\/habr.com\/ru\/companies\/bimeister\/articles\/779768\/\"><u>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f DevOps: \u041a\u0430\u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0438 Grafana \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/u><\/a><\/p>\n<p>Debug-proxy \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 not found), \u044d\u0442\u043e <a href=\"https:\/\/github.com\/Tecnativa\/docker-tcp-proxy\"><u>tcp-proxy<\/u><\/a>. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c external-ip \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b, \u2014 \u0442\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 QA \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u0434\u0430\u043c \u0441\u0432\u043e\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u043e\u043a \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041c\u0438\u043d\u0443\u0441 \u2014 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0435 ip).  <\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f: \u0438\u043d\u0444\u0440\u0430, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430\u0432\u0442\u043e\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043d\u0435\u0432\u0435\u0437\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0438\u0445 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0434\u0436\u043e\u0431\u0435, \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c: <\/p>\n<pre><code>helm upgrade --install ${RELEASE_NAME} \"${CHART_FOLDER}\/\" \\   --namespace \"$ENV_NAME\"  \\   -f ${CHART_FOLDER}\/values.yaml ${PRODUCT_NAME:+-f ${CHART_FOLDER}\/}${PRODUCT_NAME}${PRODUCT_NAME:+-values.yaml} $ADDITIONAL_ENV_VALUES  \\   --set image.tag=\"${REWRITE_CONTAINER_VERSION:-$CONTAINER_VERSION}\"  \\   --set global.ingress.enabled=\"true\"  \\   --set global.ingress.hosts[0]=\"$ENV_URL\"  \\   --set global.image.pullPolicy=\"$HELM_IMAGE_PULL_POLICY\"  \\   --set debug_proxy.enabled=true  \\   --wait  \\   --timeout ${TIMEOUT}m ${HELM_EXTRA_FLAGS}  \\ &amp;&amp; mkdir -p \"${DEPLOYED_STANDS_FOLDER}\"  \\ &amp;&amp; echo ${DYNAMIC_ENVIRONMENT_URL} > \"${DEPLOYED_STANDS_FOLDER}\/$ENV_NAME\"  \\ &amp;&amp; echo -e \"${TXT_CYAN}Environment API address - https:\/\/$ENV_URL${TXT_CLEAR}\"  \\ &amp;&amp; echo -e \"${TXT_CYAN}Kubernetes Dashboard - $KUBE_DASH_URL${TXT_CLEAR}\"  \\ ) || (  \\ export JOB_EXIT_CODE=\"$?\"  \\ &amp;&amp; echo -e \"${TXT_RED}========================  \u0427\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a!!!  ========================${TXT_CLEAR}\"  \\ &amp;&amp; export RELEASE_NAME=${RELEASE_NAME} \\ &amp;&amp; export ENV_NAME=${ENV_NAME} \\ &amp;&amp; export TIMEOUT=${TIMEOUT} \\ &amp;&amp; .\/kubectl_show_error.sh  \\ &amp;&amp; echo -e \"${TXT_RED}Helm  \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.${TXT_CLEAR}\" \\ &amp;&amp; echo -e \"${TXT_GREEN}\u041b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: ${TXT_CYAN}https:\/\/monitoring.example.io\/d\/o6-BGgnnk\/loki-kubernetes-logs?orgId=1&amp;var-query=&amp;var-namespace=${ENV_NAME}&amp;var-stream=All&amp;var-container=All&amp;from=${TIME_IN_UTC_MILLISECONDS_HELM_STARTED_AT}&amp;to=now${TXT_CLEAR}\" \\ <\/code><\/pre>\n<p>\u0433\u0434\u0435 kubectl_show_error.sh:<\/p>\n<pre><code>#!\/bin\/sh   export RELEASE_NAME=${RELEASE_NAME:-\"bimeister\"} export ENV_NAME=${ENV_NAME:-\"bimeister\"} export TAIL=${TAIL:-20} export TIMEOUT=$(( ${TIMEOUT:-20} + 5 ))   PROBLEM_PODS=\"$(kubectl get pods -n $ENV_NAME -o jsonpath='{range .items[*]}{.status.containerStatuses[*].ready} {.metadata.name} {end}' | grep \"false\" | rev |cut -d ' ' -f1 | rev )\"   for POD in $PROBLEM_PODS do     JS=$(kubectl get pod -n $ENV_NAME $POD -o json)       # init-container \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0435\u0433\u043e, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0441\u0442\u0440\u043e\u043a\u0438 \u043b\u043e\u0433\u0430     if [[ \"true\" == \"$(echo $JS | jq '.status.initContainerStatuses[].state | any(paths; .[] == \"running\")' | grep true | head -n1)\" ]] ; then         echo -e \"======================         ${TXT_RED}init-container \u0432 \u043f\u043e\u0434\u0435 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b${TXT_CLEAR}\" ;         kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --all-containers=true --tail=3 ;     # CrahLoopBackOff     elif [[ \"\" != \"$(echo $JS | jq '.status.containerStatuses[] | select(.state.waiting.reason == \"CrashLoopBackOff\")')\" ]] ; then         echo -e \"=====================             ${TXT_RED}\u041f\u043e\u0434 ${TXT_GREED}${POD}${TXT_RED} \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c.             \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u0432: ${TXT_GREED}$(echo $JS | jq '.status.containerStatuses[].restartCount')${TXT_RED}             \u041b\u043e\u0433 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: ${TXT_CLEAR}\" ;             kubectl logs -n $ENV_NAME $POD --timestamps=true --prefix=true --since=${TIMEOUT}m ;     # imagePullBackOff     elif [[ \"true\" == \"$(echo $JS | jq '.status.containerStatuses[].state | any(paths; .[-1] == \"waiting\")')\" ]] ; then         echo -e \"======================             ${TXT_RED}\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u043e\u0434\u0435 ${TXT_GREED}${POD}${TXT_RED}             \u0438\u043b\u0438 \u043f\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043d\u043e\u0434\u0443.             \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0436\u0435:${TXT_CLEAR}\" ;         echo $JS | jq '.status.containerStatuses[].state.waiting' ;         echo -e \"${TXT_RED}\u041b\u043e\u0433 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438:${TXT_CLEAR}\" ;         kubectl logs -n $ENV_NAME $POD --timestamps=true<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-366043","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/366043","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=366043"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/366043\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=366043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=366043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=366043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}