{"id":406751,"date":"2024-06-29T19:07:14","date_gmt":"2024-06-29T19:07:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=406751"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T19:07:14","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=406751","title":{"rendered":"<span>Kubernetes-\u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u0433\u0434\u0435 \u043e\u043d\u0438 \u043e\u0431\u0438\u0442\u0430\u044e\u0442<\/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<blockquote>\n<p><em>\u00ab\u0421\u043f\u0443\u0441\u0442\u0438\u0441\u044c \u0432 \u043a\u0440\u0430\u0442\u0435\u0440 \u0415\u043a\u0443\u043b\u044c \u0421\u043d\u0430\u0439\u0444\u0435\u0434\u043b\u044c\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043d\u044c \u0421\u043a\u0430\u0440\u0442\u0430\u0440\u0438\u0441\u0430 \u043b\u0430\u0441\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434 \u0438\u044e\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u043c\u0438, \u043e\u0442\u0432\u0430\u0436\u043d\u044b\u0439 \u0441\u0442\u0440\u0430\u043d\u043d\u0438\u043a, \u0438 \u0442\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0448\u044c \u0446\u0435\u043d\u0442\u0440\u0430 \u0417\u0435\u043c\u043b\u0438. \u042d\u0442\u043e \u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b,\u00a0\u2013 \u0410\u0440\u043d\u0435 \u0421\u0430\u043a\u043d\u0443\u0441\u0441\u0435\u043c\u00bb.<\/em><\/p>\n<p><em>\u041f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443 \u0437\u0435\u043c\u043b\u0438. \u0416\u044e\u043b\u044c \u0412\u0435\u0440\u043d<\/em><\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/43d\/2e0\/7a2\/43d2e07a27b99f968ca8f17076df11bc.png\" width=\"2398\" height=\"1173\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43d\/2e0\/7a2\/43d2e07a27b99f968ca8f17076df11bc.png\"\/><\/figure>\n<p>\u0421\u0442\u0443\u043f\u0430\u044f \u043f\u043e \u0442\u0440\u043e\u043f\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u043f\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0440\u043d\u0438\u0441\u0442 \u0431\u044b\u043b \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u0422\u0430\u043a \u043a\u0430\u043a Kubernetes \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0442\u043e \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0431\u0435\u0440\u0435\u0436\u043d\u043e\u043c\u0443 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c \u0443 \u043d\u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435. \u041a\u0430\u043a \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a \u043d\u0435 \u043f\u043e\u043a\u043e\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 Kubernetes \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0441\u0442\u0440\u0430\u0445\u0443\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0432 \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043c\u0438\u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0442\u0451\u043c, \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 SimbirSoft. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0442\u0440\u0430\u0445\u043e\u043c \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0432\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0451 \u0438 \u0432\u0441\u044f \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u043d\u043e. \u041d\u0435\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0447\u0435\u0440\u043d\u044b\u0435 \u044f\u0449\u0438\u043a\u0438 \u0434\u043b\u044f \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0430 Kubernetes, \u043a\u0442\u043e-\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f root. \u0412 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c Ubuntu \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u043e \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0440\u0443\u0434\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0430\u0448\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e. \u0418\u0437 \u0442\u0430\u043a\u0438\u0445 \u0435\u043b\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439, \u043a\u0430\u043a \u0441\u043d\u0435\u0436\u043d\u044b\u0439 \u043a\u043e\u043c, \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0433\u0440\u0435\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0434\u043e \u0434\u0435\u043f\u043b\u043e\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u0432. \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043a\u043e\u0434 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b) \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Kubernetes, \u0430 \u043b\u0438\u043d\u0442\u0435\u0440\u044b \u2013 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 best-practice. \u0421 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a DevOps \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b CI\/CD, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e\u0442 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u043a\u043e\u0434\u0430. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f GitLab CI, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u044b Kubernetes.\u00a0<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u043b\u043e\u0432 \u2013 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430.<\/p>\n<h2>\u041f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0435<\/h2>\n<p>\u0411\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 Kubernetes (<em>parrot.yaml<\/em>), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 Nginx, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 html-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0441 \u0433\u0438\u0444\u043a\u043e\u0439 \u043f\u043e\u043f\u0443\u0433\u0430\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 Service \u0438 Ingress, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb <em>Parrot<\/em>.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/580\/f1a\/871\/580f1a87145228ac37c6ac36d479cc07.png\" alt=\"\u041d\u0430\u0448\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\" title=\"\u041d\u0430\u0448\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\" width=\"873\" height=\"560\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/580\/f1a\/871\/580f1a87145228ac37c6ac36d479cc07.png\"\/><\/p>\n<div><figcaption><em>\u041d\u0430\u0448\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/em><\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"yaml\">--- apiVersion: apps\/v1 kind: Deployment metadata:   name: bird spec:   replicas: 3   selector:     matchLabels:       app.kubernetes.io\/name: parrot-app   template:     metadata:       labels:         app.kubernetes.io\/name: parrot-app     spec:       containers:         - name: bird           image: vregret\/parrot:0.5           imagePullPolicy: Always           ports:             - name: http               protocol: TCP               containerPort: 80  --- apiVersion: v1 kind: Service metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   type: ClusterIP   selector:     app.kubernetes.io\/name: parrot-app   ports:     - port: 80       name: http       protocol: TCP       targetPort: 80  --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   rules:     - host: parrot.aperture.loc       http:         paths:         - path: \/           pathType: ImplementationSpecific           backend:             service:               name: parrot               port:                 number: 80<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0435\u043a\u0438\u0439 \u043c\u043e\u0432\u0435\u0442\u043e\u043d \u2013 \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 helm \u0447\u0430\u0440\u0442 (<em>parrot-app<\/em>) \u043f\u043e\u0434 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0421 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Gitlab CI \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0448 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b17\/b78\/e55\/b17b78e553ae7dd09e73358b7a3376c1.png\" alt=\"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" title=\"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" width=\"449\" height=\"589\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b17\/b78\/e55\/b17b78e553ae7dd09e73358b7a3376c1.png\"\/><\/p>\n<div><figcaption><em>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f Job CI, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u043d\u0442\u0435\u0440\u044b \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 .gitlab-ci\/jobs\/integration-kubernetes.yaml, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438\u0437 .gitlab-ci.yml, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.\u00a0<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0443\u0442\u0438\u043b\u0438\u0442. \u041a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u0434\u043b\u044f Raw \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f Helm \u0447\u0430\u0440\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 Stage \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439.<\/p>\n<h4>1. Kubeconform<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/yannh\/kubeconform\"><u>https:\/\/github.com\/yannh\/kubeconform<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e Kubernetes \u0438 json \u0441\u0445\u0435\u043c\u0443, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0443\u0445\u043e\u0432\u043d\u044b\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u044b <em>kubeval <\/em>(\u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0441\u0443\u0434\u044f \u043f\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 github, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 kubeconform). \u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0445 json \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u0442\u044f\u043d\u0435\u0442 \u0438\u0437\u0432\u043d\u0435 (\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0445\u0435\u043c\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>-schema-location<\/em>). \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>-strict<\/em> , kubeconform \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u044b\u0431\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0438\u0437 json \u0441\u0445\u0435\u043c\u044b (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0441\u043e\u0441\u043a\u043e\u0447\u0438\u043b\u0430 \u0440\u0443\u043a\u0430 \u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Pod \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u0441\u043a\u0430 Ansible). \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043e\u043f\u0438\u0448\u0435\u043c \u0438\u0445 \u0432 CI\/CD.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .kubeconform_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     KUBECONFORM_VERSION: \"v0.6.1\"     KUBECONFORM_RAW_PATH: ''     KUBECONFORM_HELM_PATH: ''   before_script:     # Install kubeconform     - wget https:\/\/github.com\/yannh\/kubeconform\/releases\/download\/${KUBECONFORM_VERSION}\/kubeconform-linux-amd64.tar.gz     - tar xf kubeconform-linux-amd64.tar.gz     - mv kubeconform \/usr\/local\/bin   script:     - >       if [[ -z ${KUBECONFORM_HELM_PATH} ]]; then         kubeconform -strict -verbose ${KUBECONFORM_RAW_PATH};       elif [[ -z ${KUBECONFORM_RAW_PATH} ]]; then         helm dependency build ${KUBECONFORM_HELM_PATH};         helm template ${KUBECONFORM_HELM_PATH} | kubeconform -strict -verbose - ;                                                     fi  # .gitlab-ci.yml raw-01:   stage: kubeconform   variables:     KUBECONFORM_RAW_PATH: 'kube\/raw\/*'   tags:     - docker   allow_failure: true   extends: .kubeconform_lint  helm-01:   stage: kubeconform   variables:     KUBECONFORM_HELM_PATH: 'kube\/helm\/parrot-app'   tags:     - docker   allow_failure: true   extends: .kubeconform_lint<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f60\/22d\/53a\/f6022d53a5eb5512cf9de697e180e3c3.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 kubeconform \u043f\u043e\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 parrot.yaml\" title=\"\u0412\u044b\u0432\u043e\u0434 kubeconform \u043f\u043e\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 parrot.yaml\" width=\"1255\" height=\"262\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f60\/22d\/53a\/f6022d53a5eb5512cf9de697e180e3c3.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 kubeconform \u043f\u043e\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 parrot.yaml<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, kubeconform \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u0421\u0430\u043c \u0432\u044b\u0432\u043e\u0434 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u2013output=json,junit,tap,text. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Helm \u0447\u0430\u0440\u0442\u0430.\u00a0<\/p>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u043f\u0440\u0438\u0431\u043e\u0440\u0430\u043c \u2013 \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d8\/3d8\/1ce\/2d83d81ced0f928d8c95173d8efb55dc.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b kubeconform \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 helm \u0447\u0430\u0440\u0442\u0430\" title=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b kubeconform \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 helm \u0447\u0430\u0440\u0442\u0430\" width=\"819\" height=\"134\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d8\/3d8\/1ce\/2d83d81ced0f928d8c95173d8efb55dc.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b kubeconform \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 helm \u0447\u0430\u0440\u0442\u0430<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 helm \u0447\u0430\u0440\u0442 \u0432 Kubernetes \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/184\/4b1\/8e8\/1844b18e8349937eef96b9006b70fbed.png\" alt=\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e helm \u0447\u0430\u0440\u0442\u0430  (\u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435)\" title=\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e helm \u0447\u0430\u0440\u0442\u0430  (\u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435)\" width=\"2095\" height=\"193\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/184\/4b1\/8e8\/1844b18e8349937eef96b9006b70fbed.png\"\/><\/p>\n<div><figcaption><em>\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e helm \u0447\u0430\u0440\u0442\u0430<\/em>  (\u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435)<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <em>helm template<\/em> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0447\u0430\u0440\u0442\u0430.<\/p>\n<pre><code class=\"yaml\">livenessProbe:    httpGet:     path: \/health     port: 8080   initialDelaySeconds: 5   periodSeconds: 3 readinessProbe:    {} startupProbe:    null<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0430\u0440\u0442\u0430.<\/p>\n<pre><code class=\"yaml\">livenessProbe:                                                                                                                                                                                httpGet:     path: \/health     port: 8080   initialDelaySeconds: 5   periodSeconds: 3 readinessProbe: {} startupProbe:<\/code><\/pre>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f startupProbe, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 readinessProbe \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u0432\u043d\u044b\u043c {}, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 API Kubernetes. \u0414\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e if \u0432 go-template Helm \u0447\u0430\u0440\u0442\u0430, \u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 CI\/CD. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>kubectl apply \u2013dry-run=server,<\/em> \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 API \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442, \u043d\u0443\u0436\u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0430\u0432\u0438\u043b. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u2013 \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h4>2. Conftest<\/h4>\n<ul>\n<li>\n<p><strong>URL: <\/strong><a href=\"https:\/\/github.com\/open-policy-agent\/conftest\"><u>https:\/\/github.com\/open-policy-agent\/conftest<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: <\/strong>\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: <\/strong>\u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442  <\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u043c Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u2013 \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0431\u043b\u0430\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .conftest_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     CONFTEST_VERSION: \"0.40.0\"     CONFTEST_RAW_PATH: ''     CONFTEST_HELM_PATH: ''     CONFTEST_POLICY_PATH: \".policy\/\"   before_script:     # Install confest     - wget https:\/\/github.com\/open-policy-agent\/conftest\/releases\/download\/v${CONFTEST_VERSION}\/conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz     - tar xf conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz     - mv conftest \/usr\/local\/bin   script:     - >       if [[ -z ${CONFTEST_HELM_PATH} ]]; then         conftest test ${CONFTEST_RAW_PATH} -p ${CONFTEST_POLICY_PATH};       elif [[ -z ${CONFTEST_RAW_PATH} ]]; then         helm dependency build ${CONFTEST_HELM_PATH};         helm template ${CONFTEST_HELM_PATH} | conftest test -p ${CONFTEST_POLICY_PATH} - ;                                                     fi  # .gitlab-ci.yml raw-02:   stage: conftest   variables:     CONFTEST_RAW_PATH: 'kube\/raw\/*'     CONFTEST_POLICY_PATH: \".policy\/\"   tags:     - docker   allow_failure: true   extends: .conftest_lint  helm-02:   stage: conftest   variables:     CONFTEST_HELM_PATH: 'kube\/helm\/parrot-app'     CONFTEST_POLICY_PATH: \".policy\/\"   tags:     - docker   allow_failure: true   extends: .conftest_lint<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0435\u0441\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0430 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0447\u0435\u0442\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043b\u0435\u0439\u0431\u043b\u0430 author (\u0434\u0430\u0431\u044b \u0437\u043d\u0430\u0442\u044c \u0433\u0435\u0440\u043e\u0435\u0432 \u0432 \u043b\u0438\u0446\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435).<\/p>\n<pre><code class=\"go\">#.\/.policy\/kubernetes.rego package kubernetes  is_deployment {     input.kind = \"Deployment\" }  #.\/.policy\/deployment.rego  package main import data.kubernetes  containers = input.spec.template.spec.containers[_] name = input.metadata.name kind = input.kind  required_labels {   input.metadata.labels[     \"author\"   ] }  livenessProbe {   containers.livenessProbe != {}   containers.livenessProbe != null } readinessProbe {   containers.readinessProbe != {}   containers.readinessProbe != null } startupProbe {   containers.startupProbe != {}   containers.startupProbe != null }  deny[msg] {   kubernetes.is_deployment   not required_labels   msg = sprintf(\"%s - %s: Missing requirements labels\", [kind, name]) }  deny[msg] {   kubernetes.is_deployment   containers.livenessProbe   not livenessProbe   msg = sprintf(\"%s - %s: %s in livenessProbe body \", [kind, name, containers.livenessProbe]) } deny[msg] {   kubernetes.is_deployment   containers.readinessProbe   not readinessProbe   msg = sprintf(\"%s - %s: %s in readinessProbe body \", [kind, name, containers.readinessProbe]) } deny[msg] {   kubernetes.is_deployment   containers.startupProbe   not startupProbe   msg = sprintf(\"%s - %s: %s in startupProbe body \", [kind, name, containers.startupProbe]) }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 probes \u0438 null \u0438\u043b\u0438 {} \u0432 \u043d\u0443\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 Yaml \u0444\u0430\u0439\u043b\u0430 + \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043b\u0435\u0439\u0431\u043b\u0430. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0443 conftest \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e (&#8212;output=stdout, json, tap, table, junit, github), \u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 CI\/CD \u0432\u0438\u0434\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u00ab\u0437\u0430\u043f\u043b\u0430\u0442\u043a\u0438\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f75\/1d0\/042\/f751d0042c5503c5423f1d1e7096f440.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b conftest\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b conftest\" width=\"1280\" height=\"310\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f75\/1d0\/042\/f751d0042c5503c5423f1d1e7096f440.png\"\/><\/p>\n<div><figcaption><em>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b conftest<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0431\u044b \u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u044f? \u0412\u0435\u0434\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2013 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 best practice! \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0441\u0451 \u043f\u043e \u043f\u043e\u043b\u043e\u0447\u043a\u0430\u043c, \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h4>3. Kube-score<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/zegl\/kube-score\"><u>https:\/\/github.com\/zegl\/kube-score<\/u><\/a>\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u043b\u0438\u043d\u0442\u0435\u0440 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 Kubernetes + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 (<a href=\"https:\/\/github.com\/zegl\/kube-score#ignoring-a-test\"><u>https:\/\/github.com\/zegl\/kube-score#ignoring-a-test<\/u><\/a>) \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 cli &#8212;ignore-test<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442  <\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .kubescore_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     KUBESCORE_VERSION: 1.16.1     KUBESCORE_RAW_PATH: ''     KUBESCORE_HELM_PATH: ''   before_script:     # Install kubescore     - wget https:\/\/github.com\/zegl\/kube-score\/releases\/download\/v${KUBESCORE_VERSION}\/kube-score_${KUBESCORE_VERSION}_linux_amd64.tar.gz     - tar xf kube-score_${KUBESCORE_VERSION}_linux_amd64.tar.gz     - mv kube-score \/usr\/local\/bin   script:     - >       if [[ -z ${KUBESCORE_HELM_PATH} ]]; then         kube-score score ${KUBESCORE_RAW_PATH} --output-format ci ;       elif [[ -z ${KUBESCORE_RAW_PATH} ]]; then         helm dependency build ${KUBESCORE_HELM_PATH} ;         helm template ${KUBESCORE_HELM_PATH} | kube-score score --output-format ci - ;                                                   fi  # .gitlab-ci.yml raw-03:   stage: kube-score   variables:     KUBESCORE_RAW_PATH: 'kube\/raw\/*'   tags:     - docker   allow_failure: true   extends: .kubescore_lint  helm-03:   stage: kube-score   variables:     KUBESCORE_HELM_PATH: 'kube\/helm\/parrot-app'   tags:     - docker   allow_failure: true   extends: .kubescore_lint<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 kube-score \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c4\/2bc\/e33\/9c42bce33b6846f25d787b61acd57bc1.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b kube-score  \" title=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b kube-score  \" width=\"1684\" height=\"1446\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c4\/2bc\/e33\/9c42bce33b6846f25d787b61acd57bc1.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b kube-score<\/em>  <\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, kube-score \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435, \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u0438 \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f CPU, Memory \u0438 Ephemeral Storage. \u0421\u0430\u043c \u0432\u044b\u0432\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 &#8212;output-format (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b human, json, sarif\u00a0 \u0438 ci), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 Merge Request.<\/p>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043c \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u0435.<\/p>\n<h4>4. Kubelinter<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/stackrox\/kube-linter\"><u>https:\/\/github.com\/stackrox\/kube-linter<\/u><\/a>\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u043b\u0438\u043d\u0442\u0435\u0440 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 Helm \u0447\u0430\u0440\u0442\u043e\u0432 Kubernetes + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.kubelinter.io\/#\/configuring-kubelinter?id=configuring-kubelinter\"><u>\u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a<\/u><\/a>, \u0432\u044b\u0431\u043e\u0440 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/strong> \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e json k8s schema, \u0447\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 kubeconform).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f\u0441\u044c \u043d\u0430\u0448\u0435\u0439 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u2013 \u0437\u0430\u043f\u0438\u0445\u043d\u0435\u043c \u0438 \u044d\u0442\u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043a \u043d\u0430\u043c \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .kubelinter_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     KUBELINTER_VERSION: '0.4.0'     KUBELINTER_RAW_PATH: ''     KUBELINTER_HELM_PATH: ''   before_script:     # Install kube-linter     - wget https:\/\/github.com\/stackrox\/kube-linter\/releases\/download\/${KUBELINTER_VERSION}\/kube-linter-linux.tar.gz     - tar xf kube-linter-linux.tar.gz     - mv kube-linter \/usr\/local\/bin   script:     - >       if [[ -z ${KUBELINTER_HELM_PATH} ]]; then         kube-linter lint ${KUBELINTER_RAW_PATH};       elif [[ -z ${KUBELINTER_RAW_PATH} ]]; then         helm dependency build ${KUBELINTER_HELM_PATH} ;         kube-linter lint ${KUBELINTER_HELM_PATH};                                       fi  # .gitlab-ci.yml raw-04:   stage: kubelinter   variables:     KUBELINTER_RAW_PATH: 'kube\/raw\/*'   tags:     - docker   allow_failure: true   extends: .kubelinter_lint  helm-04:   stage: kubelinter   variables:     KUBELINTER_HELM_PATH: 'kube\/helm\/parrot-app'   tags:     - docker   allow_failure: true   extends: .kubelinter_lint<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1b\/492\/0f9\/b1b4920f99c739ec903195aae0ed2b51.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Kubelinter  \" title=\"\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Kubelinter  \" width=\"1818\" height=\"1329\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1b\/492\/0f9\/b1b4920f99c739ec903195aae0ed2b51.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Kubelinter<\/em>  <\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439, \u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443 \u0432\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b.\u00a0<\/p>\n<blockquote>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e \u043a\u043e\u0434\u0443 CI, \u2013 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u0437\u043e\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c Helm \u0447\u0430\u0440\u0442\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0431\u0435\u0437 \u0438\u0445 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0447\u0435\u0440\u0435\u0437 <em>helm template<\/em>, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0442 umbrella (\u0437\u043e\u043d\u0442\u0438\u0447\u043d\u044b\u0435) <a href=\"https:\/\/helm.sh\/docs\/howto\/charts_tips_and_tricks\/#complex-charts-with-many-dependencies\"><u>\u0447\u0430\u0440\u0442\u044b <\/u><\/a>\u2013 \u043f\u0440\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <em>helm dependency build.<\/em>\u00a0<\/p>\n<\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0431\u043e\u043b\u0435\u0435 \u0443\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u043c \u0438 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c, \u00ab\u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u0430\u043c\u00bb \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430.<\/p>\n<h4>5. Polaris<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/FairwindsOps\/polaris\"><u>https:\/\/github.com\/FairwindsOps\/polaris<\/u><\/a>\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u043b\u0438\u043d\u0442\u0435\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 Helm \u0447\u0430\u0440\u0442\u043e\u0432 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/polaris.docs.fairwinds.com\/customization\/configuration\"><u>\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439<\/u><\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u0447\u0435\u0440\u0435\u0437 CLI \u0438 admission webhook.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/strong> \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 7.0.1 Polaris \u0438 >3.7.2 \u0443 Helm, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 7.3.2 Polaris \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438\u0441\u0447\u0435\u0437\u043b\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Polaris \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043a\u0430\u043a CLI \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 <a href=\"https:\/\/polaris.docs.fairwinds.com\/customization\/custom-checks\/#basic-example\"><u>\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a<\/u><\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043a\u0430\u043a Admission Controller \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c <a href=\"https:\/\/www.cncf.io\/about\/who-we-are\/\"><u><abbr class=\"habraabbr\" title=\"Cloud Native Computing Foundation \u2014 \u043f\u0440\u043e\u0435\u043a\u0442 Linux Foundation \u0434\u043b\u044f \u0441\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0442\u0440\u0430\u0441\u043b\u0438 \u0441 \u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c\" data-title=\"&lt;p>Cloud Native Computing Foundation \u2014 \u043f\u0440\u043e\u0435\u043a\u0442 Linux Foundation \u0434\u043b\u044f \u0441\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0442\u0440\u0430\u0441\u043b\u0438 \u0441 \u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c  &lt;\/p>&#187; data-abbr=&#187;CNCF&#187;>CNCF<\/abbr><\/u><\/a>. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u00ab\u043f\u043e\u0433\u043e\u0434\u044b\u00bb \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0d7\/a89\/d08\/0d7a89d0829fa247f46f9c47d6669443.png\" alt=\"Polaris Dashboard\" title=\"Polaris Dashboard\" width=\"776\" height=\"972\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0d7\/a89\/d08\/0d7a89d0829fa247f46f9c47d6669443.png\"\/><\/p>\n<div><figcaption><em>Polaris Dashboard<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e CI\/CD.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .polaris_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     POLARIS_VERSION: 7.0.1     POLARIS_RAW_PATH: ''     POLARIS_HELM_PATH: ''     POLARIS_SCORE_LEVEL: 75     POLARIS_CONFIG: ''   before_script:     # Install polaris     - wget https:\/\/github.com\/FairwindsOps\/polaris\/releases\/download\/${POLARIS_VERSION}\/polaris_linux_amd64.tar.gz     - tar -xvzf .\/polaris_linux_amd64.tar.gz     - mv .\/polaris \/bin\/polaris   script:     - >       if [[ -z ${POLARIS_HELM_PATH} ]]; then         polaris audit --audit-path ${POLARIS_RAW_PATH} --only-show-failed-tests --set-exit-code-below-score ${POLARIS_SCORE_LEVEL} --format=pretty $(if [[ -z $POLARIS_CONFIG ]]; then echo \"\"; else echo --config $POLARIS_CONFIG; fi);       elif [[ -z ${POLARIS_RAW_PATH} ]]; then         polaris audit --helm-chart ${POLARIS_HELM_PATH} --only-show-failed-tests --set-exit-code-below-score ${POLARIS_SCORE_LEVEL} --format=pretty $(if [[ -z $POLARIS_CONFIG ]]; then echo \"\"; else echo --config $POLARIS_CONFIG; fi);       fi  # .gitlab-ci.yml raw-05:   stage: polaris   variables:     POLARIS_RAW_PATH: '.\/kube\/raw'     POLARIS_SCORE_LEVEL: 75     POLARIS_CONFIG: '.\/polaris-config.yaml'   tags:     - docker   allow_failure: true   extends: .polaris_lint  helm-05:   stage: polaris   variables:     POLARIS_HELM_PATH: '.\/kube\/helm\/parrot-app'     POLARIS_SCORE_LEVEL: 70   tags:     - docker   allow_failure: true   extends: .polaris_lint<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31b\/424\/e3c\/31b424e3c53b96eab6c9fbb572eafffa.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Polaris \u0432 \u043d\u0430\u0448\u0435\u043c CI  \" title=\"\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Polaris \u0432 \u043d\u0430\u0448\u0435\u043c CI  \" width=\"1411\" height=\"1650\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31b\/424\/e3c\/31b424e3c53b96eab6c9fbb572eafffa.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Polaris \u0432 \u043d\u0430\u0448\u0435\u043c CI  <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 (\u0442\u0438\u043f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>&#8212;format=pretty\/json\/yaml<\/em>), \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439. \u0421\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>&#8212;set-exit-code-below-score<\/em> \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 70. \u041f\u043e\u0432\u044b\u0448\u0430\u044f \u0438 \u043f\u043e\u043d\u0438\u0436\u0430\u044f \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u043f\u0440\u0438 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0447\u043a\u043e\u0432 \u043b\u0438\u043d\u0442\u0438\u043d\u0433\u0430 Polaris \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f Polaris \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 yaml \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u0430\u043f\u0430 \u043b\u0438\u043d\u0442\u0430. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 CI.<\/p>\n<h4>6. Datree<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/datreeio\/datree\"><u>https:\/\/github.com\/datreeio\/datree<\/u><\/a>\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u043b\u0438\u043d\u0442\u0435\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 Helm \u0447\u0430\u0440\u0442\u043e\u0432 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: policy-as-a-code, <a href=\"https:\/\/hub.datree.io\/built-in-rules\"><u>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438<\/u><\/a>, <a href=\"https:\/\/hub.datree.io\/custom-rules\/custom-rules-overview\"><u>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/u><\/a>, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 deprecated \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u0447\u0435\u0440\u0435\u0437<strong> <\/strong>admission webhook.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f, 1000 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u043c\u0435\u0441\u044f\u0446<\/p>\n<\/li>\n<\/ul>\n<p>Datree \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e cli \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u0430 \u0446\u0435\u043b\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434, Admission Controller \u0434\u043b\u044f Kubernetes \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0432 GitOps \u043f\u043e\u0434\u0445\u043e\u0434\u0435 (\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 ArgoCD, Flux \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438) \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u044e\u0448\u0435\u043a \u043d\u0430\u0434\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c, \u043d\u043e CLI \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437\u0432\u043e\u0437\u043c\u0435\u0437\u0434\u043d\u043e (1000 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u043c\u0435\u0441\u044f\u0446). \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c CNCF.\u00a0<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .datree_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     DATREE_VERSION: 1.6.4-rc     DATREE_RAW_PATH: ''     DATREE_HELM_PATH: ''   before_script:     # Install datree     - wget https:\/\/github.com\/datreeio\/datree\/releases\/download\/${DATREE_VERSION}\/datree-cli_${DATREE_VERSION}_Linux_x86_64.zip     - unzip -n datree-cli_${DATREE_VERSION}_Linux_x86_64.zip     - mv datree \/usr\/local\/bin     - datree config set offline local   script:     - >       if [[ -z ${DATREE_HELM_PATH} ]]; then         datree test ${DATREE_RAW_PATH} --no-record --ignore-missing-schemas ;       elif [[ -z ${DATREE_RAW_PATH} ]]; then         helm plugin install https:\/\/github.com\/datreeio\/helm-datree         helm dependency build ${DATREE_HELM_PATH} ;         helm datree test ${DATREE_HELM_PATH} --no-record --ignore-missing-schemas;                                                   fi  # .gitlab-ci.yml raw-06:   stage: datree   variables:     DATREE_RAW_PATH: 'kube\/raw\/*'   tags:     - docker   allow_failure: true   extends: .datree_lint  helm-06:   stage: datree   variables:     DATREE_HELM_PATH: 'kube\/helm\/parrot-app'   tags:     - docker   allow_failure: true   extends: .datree_lint<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/274\/49d\/a10\/27449da10e0e8b1ccf5840648039be10.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 Datree \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0432 CI  \" title=\"\u0412\u044b\u0432\u043e\u0434 Datree \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0432 CI  \" width=\"2426\" height=\"1584\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/274\/49d\/a10\/27449da10e0e8b1ccf5840648039be10.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 Datree \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0432 CI<\/em>  <\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0438 \u0434\u0430\u0436\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a. \u0422\u0430\u043c \u043d\u0430\u0441 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u043e\u043a\u043d\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 Datree, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443. \u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (<em>&#8212;output=simple\/yaml\/json\/xml\/JUnit<\/em>).\u00a0<\/p>\n<p>\u041c\u044b \u0436\u0435, \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u044f\u0441\u044c, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043c\u043e\u043d\u0441\u0442\u0440\u0443 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u0434\u0430 \u0438 \u0441\u0430\u043c\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u2013 Kubescape.<\/p>\n<h4>7. Kubescape<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/kubescape\/kubescape\"><u>https:\/\/github.com\/kubescape\/kubescape<\/u><\/a>\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u043b\u0438\u043d\u0442\u0435\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 Helm \u0447\u0430\u0440\u0442\u043e\u0432 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u0447\u0435\u0440\u0435\u0437 cli<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubernetes, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u043c\u0438 CIS \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c\u0438 \u044d\u0442\u043e \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043e, \u0438 \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0438\u0445 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 pdf \u0438 html. \u041f\u043e\u0445\u043e\u0436\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0434\u043b\u044f Kubernetes, \u0430 \u0434\u043b\u044f UNIX \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b lynis (\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u044f\u0442 \u043c\u0435\u043d\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0442\u0430\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435). \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c CNCF.<\/p>\n<p>\u0411\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c!<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .kubescape_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     KUBESCAPE_VERSION: 'v2.0.183'     KUBESCAPE_RAW_PATH: ''     KUBESCAPE_HELM_PATH: ''     KUBESCAPE_WARNING_SEVERITY: \"high\"   before_script:     # Install kubescape     - wget https:\/\/github.com\/kubescape\/kubescape\/releases\/download\/${KUBESCAPE_VERSION}\/kubescape-ubuntu-latest     - apk add curl gcompat --no-cache     - mv kubescape-ubuntu-latest \/usr\/local\/bin\/kubescape     - chmod +x \/usr\/local\/bin\/kubescape   script:     - >       if [[ -z ${KUBESCAPE_HELM_PATH} ]]; then         kubescape scan ${KUBESCAPE_RAW_PATH} --severity-threshold ${KUBESCAPE_WARNING_SEVERITY};       elif [[ -z ${KUBESCAPE_RAW_PATH} ]]; then         helm dependency build ${KUBESCAPE_HELM_PATH} ;         kubescape scan ${KUBESCAPE_HELM_PATH} --severity-threshold ${KUBESCAPE_WARNING_SEVERITY};                                       fi  # .gitlab-ci.yml raw-07:   stage: kubescape   variables:     KUBESCAPE_RAW_PATH: 'kube\/raw\/*'     KUBESCAPE_WARNING_SEVERITY: \"high\"   tags:     - docker   allow_failure: true   extends: .kubescape_lint  helm-07:   stage: kubescape   variables:     KUBESCAPE_HELM_PATH: 'kube\/helm\/parrot-app'     KUBESCAPE_WARNING_SEVERITY: \"high\"   tags:     - docker   allow_failure: true   extends: .kubescape_lint<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6d3\/2cd\/557\/6d32cd557c45b489b6d2e56fef83c114.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b Kubescape\" title=\"\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b Kubescape\" width=\"2190\" height=\"1496\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6d3\/2cd\/557\/6d32cd557c45b489b6d2e56fef83c114.png\"\/><\/p>\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b Kubescape<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0432\u044b\u0432\u043e\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439. \u0422\u0430\u043a\u0436\u0435 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 (\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>\u2013format = pretty-printer\/json\/junit\/Prometheus\/pdf\/html\/sarif<\/em>) \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u00ab\u043e\u0447\u043a\u043e\u0432\u00bb \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>&#8212;severity-threshold<\/em> (\u0447\u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430\u0441 \u043a Polaris). \u042d\u0442\u043e\u0439 \u0436\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u043c\u044b \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0447\u0435\u0440\u0435\u0437 CLI \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439.<\/p>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438<\/h2>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u0435\u043c\u044c \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Kubernetes \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0430 \u043d\u0430\u0448 \u043d\u0435\u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/791\/9c6\/e90\/7919c6e90ff823120910789846ae617f.png\" alt=\"\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d Gitlab CI \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432\" title=\"\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d Gitlab CI \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432\" width=\"2554\" height=\"335\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/791\/9c6\/e90\/7919c6e90ff823120910789846ae617f.png\"\/><\/p>\n<div><figcaption>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d Gitlab CI \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0434\u0430\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u043f\u043b\u043e\u0439. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 PodDisruptionBudget \u0438 NetworkPolicy, \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0438\u0445 \u043b\u0438\u0441\u0442\u0438\u043d\u0433, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u044e\u0449\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0445 \u0438 \u0431\u0435\u0437 \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u0432 \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442, \u0430 \u0432\u0440\u0435\u043c\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0440\u0435\u0437\u0438\u043d\u043e\u0432\u043e\u0435. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0443, \u0443\u0431\u0440\u0430\u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 (\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b, \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u0442 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0434\u0440\u0443\u0433\u043e\u0435). \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0441\u0435\u043c \u0438 \u0432 \u043d\u0430\u0448 Helm \u0447\u0430\u0440\u0442.<\/p>\n<pre><code class=\"yaml\">--- apiVersion: apps\/v1 kind: Deployment metadata:   name: bird   labels:     author: \"IvanIvanov\" spec:   replicas: 3   strategy:     type: RollingUpdate     rollingUpdate:       maxSurge: 2        maxUnavailable: 0   selector:     matchLabels:       app.kubernetes.io\/name: parrot-app   template:     metadata:       labels:         app.kubernetes.io\/name: parrot-app     spec:       containers:         - name: bird           image: vregret\/parrot-uprivileged:0.1           imagePullPolicy: Always           securityContext: #https:\/\/snyk.io\/blog\/10-kubernetes-security-context-settings-you-should-understand\/             allowPrivilegeEscalation: false             readOnlyRootFilesystem: true             runAsNonRoot: true             runAsUser: 10000             runAsGroup: 10000             capabilities: #https:\/\/man7.org\/linux\/man-pages\/man7\/capabilities.7.html               drop:                  - \"all\"             seccompProfile:               type: RuntimeDefault             seLinuxOptions:               level: \"s0:c123,c456\"           resources:             requests:               memory: \"64Mi\"               cpu: \"250m\"               ephemeral-storage: \"5Mi\"             limits:               memory: \"64Mi\"               cpu: \"250m\"               ephemeral-storage: \"10Mi\"           ports:             - name: http               protocol: TCP               containerPort: 8080           livenessProbe:             httpGet:               path: \/               port: 8080             initialDelaySeconds: 5             periodSeconds: 3           readinessProbe:             httpGet:               path: \/health               port: 8080             initialDelaySeconds: 5             periodSeconds: 3           volumeMounts:           - mountPath: \/var\/cache\/nginx             name: cache           - mountPath: \/var\/run             name: pid       volumes:       - name: cache         emptyDir:           sizeLimit: 5Mi       - name: pid         emptyDir:           sizeLimit: 1Mi  --- apiVersion: v1 kind: Service metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   type: ClusterIP   selector:     app.kubernetes.io\/name: parrot-app   ports:     - port: 8080       name: http       protocol: TCP       targetPort: 8080  --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   rules:     - host: parrot.aperture.loc       http:         paths:         - path: \/           pathType: ImplementationSpecific           backend:             service:               name: parrot               port:                 number: 8080<\/code><\/pre>\n<p><em>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430<\/em>  <\/p>\n<p>\u041e\u0442 \u0441\u0435\u0431\u044f \u0437\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0445\u043e\u0442\u0435\u043b\u043e\u043a \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u0432 \u2013 \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u0412\u0441\u0435\u043c \u0441\u043e\u0432\u0435\u0442\u0443\u044e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0445 \u043f\u043e\u0442\u043e\u043c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d1\/1ad\/038\/1d11ad03868e007f3d75bf531e688f1f.gif\" alt=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430  \" title=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430  \" width=\"498\" height=\"280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d1\/1ad\/038\/1d11ad03868e007f3d75bf531e688f1f.gif\"\/><\/p>\n<div><figcaption><em>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/em>  <\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043c\u0438\u043b\u0443\u044e \u0433\u043b\u0430\u0437\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/de6\/d04\/02e\/de6d0402e10732b1803622cd4f22670c.png\" alt=\"\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d CI \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438\" title=\"\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d CI \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438\" width=\"2661\" height=\"511\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de6\/d04\/02e\/de6d0402e10732b1803622cd4f22670c.png\"\/><\/p>\n<div><figcaption><em>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d CI \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0451: \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0443\u0442\u0438\u043b\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0438\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0432 \u043e\u0442\u0435\u043b\u044c\u043d\u044b\u0439 DevSecOps \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0441\u043e\u0431\u0440\u0430\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e\u0434 \u043b\u0438\u043d\u0442\u0438\u043d\u0433 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u0438 \u0434\u0435\u0440\u0433\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 Triggered pipelines.<\/p>\n<p>\u041d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u00ab\u0441\u043e\u0431\u0430\u043a\u0430-\u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u043a\u0430\u00bb \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u0445\u043e\u0447\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0443 \u043d\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 kube-config \u0434\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u0445\u0438\u0442\u0440\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043d\u0435 \u0445\u043e\u0442\u044f\u0442 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 CI\/CD, \u0447\u0435\u043c \u0441\u043d\u0438\u0436\u0430\u044e\u0442 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 Time-to-market? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u043f\u043e\u043a\u043e\u0438\u043c \u0441\u0435\u0431\u044f \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 DevOps \u2014 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Admission Controller Kubernetes \u0438 \u043f\u043e\u0434\u0445\u043e\u0434 Shift-left.<\/p>\n<h2>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kubernetes Admission Controller \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Shift-Left<\/h2>\n<blockquote>\n<p><em>\u00ab<\/em>Everything about this place just doesn&#8217;t feel right<em>\u00bb.<\/em><\/p>\n<p><em>The Count of Tuscany. Dream Theater<\/em><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e Kubernetes, <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/\"><strong><u>Admission Controller<\/u><\/strong><\/a> \u2014 \u044d\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0432 API Kubernetes, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c (validation \u0438\u043b\u0438 mutation \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e) \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a API \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c Polaris \u0438 Datree \u043a\u0430\u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/extensible-admission-controllers\/\"><u>Admission Webhook \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/u><\/a>. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <s>\u0442\u0440\u0438 \u0441\u0438\u0442\u0430<\/s> \u0441\u0435\u0431\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\/\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e RoadMap Kubescape, <a href=\"https:\/\/github.com\/kubescape\/kubescape\/blob\/master\/docs\/roadmap.md\"><u>\u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u0443 \u043d\u0435\u0433\u043e<\/u><\/a>.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441 Polaris \u2014 \u0441 \u043d\u0438\u043c \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0433\u0440\u0430\u0431\u043b\u044f\u043c \u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 Admission Webhook \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b (webhook) \u043a API Kubernetes \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c tls, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 Kubernetes \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c csr \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0435 Kubernetes \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 \u0423\u0426 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u043f\u043e\u0434\u043d\u044f\u0442\u044c Polaris. \u0412\u0441\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/kind.sigs.k8s.io\"><u>Kind<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 CI\/CD, \u0438 \u043a\u0430\u043a \u043f\u043b\u0430\u0446\u0434\u0430\u0440\u043c \u0434\u043b\u044f \u043e\u0431\u043a\u0430\u0442\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0414\u0430\u0431\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Polaris Admission controller \u0432 Kubernetes:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash set -e # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Helm helm repo add fairwinds-stable https:\/\/charts.fairwinds.com\/stable helm repo update mkdir polaris-certs  # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447 openssl genrsa -out .\/polaris-certs\/polaris-webhook.key 2048  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 cat&lt;&lt;EOF > .\/polaris-certs\/polaris-webhook.conf [ req ] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] O = system:nodes CN = system:node:polaris-webhook.polaris.svc.cluster.local [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = polaris-webhook DNS.2 = polaris-webhook.polaris DNS.3 = polaris-webhook.polaris.svc DNS.4 = polaris-webhook.polaris.svc.cluster.local EOF  # \u2026 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2026 openssl req -new -key .\/polaris-certs\/polaris-webhook.key -out .\/polaris-certs\/polaris-webhook.csr -config .\/polaris-certs\/polaris-webhook.conf  # \u2026 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 (\u043a\u0430\u043b\u0430\u043c\u0431\u0443\u0440) \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 Kubernetes \u2026 cat &lt;&lt;EOF | kubectl apply -f - apiVersion: certificates.k8s.io\/v1 kind: CertificateSigningRequest metadata:   name: polaris-webhook spec:   request: $(cat .\/polaris-certs\/polaris-webhook.csr | base64 | tr -d \"\\n\")   signerName: kubernetes.io\/kubelet-serving   usages:   - digital signature   - key encipherment   - server auth EOF  # \u2026 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u043c Kubernetes \u0430\u043f\u043f\u0440\u0443\u0432\u043d\u0443\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2026 kubectl certificate approve polaris-webhook  # \u2026 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2026 kubectl get csr polaris-webhook -o jsonpath='{.status.certificate}' | base64 --decode > .\/polaris-certs\/polaris-webhook.crt  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432 Kubernetes \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c Polaris \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u043c\u0443 \u0442\u0430\u043a\u0436\u0435 CA Bundle Kubernetes kubectl create ns polaris kubectl -n polaris create secret tls polaris-webhook --cert=.\/polaris-certs\/polaris-webhook.crt --key=.\/polaris-certs\/polaris-webhook.key  helm upgrade --install polaris fairwinds-stable\/polaris -n polaris -f values.yaml --set webhook.caBundle=$(kubectl get configmaps -n kube-system extension-apiserver-authentication -o=jsonpath='{.data.client-ca-file}' | base64 | tr -d \"\\n\")<\/code><\/pre>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/299\/308\/85d\/29930885da12872268819bc9aee1f4f3.jpg\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0435\" title=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0435\" width=\"560\" height=\"600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/299\/308\/85d\/29930885da12872268819bc9aee1f4f3.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption><em>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0435<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 Validation Admission Webhook Configuration \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0432 Polaris \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0438\u0437-\u0437\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 API Kubernetes \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a Polaris \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u2013 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c validatingwebhookconfiguration \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u043e\u0434\u043e\u0432 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u2013 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u044f, \u043d\u0443\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Iaac \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Helm hooks. \u041f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Polaris, \u043c\u043e\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432 values.yaml Helm \u0447\u0430\u0440\u0442\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/efc\/cfc\/adb\/efccfcadb34cb74c3f157ef9eb9af9f9.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Polaris Kubernetes Admission webhook  \" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Polaris Kubernetes Admission webhook  \" width=\"1510\" height=\"539\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/cfc\/adb\/efccfcadb34cb74c3f157ef9eb9af9f9.png\"\/><\/p>\n<div><figcaption><em>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Polaris Kubernetes Admission webhook<\/em>  <\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0441 Datree. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash set -e helm repo add datree-webhook https:\/\/datreeio.github.io\/admission-webhook-datree helm repo update helm install -n datree datree-webhook datree-webhook\/datree-admission-webhook --debug \\ --create-namespace \\ --set datree.token=dba0xxxx-xxxx-xxxx-xxxx-4acaf52axxxx \\ --set datree.clusterName=$(kubectl config current-context)<\/code><\/pre>\n<p>\u0412 datree.token \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 Datree. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0440\u043e\u043a.\u00a0<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u043b\u043e\u0445\u043e\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ef\/99f\/3bf\/1ef99f3bf1b10422d7df34178c85c9ef.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Datree Kubernetes Admission webhook\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Datree Kubernetes Admission webhook\" width=\"1249\" height=\"284\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ef\/99f\/3bf\/1ef99f3bf1b10422d7df34178c85c9ef.png\"\/><\/p>\n<div><figcaption><em>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b Datree Kubernetes Admission webhook<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u2013 Datree \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 Datree Dashboard \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u00ab\u043d\u0438\u0448\u0442\u044f\u043a\u0438\u00bb \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/651\/088\/871\/651088871043a7dbc670a0a13a135492.png\" alt=\"Datree Dashboard\" title=\"Datree Dashboard\" width=\"2217\" height=\"1638\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/651\/088\/871\/651088871043a7dbc670a0a13a135492.png\"\/><\/p>\n<div><figcaption><em>Datree Dashboard<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u043e\u0442 \u043c\u0438\u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043d\u0435\u043c\u0443 \u2013 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043f\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Kubernetes, \u043d\u043e \u0438 \u0432 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e shift-left \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u043c\u044b\u0441\u043b \u0438 \u0446\u0435\u043b\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u00ab\u0432\u043b\u0435\u0432\u043e\u00bb (\u0432\u0430\u0448 \u043a\u044d\u043f), \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c IT-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u0434 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e \u0438\u0445 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u043e \u0432 \u0445\u043e\u0434\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u044b \u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b <a href=\"https:\/\/pre-commit.com\"><u>pre-commit<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c git hooks \u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043a\u043e\u0434\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u0430\u043f\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c. \u041e\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u043e \u0432\u0441\u0451\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0445\u0443\u043a\u0438. \u041d\u0430\u0448\u0430 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c hook, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c kube-score, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.<\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Pre-commit \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0444\u0430\u0439\u043b\u0430 <em>.pre-commit-config.yaml.<\/em><\/p>\n<pre><code class=\"yaml\">repos: #https:\/\/pre-commit.com\/#advanced -   repo: local     hooks:     - id: kubernetes-validation-kube-score       name: kubernetes-validation-kube-score       description: Validation kubernetes manifests via kube-score       entry: .\/.lint.sh                                language: script       types_or:          - text       verbose: true       files: \"^kube\/\"<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043f\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c \u043d\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432, \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <em>kube\/. <\/em>\u0421\u0442\u043e\u0438\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442, \u0442\u0430\u043a \u0438 Helm \u0447\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u043b\u044f \u0443\u0442\u0438\u043b\u0438\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0441\u0430\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0440\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c <em>template\/deployment.yaml<\/em> \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 go template, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Helm. \u0427\u0442\u043e\u0431\u044b\u00a0 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0431\u044b\u043b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043e\u0442 \u0447\u0430\u0440\u0442\u043e\u0432 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0430\u0440\u0442\u0430 \u2013 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0445\u0443\u043a\u043e\u043c git. \u0422\u0430\u043a\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 pre-commit \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"yaml\">#!\/bin\/bash set -e # \u041f\u043e\u0438\u0441\u043a \u0447\u0430\u0440\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (\u043f\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u0444\u0430\u0439\u043b\u0430 Chart.yaml) \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0447\u0430\u0440\u0442\u044b \u0442\u0430\u043a \u0438 umbrella \u0447\u0430\u0440\u0442\u044b (\u043f\u0440\u0430\u0432\u0434\u0430 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c helm dependency build) CHARTS_LOCATIONS=$(find . -name \"Chart.yaml\" -type f | xargs dirname | sed 's\/.\\\/\/\/') # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u0434\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 git status) FILE=$1 its_chart=false # \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u0434\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u0443\u0442\u044f\u043c\u0438 \u0434\u043e Helm \u0447\u0430\u0440\u0442\u043e\u0432 for i in $CHARTS_LOCATIONS   do     if [[ $(echo $FILE | xargs dirname) == $i* ]]         then           its_chart=true           target_helm_chart=$i           break         fi   done  # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 if $its_chart   then     echo \"$FILE - It's a part of Helm chart\"     helm template $target_helm_chart | kube-score score -    else     echo \"$FILE - It's a Kubernetes raw manifest\"     kube-score score $FILE   fi<\/code><\/pre>\n<p>\u0421\u043e\u0433\u043b\u0430\u0448\u0443\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b pre-commit \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e. \u0421\u0430\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438 hook \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <em>pre-commit install<\/em> \u0432 \u043a\u043e\u0440\u043d\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 pre-commit \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a). \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u0445.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48a\/614\/c1c\/48a614c1c2ffc045222bdf8d9ce788e0.png\" width=\"1577\" height=\"1898\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/48a\/614\/c1c\/48a614c1c2ffc045222bdf8d9ce788e0.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u0434\u0442\u0438 \u043f\u043e \u0433\u0440\u0430\u0431\u043b\u044f\u043c, \u0442\u043e \u0443 \u0443\u0442\u0438\u043b\u0438\u0442\u044b kubelinter \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/docs.kubelinter.io\/#\/using-kubelinter?id=using-kubelinter-with-the-pre-commit-framework\"><u>\u0433\u043e\u0442\u043e\u0432\u0430\u044f pre-commit \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/u><\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043f\u0440\u0438 shift-left \u043f\u043e\u0434\u0445\u043e\u0434\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 Kubernetes \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0435\u0449\u0451 \u0434\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u043e\u0439 \u043f\u0443\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u2013 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <em>git commit &#8212;no-verify<\/em> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c commit \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, \u0438 \u044d\u0442\u043e \u043d\u0435 \u0435\u0441\u0442\u044c \u043f\u043b\u043e\u0445\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u0442\u043e \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\"><strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Best-practice<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\"><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\"><strong>\u041c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Kubernetes Admission webhook<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0441\u0442\u044c<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\"><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Kubeconform\u00a0<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Conftest<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Kubelinter<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Kube-score<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Polaris<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Datree<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">~<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"124\" width=\"124\">\n<p align=\"center\"><strong>Kubescape<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"90\" width=\"90\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"75\" width=\"75\">\n<p align=\"center\">~<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"74\" width=\"74\">\n<p align=\"center\">+<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u044b \u043b\u0438\u0448\u044c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0438\u0441\u043a \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0438\u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0432 \u0432\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u0430\u0445, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b, \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0437 \u043d\u0438\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u043c\u0438 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438, \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435.\u00a0<\/p>\n<p>\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u0447\u0435\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, yamllint. \u041f\u043e\u0440\u043e\u0439 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 YAML \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043b\u0438\u043d\u0442\u0435\u0440\u0430 (\u043f\u0435\u0440\u0435\u0434\u0430\u044e \u043f\u043b\u0430\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0432\u0435\u0442 kube-score \u0438 \u043e\u0448\u0438\u0431\u043a\u0435 <em>[CRITICAL] networking.k8s.io\/v1\/Ingress: (\/) No service match was found<\/em>, \u044d\u0442\u0438 \u0434\u0432\u0430 \u0447\u0430\u0441\u0430 \u0431\u044b\u043b\u0438 \u043d\u0435\u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c\u044b).<\/p>\n<p>\u041e\u0442 \u0441\u0435\u0431\u044f \u0434\u0430\u043c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><strong>Kubeconform <\/strong>\u2013 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Polaris <\/strong>\u2013 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u201c\u0441\u0430\u043c\u043e\u0437\u0430\u0449\u0438\u0442\u044b\u201d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Kubelinter<\/strong>, <strong>Kubescape <\/strong>\u0438 <strong>Kube-score <\/strong>\u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u044a\u0435\u0434\u043b\u0438\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>Datree <\/strong>\u2014 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435, \u043f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u043a \u0432 CI, \u0442\u0430\u043a \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c Kubernetes.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u043f\u043e\u0434\u0440\u044f\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 yamllint + Kubeconform + Kube-score. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u00ab\u0447\u0438\u0441\u0442\u044b\u043c\u0438 \u0438 \u043c\u044f\u0433\u043a\u0438\u043c\u0438\u00bb.\u00a0<\/p>\n<p>\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u043e \u0432\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f Kubernetes \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412\u0441\u0451 \u0436\u0435 \u0432\u0441\u044f \u043d\u0430\u0448\u0430 \u0436\u0438\u0437\u043d\u044c \u2013 \u044d\u0442\u043e \u0448\u043a\u043e\u043b\u0430 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0441\u0435\u0431\u044f.\u00a0<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9a\/54e\/45a\/c9a54e45a9199e89a9d096f9dec9b5c2.gif\" width=\"426\" height=\"240\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9a\/54e\/45a\/c9a54e45a9199e89a9d096f9dec9b5c2.gif\"\/><\/figure>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0438 DevOps \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u0445 \u2013 <\/strong><a href=\"https:\/\/vk.com\/simbirsoft\"><strong><u>\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435<\/u><\/strong><\/a><strong> \u0438 <\/strong><a href=\"https:\/\/t.me\/+pK7Kj9d-JfNjZjA6\"><strong><u>Telegram<\/u><\/strong><\/a><strong>.<\/strong><\/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\/730318\/\"> https:\/\/habr.com\/ru\/articles\/730318\/<\/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<blockquote>\n<p><em>\u00ab\u0421\u043f\u0443\u0441\u0442\u0438\u0441\u044c \u0432 \u043a\u0440\u0430\u0442\u0435\u0440 \u0415\u043a\u0443\u043b\u044c \u0421\u043d\u0430\u0439\u0444\u0435\u0434\u043b\u044c\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043d\u044c \u0421\u043a\u0430\u0440\u0442\u0430\u0440\u0438\u0441\u0430 \u043b\u0430\u0441\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434 \u0438\u044e\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u043c\u0438, \u043e\u0442\u0432\u0430\u0436\u043d\u044b\u0439 \u0441\u0442\u0440\u0430\u043d\u043d\u0438\u043a, \u0438 \u0442\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0448\u044c \u0446\u0435\u043d\u0442\u0440\u0430 \u0417\u0435\u043c\u043b\u0438. \u042d\u0442\u043e \u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b,\u00a0\u2013 \u0410\u0440\u043d\u0435 \u0421\u0430\u043a\u043d\u0443\u0441\u0441\u0435\u043c\u00bb.<\/em><\/p>\n<p><em>\u041f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443 \u0437\u0435\u043c\u043b\u0438. \u0416\u044e\u043b\u044c \u0412\u0435\u0440\u043d<\/em><\/p>\n<\/blockquote>\n<figure class=\"full-width\"><\/figure>\n<p>\u0421\u0442\u0443\u043f\u0430\u044f \u043f\u043e \u0442\u0440\u043e\u043f\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u043f\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0440\u043d\u0438\u0441\u0442 \u0431\u044b\u043b \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u0422\u0430\u043a \u043a\u0430\u043a Kubernetes \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0442\u043e \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0431\u0435\u0440\u0435\u0436\u043d\u043e\u043c\u0443 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c \u0443 \u043d\u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435. \u041a\u0430\u043a \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a \u043d\u0435 \u043f\u043e\u043a\u043e\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 Kubernetes \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0441\u0442\u0440\u0430\u0445\u0443\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0432 \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043c\u0438\u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0442\u0451\u043c, \u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 SimbirSoft. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0442\u0440\u0430\u0445\u043e\u043c \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0432\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0451 \u0438 \u0432\u0441\u044f \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u043d\u043e. \u041d\u0435\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0447\u0435\u0440\u043d\u044b\u0435 \u044f\u0449\u0438\u043a\u0438 \u0434\u043b\u044f \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0430 Kubernetes, \u043a\u0442\u043e-\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f root. \u0412 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c Ubuntu \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u043e \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0440\u0443\u0434\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0430\u0448\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e. \u0418\u0437 \u0442\u0430\u043a\u0438\u0445 \u0435\u043b\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439, \u043a\u0430\u043a \u0441\u043d\u0435\u0436\u043d\u044b\u0439 \u043a\u043e\u043c, \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0433\u0440\u0435\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0434\u043e \u0434\u0435\u043f\u043b\u043e\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u0432. \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043a\u043e\u0434 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b) \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Kubernetes, \u0430 \u043b\u0438\u043d\u0442\u0435\u0440\u044b \u2013 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 best-practice. \u0421 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a DevOps \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b CI\/CD, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e\u0442 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u043a\u043e\u0434\u0430. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f GitLab CI, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u044b Kubernetes.\u00a0<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u043b\u043e\u0432 \u2013 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430.<\/p>\n<h2>\u041f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0435<\/h2>\n<p>\u0411\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 Kubernetes (<em>parrot.yaml<\/em>), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 Nginx, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 html-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0441 \u0433\u0438\u0444\u043a\u043e\u0439 \u043f\u043e\u043f\u0443\u0433\u0430\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 Service \u0438 Ingress, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb <em>Parrot<\/em>.\u00a0<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041d\u0430\u0448\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/em><\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"yaml\">--- apiVersion: apps\/v1 kind: Deployment metadata:   name: bird spec:   replicas: 3   selector:     matchLabels:       app.kubernetes.io\/name: parrot-app   template:     metadata:       labels:         app.kubernetes.io\/name: parrot-app     spec:       containers:         - name: bird           image: vregret\/parrot:0.5           imagePullPolicy: Always           ports:             - name: http               protocol: TCP               containerPort: 80  --- apiVersion: v1 kind: Service metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   type: ClusterIP   selector:     app.kubernetes.io\/name: parrot-app   ports:     - port: 80       name: http       protocol: TCP       targetPort: 80  --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: parrot   labels:     app: parrot     app.kubernetes.io\/name: parrot-app spec:   rules:     - host: parrot.aperture.loc       http:         paths:         - path: \/           pathType: ImplementationSpecific           backend:             service:               name: parrot               port:                 number: 80<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0435\u043a\u0438\u0439 \u043c\u043e\u0432\u0435\u0442\u043e\u043d \u2013 \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 helm \u0447\u0430\u0440\u0442 (<em>parrot-app<\/em>) \u043f\u043e\u0434 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0421 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Gitlab CI \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0448 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"\">\n<div><figcaption><em>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f Job CI, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u043d\u0442\u0435\u0440\u044b \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 .gitlab-ci\/jobs\/integration-kubernetes.yaml, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438\u0437 .gitlab-ci.yml, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.\u00a0<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0443\u0442\u0438\u043b\u0438\u0442. \u041a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u0434\u043b\u044f Raw \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f Helm \u0447\u0430\u0440\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 Stage \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439.<\/p>\n<h4>1. Kubeconform<\/h4>\n<ul>\n<li>\n<p><strong>URL<\/strong>: <a href=\"https:\/\/github.com\/yannh\/kubeconform\"><u>https:\/\/github.com\/yannh\/kubeconform<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>: \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e Kubernetes \u0438 json \u0441\u0445\u0435\u043c\u0443, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0443\u0445\u043e\u0432\u043d\u044b\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u044b <em>kubeval <\/em>(\u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0441\u0443\u0434\u044f \u043f\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 github, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 kubeconform). \u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0445 json \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u0442\u044f\u043d\u0435\u0442 \u0438\u0437\u0432\u043d\u0435 (\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0445\u0435\u043c\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>-schema-location<\/em>). \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>-strict<\/em> , kubeconform \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u044b\u0431\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0438\u0437 json \u0441\u0445\u0435\u043c\u044b (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0441\u043e\u0441\u043a\u043e\u0447\u0438\u043b\u0430 \u0440\u0443\u043a\u0430 \u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Pod \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u0441\u043a\u0430 Ansible). \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043e\u043f\u0438\u0448\u0435\u043c \u0438\u0445 \u0432 CI\/CD.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .kubeconform_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     KUBECONFORM_VERSION: \"v0.6.1\"     KUBECONFORM_RAW_PATH: ''     KUBECONFORM_HELM_PATH: ''   before_script:     # Install kubeconform     - wget https:\/\/github.com\/yannh\/kubeconform\/releases\/download\/${KUBECONFORM_VERSION}\/kubeconform-linux-amd64.tar.gz     - tar xf kubeconform-linux-amd64.tar.gz     - mv kubeconform \/usr\/local\/bin   script:     - >       if [[ -z ${KUBECONFORM_HELM_PATH} ]]; then         kubeconform -strict -verbose ${KUBECONFORM_RAW_PATH};       elif [[ -z ${KUBECONFORM_RAW_PATH} ]]; then         helm dependency build ${KUBECONFORM_HELM_PATH};         helm template ${KUBECONFORM_HELM_PATH} | kubeconform -strict -verbose - ;                                                     fi  # .gitlab-ci.yml raw-01:   stage: kubeconform   variables:     KUBECONFORM_RAW_PATH: 'kube\/raw\/*'   tags:     - docker   allow_failure: true   extends: .kubeconform_lint  helm-01:   stage: kubeconform   variables:     KUBECONFORM_HELM_PATH: 'kube\/helm\/parrot-app'   tags:     - docker   allow_failure: true   extends: .kubeconform_lint<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 kubeconform \u043f\u043e\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 parrot.yaml<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, kubeconform \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u0421\u0430\u043c \u0432\u044b\u0432\u043e\u0434 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u2013output=json,junit,tap,text. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Helm \u0447\u0430\u0440\u0442\u0430.\u00a0<\/p>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u043f\u0440\u0438\u0431\u043e\u0440\u0430\u043c \u2013 \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u043d\u043e.<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b kubeconform \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 helm \u0447\u0430\u0440\u0442\u0430<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 helm \u0447\u0430\u0440\u0442 \u0432 Kubernetes \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e helm \u0447\u0430\u0440\u0442\u0430<\/em>  (\u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435)<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <em>helm template<\/em> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0447\u0430\u0440\u0442\u0430.<\/p>\n<pre><code class=\"yaml\">livenessProbe:    httpGet:     path: \/health     port: 8080   initialDelaySeconds: 5   periodSeconds: 3 readinessProbe:    {} startupProbe:    null<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0447\u0430\u0440\u0442\u0430.<\/p>\n<pre><code class=\"yaml\">livenessProbe:                                                                                                                                                                                httpGet:     path: \/health     port: 8080   initialDelaySeconds: 5   periodSeconds: 3 readinessProbe: {} startupProbe:<\/code><\/pre>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f startupProbe, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 readinessProbe \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u0432\u043d\u044b\u043c {}, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 API Kubernetes. \u0414\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e if \u0432 go-template Helm \u0447\u0430\u0440\u0442\u0430, \u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 CI\/CD. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>kubectl apply \u2013dry-run=server,<\/em> \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 API \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442, \u043d\u0443\u0436\u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0430\u0432\u0438\u043b. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u2013 \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h4>2. Conftest<\/h4>\n<ul>\n<li>\n<p><strong>URL: <\/strong><a href=\"https:\/\/github.com\/open-policy-agent\/conftest\"><u>https:\/\/github.com\/open-policy-agent\/conftest<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: <\/strong>\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: <\/strong>\u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: <\/strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442  <\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u043c Kubernetes \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u2013 \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0431\u043b\u0430\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<pre><code class=\"yaml\"># .gitlab-ci\/jobs\/integration-kubernetes.yaml .conftest_lint:   image:      name: dtzar\/helm-kubectl:3.7.2   variables:     CONFTEST_VERSION: \"0.40.0\"     CONFTEST_RAW_PATH: ''     CONFTEST_HELM_PATH: ''     CONFTEST_POLICY_PATH: \".policy\/\"   before_script:     # Install confest     - wget https:\/\/github.com\/open-policy-agent\/conftest\/releases\/download\/v${CONFTEST_VERSION}\/conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz     - tar xf conftest_${CONFTEST_VERSION}_Linux_x86_64.tar.gz     - mv conftest \/usr\/local\/bin   script:     - >       if [[ -z ${CONFTEST_HELM_PATH} ]]; then         conftest test ${CONFTEST_RAW_PATH} -p ${CONFTEST_POLICY_PATH};       elif [[ -z ${CONFTEST_RAW_PATH} ]]; then         helm dependency build ${CONFTEST_HELM_PATH};         helm template ${CONFTEST_HELM_PATH} | conftest test -p ${CONFTEST_POLICY_PATH} - ;                                                     fi  # .gitlab-ci.yml<\/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-406751","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/406751","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=406751"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/406751\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=406751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=406751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=406751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}