{"id":358121,"date":"2024-05-21T00:04:57","date_gmt":"2024-05-21T00:04:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=358121"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=358121","title":{"rendered":"<span>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e Helm \u0447\u0430\u0440\u0442\u0430 \u0438\u043b\u0438 \u043a\u0430\u043a \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0440\u0443\u0442\u0438\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 YAML \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b Kubernetes. \u041f\u0440\u0430\u0432\u0434\u0430, \u043c\u043d\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>kubectl apply<\/code>. \u041d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435&#8230; \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u044f\u0442\u0438, \u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u044e. \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u043e\u0436\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438, \u0442\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0430\u0447\u043a\u0443 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u041f\u0440\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u044f \u043c\u043e\u043b\u0447\u0443.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0438\u043d\u0443\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 CI\/CD Pipeline \u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, &#171;\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c&#187; \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Helm \u0447\u0430\u0440\u0442\u0430 \u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0438\u0437\u0443\u0447\u0438\u0432 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 Helm.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 YAML \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<code>kubectl apply<\/code>, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 Helm \u0447\u0430\u0440\u0442 \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e! \u0423 \u0430\u0432\u0442\u043e\u0440\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Helm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443\/\u0433\u0440\u0443\u0431\u0443\u044e (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 <code>Ctrl+Enter<\/code>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#p1\" rel=\"noopener noreferrer nofollow\">\u0426\u0435\u043b\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p2\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Helm<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p3\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p4\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#p5\" rel=\"noopener noreferrer nofollow\">SecretStore (TLS Certificate)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p6\" rel=\"noopener noreferrer nofollow\">ExternalSecret (TLS Certificate)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p7\" rel=\"noopener noreferrer nofollow\">SecretStore (Lockbox secret)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p8\" rel=\"noopener noreferrer nofollow\">ExternalSecret (Lockbox secret)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p9\" rel=\"noopener noreferrer nofollow\">Service (type: ClusterIP)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p10\" rel=\"noopener noreferrer nofollow\">Deployment<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p11\" rel=\"noopener noreferrer nofollow\">Ingress<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p12\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0432\u043e\u0434: \u0440\u0443\u0442\u0438\u043d\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p13\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#p14\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 \u0447\u0430\u0440\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p15\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p16\" rel=\"noopener noreferrer nofollow\">values.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p17\" rel=\"noopener noreferrer nofollow\">\u0428\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p18\" rel=\"noopener noreferrer nofollow\">cert-secret-store.yaml &amp; lockbox-secret-store.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p19\" rel=\"noopener noreferrer nofollow\">cert-external-secret.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p20\" rel=\"noopener noreferrer nofollow\">lockbox-external-secret.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p21\" rel=\"noopener noreferrer nofollow\">clusterip.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p22\" rel=\"noopener noreferrer nofollow\">deploy.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p23\" rel=\"noopener noreferrer nofollow\">ingress.yaml<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p24\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0430\u0440\u0442 <\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#p25\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p26\" rel=\"noopener noreferrer nofollow\">\u0425\u0443\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p27\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p28\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u043b\u0438\u0437<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p29\" rel=\"noopener noreferrer nofollow\">\u0418\u0442\u043e\u0433\u0438 \u0438 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p1\" id=\"p1\"><\/a><\/p>\n<h2>\u0426\u0435\u043b\u044c<\/h2>\n<p>\u042f \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b <a href=\"https:\/\/github.com\/AzamatKomaev\/kubectl-and-helm-habr\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c<\/a>. \u0422\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u0432\u0435 \u043f\u0430\u043f\u043a\u0438 &#8212; kubectl, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 helm &#8212; \u0447\u0430\u0440\u0442 \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0441\u0430\u043c\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0435\u043e\u0440\u0438\u0438 &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 Helm \u0447\u0430\u0440\u0442, \u0441\u0434\u0435\u043b\u0430\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u043b\u0438\u0437.<\/p>\n<p><a class=\"anchor\" name=\"p2\" id=\"p2\"><\/a><\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Helm<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nk\/ap\/vq\/nkapvq-e7ktqkneni2rls5d8fzq.png\" width=\"1200\" height=\"800\" data-src=\"https:\/\/habrastorage.org\/webt\/nk\/ap\/vq\/nkapvq-e7ktqkneni2rls5d8fzq.png\"\/><\/figure>\n<p><a href=\"https:\/\/helm.sh\/ru\/\" rel=\"noopener noreferrer nofollow\">Helm<\/a> &#8212; \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 Kubernetes. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Helm &#8212; \u044d\u0442\u043e \u0447\u0430\u0440\u0442\u044b. <\/p>\n<p><strong>\u0427\u0430\u0440\u0442 (Chart)<\/strong> &#8212; \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 Kubernetes. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0447\u0430\u0440\u0442\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0447\u0430\u0440\u0442 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e.<\/p>\n<p><strong>\u0420\u0435\u043b\u0438\u0437 (Release)<\/strong> &#8212; \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0447\u0430\u0440\u0442. \u0412 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0430\u0440\u0442\u0430. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0439\u043c\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Kubernetes \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Helm \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0422\u0430\u043a, \u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/artifacthub.io\/packages\/helm\/ingress-nginx\/ingress-nginx\" rel=\"noopener noreferrer nofollow\">ingress-nginx<\/a> \u0438 <a href=\"https:\/\/artifacthub.io\/packages\/helm\/grafana\/loki-stack\" rel=\"noopener noreferrer nofollow\">loki-stack<\/a> (\u043a\u0441\u0442\u0430\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/p\/766102\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>). \u041d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0434\u0435\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Helm \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:<\/p>\n<ol>\n<li>\n<p>Helm \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c. \u0412 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u043f\u043e 4-7 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0447\u0435\u0440\u0435\u0437 envsubst), \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432\u043d\u0435 CI\/CD \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0445\u0435\u043b\u043c\u043e\u0432\u0441\u043a\u043e\u0433\u043e values.yaml (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435) \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0447\u0430\u0440\u0442 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u0440\u0435\u043b\u0438\u0437\u043e\u0432) \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p>Helm \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f (\u0438\u043b\u0438 \u0443\u0436\u0435 \u0441\u0442\u0430\u043b) &#171;\u043c\u0430\u0441\u0442 \u0445\u0435\u0432&#187; \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u0445 \u044f \u0447\u0430\u0449\u0435 \u0441\u0442\u0430\u043b \u0432\u0438\u0434\u0435\u0442\u044c Helm \u0434\u043b\u044f Dev-Ops \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u044f K8s.<\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"p3\" id=\"p3\"><\/a><\/p>\n<h2>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432 Yandex Managed Kubernetes. \u0412 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/cloud.yandex.ru\/services\/lockbox\" rel=\"noopener noreferrer nofollow\">Lockbox<\/a> (\u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442 Yandex Cloud \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432) \u0438 External Secret Operator \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 Kubernetes \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 Yandex.Cloud). \u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b: <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/3e\/3c\/ku\/3e3cku4w-9r6wjkxsi72ayyhjse.png\" width=\"391\" height=\"203\" data-src=\"https:\/\/habrastorage.org\/webt\/3e\/3c\/ku\/3e3cku4w-9r6wjkxsi72ayyhjse.png\"\/><\/figure>\n<ul>\n<li>\n<p><strong>cert-external-secret.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/external-secrets.io\/latest\/api\/externalsecret\/\" rel=\"noopener noreferrer nofollow\">ExternalSecret<\/a>. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437 <a href=\"https:\/\/cloud.yandex.ru\/services\/certificate-manager\" rel=\"noopener noreferrer nofollow\">Yandex Certificate Manager<\/a> \u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, ExternalSecret \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u043a\u0440\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <strong>ingress.yaml<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>cert-secret-store.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/external-secrets.io\/latest\/api\/secretstore\/\" rel=\"noopener noreferrer nofollow\">SecretStore<\/a>. \u041e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c\u0443 API \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d yandexcertificatemanager.<\/p>\n<\/li>\n<li>\n<p><strong>clusterip.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 Service(<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/#type-clusterip\" rel=\"noopener noreferrer nofollow\">ClusterIP<\/a>). \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>deploy.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\" rel=\"noopener noreferrer nofollow\">Deployment<\/a> . \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b. \u0412 \u043d\u0451\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c Java (Spring) \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0432\u0437\u044f\u0442\u044b\u0445 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 Yandex Lockbox. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 <a href=\"https:\/\/cloud.yandex.ru\/services\/container-registry\" rel=\"noopener noreferrer nofollow\">Yandex Container Registry<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>ingress.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/**https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/**\" rel=\"noopener noreferrer nofollow\">Ingress<\/a>. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0447\u0435\u0440\u0435\u0437 HTTP(-S). \u041e\u0434\u043d\u043e\u0433\u043e Ingress \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c Ingress Controller (\u043e\u0431\u044b\u0447\u043d\u043e ingress-nginx). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e cert-external-secret.yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c, \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e HTTPS.<\/p>\n<\/li>\n<li>\n<p><strong>lockbox-external-secret.yaml<\/strong> &#8212; \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 ExternalSecret, \u0432 \u043d\u0451\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 Lockbox.<\/p>\n<\/li>\n<li>\n<p><strong>lockbox-secret-storage.yaml<\/strong> &#8212; \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 SecretStore, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 yandexlockbox.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p4\" id=\"p4\"><\/a><\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0435\u043c \u0432\u0441\u044e \u044d\u0442\u0443 \u043c\u0430\u0445\u0438\u043d\u0443! \u0412\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<code>kubectl apply -f .\/kubectl<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/a8m\/envsubst\" rel=\"noopener noreferrer nofollow\">envsubst<\/a>. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b. \u041e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 CI\/CD \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0438\u0436\u0435, \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<br \/><em>P.S. \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043b\u0438\u0448\u044c \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Helm \u0447\u0430\u0440\u0442\u0430. \u0412\u0430\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b Yandex.Cloud<\/em><\/p>\n<p>\u0427\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b! \u0421\u043f\u0435\u0440\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0435\u043a\u0440\u0435\u0442 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Yandex Cloud:<\/p>\n<pre><code class=\"bash\">$ kubectl create ns kubectl-ns namespace\/kubectl-ns created $ kubectl --namespace kubectl-ns create secret generic yc-auth \\       --from-file=authorized-key=authorized-key.json  secret\/yc-auth created <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p5\" id=\"p5\"><\/a><\/p>\n<h3>SecretStore (TLS Certificate)<\/h3>\n<details class=\"spoiler\">\n<summary>cert-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: spring-app-certificate-secret-store   namespace: kubectl-ns spec:   provider:     yandexcertificatemanager:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ kubectl apply -f .\/kubectl\/cert-secret-store.yaml secretstore.external-secrets.io\/spring-app-certificate-secret-store created $ kubectl -n kubectl-ns get ss\/spring-app-certificate-secret-store NAME                                  AGE   STATUS   CAPABILITIES   READY spring-app-certificate-secret-store   20s   Valid    ReadOnly       True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p6\" id=\"p6\"><\/a><\/p>\n<h3>ExternalSecret (TLS Certificate)<\/h3>\n<details class=\"spoiler\">\n<summary>cert-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: spring-app-certificate-external-secret   namespace: kubectl-ns spec:   refreshInterval: 1h   secretStoreRef:     name: spring-app-certificate-secret-store     kind: SecretStore   target:     name: spring-app-certificate-secret     template:       type: kubernetes.io\/tls   data:   - secretKey: tls.crt     remoteRef:       key: $CERTIFICATE_ID       property: chain   - secretKey: tls.key     remoteRef:       key: $CERTIFICATE_ID       property: privateKey<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 $CERTIFICATE_ID. \u0422\u0430\u043a \u043a\u0430\u043a ID \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438\u0437 Certificate Manager \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043f\u043b\u043e\u0445\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0437\u043d\u0430\u0442\u044c ID \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f CERTIFICATE_ID \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 envsubst:<\/p>\n<pre><code class=\"bash\">$ export CERTIFICATE_ID=&lt;your_certificate_id_here> $ envsubst \\$CERTIFICATE_ID &lt; .\/kubectl\/cert-external-secret.yaml | kubectl apply -f - $ kubectl -n kubectl-ns get externalsecret\/spring-app-certificate-external-secret NAME                                     STORE                                 REFRESH INTERVAL   STATUS         READY spring-app-certificate-external-secret   spring-app-certificate-secret-store   1h                 SecretSynced   True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p7\" id=\"p7\"><\/a><\/p>\n<h3>SecretStore (Lockbox secret)<\/h3>\n<details class=\"spoiler\">\n<summary>lockbox-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: spring-app-lockbox-secret-store   namespace: kubectl-ns spec:   provider:     yandexlockbox:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ kubectl apply -f .\/kubectl\/lockbox-secret-store.yaml secretstore.external-secrets.io\/spring-app-lockbox-secret-store created $ kubectl -n kubectl-ns get ss\/spring-app-lockbox-secret-store   NAME                              AGE   STATUS   CAPABILITIES   READY spring-app-lockbox-secret-store   51s   Valid    ReadOnly       True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p8\" id=\"p8\"><\/a><\/p>\n<h3>ExternalSecret (Lockbox secret)<\/h3>\n<details class=\"spoiler\">\n<summary>lockbox-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: spring-app-lockbox-external-secret   namespace: kubectl-ns spec:   refreshInterval: 1h   secretStoreRef:     name: spring-app-lockbox-secret-store     kind: SecretStore   target:     name: spring-app-lockbox-secret   data:   - secretKey: JDBC_URL     remoteRef:       key: $SECRET_ID       property: JDBC_URL   - secretKey: DB_USERNAME     remoteRef:       key: $SECRET_ID       property: DB_USERNAME   - secretKey: DB_PASSWORD     remoteRef:       key: $SECRET_ID       property: DB_PASSWORD<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b $SECRET_ID &#8212; ID Yandex Lockbox \u0441\u0435\u043a\u0440\u0435\u0442\u0430.<\/p>\n<pre><code class=\"bash\">$ export SECRET_ID=&lt;your_lockbox_secret_id_here> $ envsubst \\$SECRET_ID &lt; .\/kubectl\/lockbox-external-secret.yaml | kubectl apply -f - externalsecret.external-secrets.io\/spring-app-lockbox-external-secret created $ kubectl -n kubectl-ns get externalsecret\/spring-app-lockbox-external-secret  NAME                                 STORE                             REFRESH INTERVAL   STATUS         READY spring-app-lockbox-external-secret   spring-app-lockbox-secret-store   1h                 SecretSynced   True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p9\" id=\"p9\"><\/a><\/p>\n<h3>Service (type: ClusterIP)<\/h3>\n<details class=\"spoiler\">\n<summary>clusterip.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: v1 kind: Service metadata:   name: spring-app   namespace: kubectl-ns   labels:     app-label: spring-app-clusterip-label spec:   ports:   - name: http     protocol: TCP     port: 80     targetPort: http   selector:     app-label: spring-app-label<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ kubectl apply -f .\/kubectl\/clusterip.yaml service\/spring-app created <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p10\" id=\"p10\"><\/a><\/p>\n<h3>Deployment<\/h3>\n<details class=\"spoiler\">\n<summary>deploy.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: apps\/v1 kind: Deployment metadata:   name: spring-app   namespace: kubectl-ns   labels:     app-label: spring-app-label spec:   replicas: 1   selector:     matchLabels:       app-label: spring-app-label   template:     metadata:       labels:         app-label: spring-app-label     spec:       containers:       - name: spring-app-app         image: cr.yandex\/$REGISTRY_ID\/spring-app:$VERSION         ports:         - name: http           containerPort: 8080         env:         # --- variables from Yandex Lockbox         - name: JDBC_URL           valueFrom:             secretKeyRef:               name: spring-app-lockbox-secret               key: JDBC_URL         - name: DB_USERNAME           valueFrom:             secretKeyRef:               name: spring-app-lockbox-secret               key: DB_USERNAME         - name: DB_PASSWORD           valueFrom:             secretKeyRef:               name: spring-app-lockbox-secret               key: DB_PASSWORD<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: $REGISTRY_ID &#8212; ID \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0438 $VERSION &#8212; \u0432\u0435\u0440\u0441\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<pre><code class=\"bash\">$ export REGISTRY_ID=&lt;your_container_registry_id_here> $ export VERSION=&lt;your_image_version_here> $ envsubst \\$REGISTRY_ID,\\$VERSION &lt; .\/kubectl\/deploy.yaml | kubectl apply -f - deployment.apps\/spring-app created $ kubectl -n kubectl-ns get deploy\/spring-app NAME         READY   UP-TO-DATE   AVAILABLE   AGE spring-app   1\/1     1            1           17m <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p11\" id=\"p11\"><\/a><\/p>\n<h3>Ingress<\/h3>\n<details class=\"spoiler\">\n<summary>ingress.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: spring-app-ingress   namespace: kubectl-ns spec:   tls:     - hosts:       - spring-app.dev.example.com       secretName: spring-app-certificate-secret   ingressClassName: spring-app-class-resource   rules:     - host: spring-app.dev.example.com       http:         paths:         - path: \/           pathType: Prefix           backend:             service:               name: spring-app               port:                 name: http<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 ingress.yaml \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c Ingress Controller.<\/p>\n<p><a class=\"anchor\" name=\"p12\" id=\"p12\"><\/a><\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434: \u0440\u0443\u0442\u0438\u043d\u0430<\/h3>\n<p>\u041c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0447\u0430\u0449\u0435, \u0447\u0435\u043c \u0440\u0430\u0437 \u0432 \u0436\u0438\u0437\u043d\u0438? \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c bash \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 bash \u0441\u043a\u0440\u0438\u043f\u0442. \u0420\u0443\u0442\u0438\u043d\u0430, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438? \u0418 \u0442\u0443\u0442 \u043a \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 Helm!<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u043c \u0443\u0434\u0430\u043b\u0438\u043c \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b:<\/p>\n<pre><code class=\"bash\">$ kubectl delete -f .\/kubectl\/ externalsecret.external-secrets.io \"spring-app-certificate-external-secret\" deleted secretstore.external-secrets.io \"spring-app-certificate-secret-store\" deleted service \"spring-app\" deleted deployment.apps \"spring-app\" deleted ingress.networking.k8s.io \"spring-app-ingress\" deleted externalsecret.external-secrets.io \"spring-app-lockbox-external-secret\" deleted secretstore.external-secrets.io \"spring-app-lockbox-secret-store\" deleted <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p13\" id=\"p13\"><\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0447\u0430\u0440\u0442:<\/p>\n<pre><code class=\"bash\">$ helm create helm-chart Creating helm-chart <\/code><\/pre>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0430\u0440\u0442\u0430: <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vv\/31\/i2\/vv31i296jtxlsvkexurc2xjrwfc.png\" width=\"450\" height=\"314\" data-src=\"https:\/\/habrastorage.org\/webt\/vv\/31\/i2\/vv31i296jtxlsvkexurc2xjrwfc.png\"\/><\/figure>\n<p> \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>helm create<\/code> \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043f\u043e\u043a \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u043a\u0430\u0436\u0434\u043e\u043c: <\/p>\n<ul>\n<li>\n<p><strong>charts\/<\/strong> &#8212; \u043f\u0430\u043f\u043a\u0430, <a href=\"https:\/\/helm.sh\/docs\/chart_best_practices\/dependencies\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u044b<\/a>, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>Chart.yaml<\/strong> &#8212;  \u0444\u0430\u0439\u043b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0447\u0430\u0440\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>templates\/<\/strong> &#8212; \u043f\u0430\u043f\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u044b Kubernetes \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 Helm.<\/p>\n<\/li>\n<li>\n<p><strong>templates\/*.tpl<\/strong> &#8212; \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 <a href=\"https:\/\/helm.sh\/docs\/chart_template_guide\/named_templates\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043c\u0435\u043d\u043d\u043e\u0432\u0430\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b<\/a>. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c tpl \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>values.yaml<\/strong> &#8212; \u0444\u0430\u0439\u043b, <a href=\"https:\/\/helm.sh\/docs\/chart_template_guide\/values_files\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p14\" id=\"p14\"><\/a><\/p>\n<h3>\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 \u0447\u0430\u0440\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438\u0437 kubectl \u0432 helm \u0447\u0430\u0440\u0442. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u0430 &#8212; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 Helm, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u0439\u043b\u043e\u043c <code>values.yaml<\/code><\/p>\n<p><a class=\"anchor\" name=\"p15\" id=\"p15\"><\/a><\/p>\n<h3>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h3>\n<p>\u0412 Helm, \u043f\u043e\u043c\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 (\u0434\u0430\u043b\u044c\u0448\u0435) \u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445 \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a <code>Release.Name<\/code> (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430),<code>Values.example<\/code>(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 example \u0438\u0437 <code>values.yaml<\/code>),<code>Chart.Version<\/code>(\u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0440\u0442\u0430) \u0438 \u0442.\u0434. \u0421 \u043f\u043e\u043b\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c Built-in \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/helm.sh\/docs\/chart_template_guide\/builtin_objects\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"p16\" id=\"p16\"><\/a><\/p>\n<h3>values.yaml<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0430\u0440\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0444\u0430\u0439\u043b <code>values.yaml<\/code>. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0440\u0435\u043b\u0438\u0437\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043f\u0443\u0441\u0442\u044b\u043c \u0438 \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<p><a class=\"anchor\" name=\"p17\" id=\"p17\"><\/a><\/p>\n<h3>_helpers.tpl<\/h3>\n<details class=\"spoiler\">\n<summary>_helpers.tpl<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{\/* Expand the name of the chart. *\/}} {{- define \"helm-chart.name\" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }} {{- end }}  {{\/* Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. *\/}} {{- define \"helm-chart.fullname\" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }} {{- else }} {{- $name := default .Chart.Name .Values.nameOverride }} {{- if contains $name .Release.Name }} {{- .Release.Name | trunc 63 | trimSuffix \"-\" }} {{- else }} {{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }} {{- end }} {{- end }} {{- end }}  {{\/* Create chart name and version as used by the chart label. *\/}} {{- define \"helm-chart.chart\" -}} {{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }} {{- end }}  {{\/* Common labels *\/}} {{- define \"helm-chart.labels\" -}} helm.sh\/chart: {{ include \"helm-chart.chart\" . }} {{ include \"helm-chart.selectorLabels\" . }} {{- if .Chart.AppVersion }} app.kubernetes.io\/version: {{ .Chart.AppVersion | quote }} {{- end }} app.kubernetes.io\/managed-by: {{ .Release.Service }} {{- end }}  {{\/* Selector labels *\/}} {{- define \"helm-chart.selectorLabels\" -}} app.kubernetes.io\/name: {{ include \"helm-chart.name\" . }} app.kubernetes.io\/instance: {{ .Release.Name }} {{- end }}  {{\/* Create the name of the service account to use *\/}} {{- define \"helm-chart.serviceAccountName\" -}} {{- if .Values.serviceAccount.create }} {{- default (include \"helm-chart.fullname\" .) .Values.serviceAccount.name }} {{- else }} {{- default \"default\" .Values.serviceAccount.name }} {{- end }} {{- end }}  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e\u0432\u0430\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b. \u0412 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Built-In \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p>&#171;<a href=\"http:\/\/helm-chart.name\" rel=\"noopener noreferrer nofollow\">helm-chart.name<\/a>&#187; &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>&#171;helm-chart.fullname&#187; &#8212; \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>&#171;helm-chart.chart&#187; &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430 + \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>&#171;helm-chart.labels&#187; &#8212; \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0447\u0430\u0440\u0442\u0430 \u043c\u0435\u0442\u043a\u0438. \u042f \u0438\u0445 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0437\u0434\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e <a href=\"https:\/\/helm.sh\/docs\/chart_best_practices\/labels\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Helm<\/a> \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>&#171;helm-chart.selectorLabels&#187; &#8212; \u043c\u0435\u0442\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0432 \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 ReplicaSet \u0438 Deployment. \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u0438 \u043c\u0435\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d &#171;helm-chart.labels&#187;<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p17\" id=\"p17\"><\/a><\/p>\n<h3>\u0428\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"https:\/\/helm.sh\/docs\/chart_template_guide\/functions_and_pipelines\/\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a>.<\/p>\n<p>\u0421\u0442\u0430\u0440\u0442\u0443\u0435\u043c! \u041d\u0430\u0447\u043d\u0451\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u0438\u0437 kubectl.<\/p>\n<p><a class=\"anchor\" name=\"p18\" id=\"p18\"><\/a><\/p>\n<h3>cert-secret-store.yaml &amp; lockbox-secret-store.yaml<\/h3>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438\u0437 kubectl \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 templates:<\/p>\n<pre><code class=\"bash\">$ cp -r .\/kubectl\/*-secret-store.yaml .\/helm-chart\/templates  <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0443\u0434\u0430\u043b\u0438\u043c \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<pre><code class=\"yaml\">metadata:   name: {{ .Release.Name }}-certificate-secret-store <\/code><\/pre>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d helm-chart.labels \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e include \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432\u044b\u0432\u043e\u0434 (\u0441\u0438\u043c\u0432\u043e\u043b | ) \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/helm.sh\/docs\/chart_template_guide\/function_list\/#nindent\" rel=\"noopener noreferrer nofollow\">nident<\/a>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438. \u042f \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e 4, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432:<\/p>\n<pre><code class=\"yaml\">metadata:   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0445\u0435\u043b\u043c\u0430, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0443\u0435\u043c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>helm install<\/code> \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>--dry-run<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#171;\u043f\u043e\u043d\u0430\u0440\u043e\u0448\u043a\u0443&#187; \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0447\u0430\u0440\u0442:<\/p>\n<pre><code class=\"bash\">$ helm install --dry-run test-release .\/helm-chart NAME: test-release STATUS: pending-install MANIFEST: --- # Source: helm-chart\/templates\/cert-secret-store.yaml apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: test-release-certificate-secret-store   labels:     helm.sh\/chart: helm-chart-0.1.0     app.kubernetes.io\/name: helm-chart     app.kubernetes.io\/instance: test-release     app.kubernetes.io\/version: \"1.16.0\"     app.kubernetes.io\/managed-by: Helm   ... <\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438 \u043c\u0435\u0442\u043a\u0438 \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442.<br \/> \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c \u0438 Lockbox \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c, \u0441\u0434\u0435\u043b\u0430\u0435\u043c SecretStore \u0438 ExternalSecret \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>values.yaml<\/code>:<\/p>\n<pre><code class=\"yaml\">lockboxSecretStore:   enabled: true  certificateSecretStore:   enabled: true <\/code><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 true.<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0440\u0430\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"yaml\">{{- if .Values.certificateSecretStore.enabled -}} apiVersion: external-secrets.io\/v1beta1 kind: SecretStore ... {{- end }} <\/code><\/pre>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c <code>helm install --dry-run<\/code>, \u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>certificateSecretStore.enabled<\/code>, \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0433\u043e false. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 <code>values.yaml<\/code> \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u043c \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>--set<\/code>. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c:<\/p>\n<pre><code class=\"bash\">$ helm install --dry-run --set certificateSecretStore.enabled=false test-release .\/helm-chart NAME: test-release STATUS: pending-install MANIFEST: <\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>cert-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{- if .Values.certificateSecretStore.enabled -}} apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: {{ .Release.Name }}-certificate-secret-store   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   provider:     yandexcertificatemanager:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>lockbox-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{- if .Values.lockboxSecretStore.enabled -}} apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: {{ .Release.Name }}-lockbox-secret-store   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   provider:     yandexlockbox:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p19\" id=\"p19\"><\/a><\/p>\n<h3>cert-external-secret.yaml<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a SecretStore \u0438 ExternalSecret \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0434\u043b\u044f ExternalSecret \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f ID \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0432 <code>values.yaml<\/code>:<\/p>\n<pre><code class=\"yaml\">certificateSecretStore:   enabled: true   externalSecret:     certificateId: \"\" <\/code><\/pre>\n<p>\u0418 \u0437\u0430\u0442\u0435\u043c \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442:<\/p>\n<pre><code class=\"yaml\">...   - secretKey: tls.crt     remoteRef:       key: {{ .Values.certificateSecretStore.externalSecret.certificateId }}       property: chain   - secretKey: tls.key     remoteRef:       key: {{ .Values.certificateSecretStore.externalSecret.certificateId }}       property: privateKey <\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>cert-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{- if .Values.certificateSecretStore.enabled -}} apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: {{ .Release.Name }}-certificate-external-secret   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   refreshInterval: 1h   secretStoreRef:     name: {{ .Release.Name }}-certificate-secret-store     kind: SecretStore   target:     name: {{ .Release.Name }}-certificate-secret     template:       type: kubernetes.io\/tls   data:   - secretKey: tls.crt     remoteRef:       key: {{ .Values.certificateSecretStore.externalSecret.certificateId }}       property: chain   - secretKey: tls.key     remoteRef:       key: {{ .Values.certificateSecretStore.externalSecret.certificateId }}       property: privateKey {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p20\" id=\"p20\"><\/a><\/p>\n<h3>lockbox-external-secret.yaml<\/h3>\n<p>\u0412\u0441\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0435\u043d\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u043f\u043e\u043b\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u0445 \u0432 <code>values.yaml<\/code>. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438 $SECRET_ID:<\/p>\n<pre><code class=\"yaml\">lockboxSecretStore:   enabled: true   externalSecret:     secretId: \"\"     data:     - secretKey: JDBC_URL       property: JDBC_URL     - secretKey: DB_USERNAME       property: DB_USERNAME     - secretKey: DB_PASSWORD       property: DB_PASSWORD <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0446\u0438\u043a\u043b\u043e\u043c &#8212; \u0432 Helm \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>range<\/code>:<\/p>\n<pre><code class=\"yaml\">... spec:   ...     data:    {{- range .Values.lockboxSecretStore.externalSecret.data }}     - secretKey: {{ .secretKey }}       remoteRef:         key: {{ $.Values.lockboxSecretStore.externalSecret.secretId }}         property: {{ .property }}   {{- end }} <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0437\u043d\u0430\u043a \u0434\u043e\u043b\u043b\u0430\u0440\u0430 \u0432 remoteRef.key. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b <code>range<\/code> \u0438 <code>with<\/code>  \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>.<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <code>range<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 <code>values.yaml<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>$.<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>lockbox-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{- if .Values.lockboxSecretStore.enabled -}} apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: {{ .Release.Name }}-lockbox-external-secret   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   refreshInterval: 1h   secretStoreRef:     name: {{ .Release.Name }}-lockbox-secret-store     kind: SecretStore   target:     name: {{ .Release.Name }}-lockbox-secret   data:   {{- range .Values.lockboxSecretStore.externalSecret.data }}     - secretKey: {{ .secretKey }}       remoteRef:         key: {{ $.Values.lockboxSecretStore.externalSecret.secretId }}         property: {{ .property }}           {{- end }} {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p21\" id=\"p21\"><\/a><\/p>\n<h3>clusterip.yaml<\/h3>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u0412\u044b\u043d\u0435\u0441\u0435\u043c \u0432 <code>values.yaml<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>spec.ports[0].port<\/code> \u0438 <code>spec.ports[0].targetPort<\/code>:<\/p>\n<pre><code class=\"yaml\">clusterip:   port: 80   targetPort: http <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c <code>helm-chart.selectorLabels<\/code>, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438:<\/p>\n<pre><code class=\"yaml\">... spec:   ports:   - name: http     protocol: TCP     port: {{ .Values.clusterip.port }}     targetPort: {{ .Values.clusterip.targetPort }}   selector:     {{- include \"helm-chart.selectorLabels\" . | nindent 4 }} <\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>clusterip.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: v1 kind: Service metadata:   name: {{ .Release.Name }}   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   ports:   - name: http     protocol: TCP     port: {{ .Values.clusterip.port }}     targetPort: {{ .Values.clusterip.targetPort }}   selector:     {{- include \"helm-chart.selectorLabels\" . | nindent 4 }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p22\" id=\"p22\"><\/a><\/p>\n<h3>deploy.yaml<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>values.yaml<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"yaml\">deployment:   replicaCount: 1   image: \"\"   containerPort: 8080   resources:     requests:       cpu: \"150m\"       memory: \"400Mi\"     limits:       cpu: \"250m\"       memory: \"600Mi\"  <\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 Lockbox \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0446\u0438\u043a\u043b, \u043a\u0430\u043a \u0432 <code>lockbox-external-secret.yaml<\/code>, \u043d\u043e \u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u043a\u043b\u043e\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0447\u0442\u043e Lockbox \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u0438\u0437\u0435. \u0427\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435! \u0412\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b) \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>toYaml<\/code>:<\/p>\n<pre><code class=\"yaml\">spec:   ...   template:     ...     spec:       containers:       - name: {{ .Release.Name }}-app image: {{ .Values.deployment.image }} ports: - name: {{ .Values.clusterip.targetPort }}   containerPort: {{ .Values.deployment.containerPort }} resources:           {{- toYaml .Values.deployment.resources | nindent 10 }}     {{- if .Values.lockboxSecretStore.enabled }}         env:         {{- range .Values.lockboxSecretStore.externalSecret.data }}         - name: {{ .secretKey }}           valueFrom:             secretKeyRef:               name: {{ $.Release.Name }}-lockbox-secret               key: {{ .secretKey }}         {{- end }}         {{- end }} <\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>deploy.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: apps\/v1 kind: Deployment metadata:   name: {{ .Release.Name }}   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   replicas: {{ .Values.deployment.replicaCount }}   selector:     matchLabels:       {{- include \"helm-chart.selectorLabels\" . | nindent 6 }}   template:     metadata:       labels:         {{- include \"helm-chart.selectorLabels\" . | nindent 8 }}     spec:       containers:       - name: {{ .Release.Name }}-app         image: {{ .Values.deployment.image }}         ports:         - name: {{ .Values.clusterip.targetPort }}           containerPort: {{ .Values.deployment.containerPort }}         resources:           {{- toYaml .Values.deployment.resources | nindent 10 }}         {{- if .Values.lockboxSecretStore.enabled }}         env:         {{- range .Values.lockboxSecretStore.externalSecret.data }}         - name: {{ .secretKey }}           valueFrom:             secretKeyRef:               name: {{ $.Release.Name }}-lockbox-secret               key: {{ .secretKey }}         {{- end }}         {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p23\" id=\"p23\"><\/a><\/p>\n<h3>ingress.yaml<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 Ingress. \u0422\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0441 <code>ExternalSecret<\/code>, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0430 \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 <code>values.yaml<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"yaml\">ingress:   enabled: true   host: \"\" <\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>ingress.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">{{- if .Values.ingress.enabled -}} apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: {{ .Release.Name }}   namespace: {{ .Release.Namespace }}   labels:     {{- include \"helm-chart.labels\" . | nindent 4 }} spec:   tls:     - hosts:       - {{ .Values.ingress.host }}       secretName: {{ .Release.Name }}-certificate-secret   ingressClassName: {{ .Release.Name }}-class-resource   rules:     - host: {{ .Values.ingress.host }}       http:         paths:         - path: \/           pathType: Prefix           backend:             service:               name: {{ .Release.Name }}               port:                 name: {{ .Values.clusterip.port }} {{- end }}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 values.yaml \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>values.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">lockboxSecretStore:   enabled: true   externalSecret:     secretId: \"\"     data:     - secretKey: JDBC_URL       property: JDBC_URL     - secretKey: DB_USERNAME       property: DB_USERNAME     - secretKey: DB_PASSWORD       property: DB_PASSWORD  certificateSecretStore:   enabled: true   externalSecret:     certificateId: \"\"  clusterip:   port: 80   targetPort: http  deployment:   replicaCount: 1   image: \"\"   containerPort: 8080      resources:     requests:       cpu: \"150m\"       memory: \"400Mi\"     limits:       cpu: \"250m\"       memory: \"600Mi\"  ingress:   enabled: true   host: \"\"<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"p24\" id=\"p24\"><\/a><\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0430\u0440\u0442<\/h2>\n<p>\u0418 \u0442\u0430\u043a, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 Helm \u0447\u0430\u0440\u0442 \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0438\u043c <code>values.yaml<\/code> \u0444\u0430\u0439\u043b\u043e\u043c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>values.yaml<\/code>, \u043d\u043e \u0432\u0440\u044f\u0434-\u043b\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u043c \u0432\u0430\u0448\u0438\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>--set<\/code> \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u043b\u0438 \u0436\u0435, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043c\u043d\u043e\u0433\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c yaml \u0444\u0430\u0439\u043b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>-f<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0444\u0430\u0439\u043b\u0438\u043a <code>my-app-values.yaml<\/code>. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0447\u0430\u0440\u0442:<\/p>\n<pre><code class=\"bash\">$ helm install -n kubectl-ns -f .\/my-app-values.yaml my-app .\/helm-chart  NAME: my-app LAST DEPLOYED: Fri Oct 20 17:21:18 2023 NAMESPACE: kubectl-ns STATUS: deployed REVISION: 1 TEST SUITE: None <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432:<\/p>\n<pre><code class=\"bash\">$ kubectl -n kubectl-ns get all                                      NAME                                 READY   STATUS   RESTARTS      AGE pod\/my-app-84c8d4cfdd-mhqb4   0\/1    Error   1 (36s ago)  106s  NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE service\/my-app          ClusterIP   10.96.167.201   &lt;none>        80\/TCP    107s  NAME                            READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps\/my-app          0\/1     1            0           107s  NAME                                       DESIRED   CURRENT   READY   AGE replicaset.apps\/my-app-84c8d4cfdd          1         1         0       107s <\/code><\/pre>\n<p>\u041f\u043e\u0434 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0441\u044f! \u0412\u044b\u044f\u0441\u043d\u0438\u043c \u0432 \u0447\u0451\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>kubectl describe<\/code>:<\/p>\n<pre><code class=\"bash\">$ kubectl -n kubectl-ns describe pods\/my-app-84c8d4cfdd-mhqb4 Events:   Type     Reason     Age                    From               Message   ----     ------     ----                   ----               -------   Normal   Scheduled  5m40s                  default-scheduler  Successfully assigned kubectl-ns\/my-app-84c8d4cfdd-mhqb4 to cl12s2vrpmu4of6it02q-itys   Warning  Failed     5m40s (x2 over 5m40s)  kubelet            Error: secret \"my-app-lockbox-secret\" not found <\/code><\/pre>\n<p>secret not found. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443? \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"bash\">$ kubectl -n kubectl-ns get secret                                    NAME                                  TYPE                                  DATA   AGE my-app-certificate-secret             kubernetes.io\/tls                     2      7m40s my-app-lockbox-secret                 Opaque                                4      7m39s <\/code><\/pre>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442 \u0436\u0435 \u043e\u043d\u0438! \u042f \u0431\u044b\u043b \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0441\u0442\u0443\u043f\u043e\u0440\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c \u0432 \u0447\u0435\u043c \u0434\u0435\u043b\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0447\u0430\u0440\u0442\u0430, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>--dry-run<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443: \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0440\u0442 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, &#171;\u0433\u0440\u0435\u043f\u043d\u0435\u043c&#187; \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:<\/p>\n<pre><code>$ helm install --dry-run -n kubectl-ns -f .\/my-app-values.yaml config-server .\/helm-chart | grep \"Source:\" # Source: helm-chart\/templates\/clusterip.yaml # Source: helm-chart\/templates\/deploy.yaml # Source: helm-chart\/templates\/ingress.yaml # Source: helm-chart\/templates\/cert-external-secret.yaml # Source: helm-chart\/templates\/lockbox-external-secret.yaml # Source: helm-chart\/templates\/cert-secret-store.yaml # Source: helm-chart\/templates\/lockbox-secret-store.yaml <\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043b\u0438? ExternalSecret \u0438 SecretStore \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 Deployment.<\/p>\n<p><a class=\"anchor\" name=\"p25\" id=\"p25\"><\/a><\/p>\n<h3>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p>Helm \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0447\u0430\u0440\u0442\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0442\u0430\u043a\u043e\u0439 \u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e\u0441\u0442\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0447\u0435\u0440\u0435\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wl\/wv\/w-\/wlwvw-vkxeg_an-vpi5q1-zla20.png\" alt=\"\" title=\"\" width=\"230\" height=\"825\" data-src=\"https:\/\/habrastorage.org\/webt\/wl\/wv\/w-\/wlwvw-vkxeg_an-vpi5q1-zla20.png\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, Secret(5) \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 Deployment(21). \u041d\u043e \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0435\u043a\u0440\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 Lockbox \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 ExternalSecret, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Helm \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0435\u043c\u0443 \u0442\u0438\u043f\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 (SecretStore \u0438 ExternalSecret). \u041d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0445\u0443\u043a\u043e\u0432 \u0447\u0430\u0440\u0442\u0430. <\/p>\n<p><a class=\"anchor\" name=\"p26\" id=\"p26\"><\/a><\/p>\n<h3>\u0425\u0443\u043a\u0438<\/h3>\n<p><a href=\"https:\/\/helm.sh\/docs\/topics\/charts_hooks\/\" rel=\"noopener noreferrer nofollow\">\u0425\u0443\u043a\u0438<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0445\u0443\u043a, \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>helm.sh\/hook<\/code>. \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0445\u0443\u043a\u043e\u0432 \u043f\u0440\u0438\u0432\u0451\u0434\u0435\u043d \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/iz\/nd\/zv\/izndzvmk_7km-yz36tixroihqka.png\" width=\"1290\" height=\"571\" data-src=\"https:\/\/habrastorage.org\/webt\/iz\/nd\/zv\/izndzvmk_7km-yz36tixroihqka.png\"\/><\/figure>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <code>pre-install<\/code>. \u041f\u043e\u043c\u0438\u043c\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0445\u0443\u043a\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0435\u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>helm.sh\/hook-weight<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0445\u0443\u043a\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441, \u0440\u0430\u0432\u043d\u044b\u0439 &#171;0&#187;. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. Helm \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f \u0432\u0435\u0441\u0430. \u041a\u0440\u043e\u043c\u0435 \u0434\u0432\u0443\u0445 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>helm.sh\/hook-delete-policy<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0445\u0443\u043a\u0430: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lb\/f5\/gc\/lbf5gcv8jkya45wcgpr392umg9a.png\" width=\"672\" height=\"375\" data-src=\"https:\/\/habrastorage.org\/webt\/lb\/f5\/gc\/lbf5gcv8jkya45wcgpr392umg9a.png\"\/><\/figure>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u0430\u043d <code>before-hook-creation<\/code>, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0445\u0443\u043a\u043e\u043c, \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0445\u0443\u043a. <\/p>\n<p><a class=\"anchor\" name=\"p27\" id=\"p27\"><\/a><\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u043b\u0435\u0437\u0435\u043c \u0432 \u043a\u043e\u0434. \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0442\u0438\u043f\u0430 ExternalSecret \u0438 SecretStore \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0441 \u0445\u0443\u043a\u043e\u043c <code>pre-install<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0442\u0438\u043f\u0430 SecretStore \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043c \u0432\u0435\u0441 &#171;-2&#187;. \u0422\u043e\u0433\u0434\u0430 ExternalSecret \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0435\u0441 &#171;-1&#187;. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0443\u043a\u0430 \u043d\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Deployment \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Ingress \u043f\u043e HTTPS, \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <code>helm.sh\/hook-deletion-policy<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p><code>cert-secret-store.yaml<\/code> | <code>lockbox-secret-store.yaml<\/code>:<\/p>\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   ...   annotations:     \"helm.sh\/hook\": pre-install     \"helm.sh\/hook-weight\": \"-2\" ... <\/code><\/pre>\n<p><code>cert-external-secret.yaml<\/code> | <code>lockbox-external-secret<\/code>:<\/p>\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   ...   annotations:     \"helm.sh\/hook\": pre-install     \"helm.sh\/hook-weight\": \"-1\" ... <\/code><\/pre>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0447\u0430\u0440\u0442\u0430 \u0438 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Running:<\/p>\n<pre><code class=\"bash\">$ kubectl -n kubectl-ns get pods NAME                             READY   STATUS    RESTARTS      AGE my-app-84c8d4cfdd-hksz5          1\/1     Running   0             49s <\/code><\/pre>\n<p>\u041f\u043e\u0434 \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d!<\/p>\n<p><a class=\"anchor\" name=\"p28\" id=\"p28\"><\/a><\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u043b\u0438\u0437<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u043b\u0438\u0437. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 <a href=\"https:\/\/hub.docker.com\/_\/nginx\" rel=\"noopener noreferrer nofollow\">nginx<\/a>. \u0412\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u044d\u0442\u043e Deployment \u0438 Service(ClusterIP). \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437, \u0434\u043b\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u043b\u0438\u0437\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>--set<\/code>:<\/p>\n<pre><code class=\"bash\">$ kubectl create namespace nginx-helm namespace\/nginx-helm created $ helm install \\     -n nginx-helm \\     --set lockboxSecretStore.enabled=false \\     --set certificateSecretStore.enabled=false \\     --set deployment.image=nginx:1.25.2 \\     --set deployment.containerPort=80 \\     --set ingress.enabled=false \\     nginx .\/helm-chart NAME: nginx LAST DEPLOYED: Fri Oct 20 20:10:58 2023 NAMESPACE: nginx-helm STATUS: deployed REVISION: 1 TEST SUITE: None $ kubectl -n nginx-helm get all NAME                         READY   STATUS    RESTARTS   AGE pod\/nginx-658dbf5895-5rrmm   1\/1     Running   0          14s  NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE service\/nginx   ClusterIP   10.96.171.141   &lt;none>        80\/TCP    14s  NAME                    READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps\/nginx   1\/1     1            1           14s  NAME                               DESIRED   CURRENT   READY   AGE replicaset.apps\/nginx-658dbf5895   1         1         1       14s <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d:<\/p>\n<pre><code class=\"bash\">$ helm -n nginx-helm ls NAME    NAMESPACE       REVISION        UPDATED                                 STATUS       CHART                   APP VERSION nginx   nginx-helm      1               2023-10-20 20:10:58.163471204 +0300 MSK deployed     helm-chart-0.1.0        1.16.0  <\/code><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0438\u043c \u0440\u0435\u043b\u0438\u0437:<\/p>\n<pre><code class=\"bash\">$ helm -n nginx-helm uninstall nginx      release \"nginx\" uninstalled <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p29\" id=\"p29\"><\/a><\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438 \u0438 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h2>\n<p>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u0430 &#8212; \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0447\u0430\u0440\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439! \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0447\u0430\u0440\u0442\u043e\u043c \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0430\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u042f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0430\u0440\u0442 \u0434\u043b\u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 Helm. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u0447\u0430\u0440\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0431\u0443\u0434\u0443 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c (\u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 &#8212; welcome). \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/769046\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Helm \u0432 \u0441\u0432\u043e\u0451\u043c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">69.39% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u0430\u043a \u0441\u0432\u043e\u0438 \u0447\u0430\u0440\u0442\u044b, \u0442\u0430\u043a \u0438 \u0447\u0430\u0440\u0442\u044b \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/span><span class=\"tm-article-poll__answer-votes\">34<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 69.39%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">16.33% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438 \u0447\u0430\u0440\u0442\u044b<\/span><span class=\"tm-article-poll__answer-votes\">8<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 16.33%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">8.16% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0447\u0435\u0440\u0435\u0437 kubectl apply<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 8.16%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">6.12% <\/span><span class=\"tm-article-poll__answer-label\">\u042f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Kubernetes<\/span><span class=\"tm-article-poll__answer-votes\">3<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 6.12%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 49 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 5 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/769046\/\"> https:\/\/habr.com\/ru\/articles\/769046\/<\/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<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b Kubernetes. \u041f\u0440\u0430\u0432\u0434\u0430, \u043c\u043d\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>kubectl apply<\/code>. \u041d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435&#8230; \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u044f\u0442\u0438, \u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u044e. \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u043e\u0436\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438, \u0442\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0430\u0447\u043a\u0443 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u041f\u0440\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u044f \u043c\u043e\u043b\u0447\u0443.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0438\u043d\u0443\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 CI\/CD Pipeline \u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, &#171;\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c&#187; \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Helm \u0447\u0430\u0440\u0442\u0430 \u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0438\u0437\u0443\u0447\u0438\u0432 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 Helm.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 YAML \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<code>kubectl apply<\/code>, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 Helm \u0447\u0430\u0440\u0442 \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e! \u0423 \u0430\u0432\u0442\u043e\u0440\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Helm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443\/\u0433\u0440\u0443\u0431\u0443\u044e (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 <code>Ctrl+Enter<\/code>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#p1\" rel=\"noopener noreferrer nofollow\">\u0426\u0435\u043b\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p2\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Helm<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p3\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p4\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#p5\" rel=\"noopener noreferrer nofollow\">SecretStore (TLS Certificate)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p6\" rel=\"noopener noreferrer nofollow\">ExternalSecret (TLS Certificate)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p7\" rel=\"noopener noreferrer nofollow\">SecretStore (Lockbox secret)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p8\" rel=\"noopener noreferrer nofollow\">ExternalSecret (Lockbox secret)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p9\" rel=\"noopener noreferrer nofollow\">Service (type: ClusterIP)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p10\" rel=\"noopener noreferrer nofollow\">Deployment<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p11\" rel=\"noopener noreferrer nofollow\">Ingress<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p12\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0432\u043e\u0434: \u0440\u0443\u0442\u0438\u043d\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p13\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#p14\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 \u0447\u0430\u0440\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p15\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p16\" rel=\"noopener noreferrer nofollow\">values.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p17\" rel=\"noopener noreferrer nofollow\">\u0428\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p18\" rel=\"noopener noreferrer nofollow\">cert-secret-store.yaml &amp; lockbox-secret-store.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p19\" rel=\"noopener noreferrer nofollow\">cert-external-secret.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p20\" rel=\"noopener noreferrer nofollow\">lockbox-external-secret.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p21\" rel=\"noopener noreferrer nofollow\">clusterip.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p22\" rel=\"noopener noreferrer nofollow\">deploy.yaml<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p23\" rel=\"noopener noreferrer nofollow\">ingress.yaml<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p24\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0430\u0440\u0442 <\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#p25\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p26\" rel=\"noopener noreferrer nofollow\">\u0425\u0443\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p27\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#p28\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u043b\u0438\u0437<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#p29\" rel=\"noopener noreferrer nofollow\">\u0418\u0442\u043e\u0433\u0438 \u0438 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p1\" id=\"p1\"><\/a><\/p>\n<h2>\u0426\u0435\u043b\u044c<\/h2>\n<p>\u042f \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b <a href=\"https:\/\/github.com\/AzamatKomaev\/kubectl-and-helm-habr\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c<\/a>. \u0422\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u0432\u0435 \u043f\u0430\u043f\u043a\u0438 &#8212; kubectl, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 helm &#8212; \u0447\u0430\u0440\u0442 \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0441\u0430\u043c\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0435\u043e\u0440\u0438\u0438 &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 Helm \u0447\u0430\u0440\u0442, \u0441\u0434\u0435\u043b\u0430\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u043b\u0438\u0437.<\/p>\n<p><a class=\"anchor\" name=\"p2\" id=\"p2\"><\/a><\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Helm<\/h2>\n<figure class=\"full-width\"><\/figure>\n<p><a href=\"https:\/\/helm.sh\/ru\/\" rel=\"noopener noreferrer nofollow\">Helm<\/a> &#8212; \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 Kubernetes. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Helm &#8212; \u044d\u0442\u043e \u0447\u0430\u0440\u0442\u044b. <\/p>\n<p><strong>\u0427\u0430\u0440\u0442 (Chart)<\/strong> &#8212; \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 Kubernetes. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0447\u0430\u0440\u0442\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0447\u0430\u0440\u0442 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e.<\/p>\n<p><strong>\u0420\u0435\u043b\u0438\u0437 (Release)<\/strong> &#8212; \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0447\u0430\u0440\u0442. \u0412 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0430\u0440\u0442\u0430. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0439\u043c\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Kubernetes \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Helm \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0422\u0430\u043a, \u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/artifacthub.io\/packages\/helm\/ingress-nginx\/ingress-nginx\" rel=\"noopener noreferrer nofollow\">ingress-nginx<\/a> \u0438 <a href=\"https:\/\/artifacthub.io\/packages\/helm\/grafana\/loki-stack\" rel=\"noopener noreferrer nofollow\">loki-stack<\/a> (\u043a\u0441\u0442\u0430\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/p\/766102\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>). \u041d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0434\u0435\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Helm \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:<\/p>\n<ol>\n<li>\n<p>Helm \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c. \u0412 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u043f\u043e 4-7 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0447\u0435\u0440\u0435\u0437 envsubst), \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432\u043d\u0435 CI\/CD \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0445\u0435\u043b\u043c\u043e\u0432\u0441\u043a\u043e\u0433\u043e values.yaml (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435) \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0447\u0430\u0440\u0442 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u0440\u0435\u043b\u0438\u0437\u043e\u0432) \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p>Helm \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f (\u0438\u043b\u0438 \u0443\u0436\u0435 \u0441\u0442\u0430\u043b) &#171;\u043c\u0430\u0441\u0442 \u0445\u0435\u0432&#187; \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u0445 \u044f \u0447\u0430\u0449\u0435 \u0441\u0442\u0430\u043b \u0432\u0438\u0434\u0435\u0442\u044c Helm \u0434\u043b\u044f Dev-Ops \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u044f K8s.<\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"p3\" id=\"p3\"><\/a><\/p>\n<h2>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0438 \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432 Yandex Managed Kubernetes. \u0412 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/cloud.yandex.ru\/services\/lockbox\" rel=\"noopener noreferrer nofollow\">Lockbox<\/a> (\u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442 Yandex Cloud \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432) \u0438 External Secret Operator \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 Kubernetes \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 Yandex.Cloud). \u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b: <\/p>\n<figure class=\"\"><\/figure>\n<ul>\n<li>\n<p><strong>cert-external-secret.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/external-secrets.io\/latest\/api\/externalsecret\/\" rel=\"noopener noreferrer nofollow\">ExternalSecret<\/a>. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437 <a href=\"https:\/\/cloud.yandex.ru\/services\/certificate-manager\" rel=\"noopener noreferrer nofollow\">Yandex Certificate Manager<\/a> \u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, ExternalSecret \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u043a\u0440\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <strong>ingress.yaml<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>cert-secret-store.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/external-secrets.io\/latest\/api\/secretstore\/\" rel=\"noopener noreferrer nofollow\">SecretStore<\/a>. \u041e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c\u0443 API \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d yandexcertificatemanager.<\/p>\n<\/li>\n<li>\n<p><strong>clusterip.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 Service(<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/#type-clusterip\" rel=\"noopener noreferrer nofollow\">ClusterIP<\/a>). \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>deploy.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\" rel=\"noopener noreferrer nofollow\">Deployment<\/a> . \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b. \u0412 \u043d\u0451\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c Java (Spring) \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0432\u0437\u044f\u0442\u044b\u0445 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 Yandex Lockbox. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 <a href=\"https:\/\/cloud.yandex.ru\/services\/container-registry\" rel=\"noopener noreferrer nofollow\">Yandex Container Registry<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>ingress.yaml<\/strong> &#8212; \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/**https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/**\" rel=\"noopener noreferrer nofollow\">Ingress<\/a>. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0447\u0435\u0440\u0435\u0437 HTTP(-S). \u041e\u0434\u043d\u043e\u0433\u043e Ingress \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c Ingress Controller (\u043e\u0431\u044b\u0447\u043d\u043e ingress-nginx). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e cert-external-secret.yaml \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c, \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e HTTPS.<\/p>\n<\/li>\n<li>\n<p><strong>lockbox-external-secret.yaml<\/strong> &#8212; \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 ExternalSecret, \u0432 \u043d\u0451\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 Lockbox.<\/p>\n<\/li>\n<li>\n<p><strong>lockbox-secret-storage.yaml<\/strong> &#8212; \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441 \u0442\u0438\u043f\u0430 SecretStore, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 yandexlockbox.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"p4\" id=\"p4\"><\/a><\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0435\u043c \u0432\u0441\u044e \u044d\u0442\u0443 \u043c\u0430\u0445\u0438\u043d\u0443! \u0412\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<code>kubectl apply -f .\/kubectl<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/a8m\/envsubst\" rel=\"noopener noreferrer nofollow\">envsubst<\/a>. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b. \u041e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 CI\/CD \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0438\u0436\u0435, \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<br \/><em>P.S. \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043b\u0438\u0448\u044c \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Helm \u0447\u0430\u0440\u0442\u0430. \u0412\u0430\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b Yandex.Cloud<\/em><\/p>\n<p>\u0427\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b! \u0421\u043f\u0435\u0440\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0435\u043a\u0440\u0435\u0442 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Yandex Cloud:<\/p>\n<pre><code class=\"bash\">$ kubectl create ns kubectl-ns namespace\/kubectl-ns created $ kubectl --namespace kubectl-ns create secret generic yc-auth \\       --from-file=authorized-key=authorized-key.json  secret\/yc-auth created <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p5\" id=\"p5\"><\/a><\/p>\n<h3>SecretStore (TLS Certificate)<\/h3>\n<details class=\"spoiler\">\n<summary>cert-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: spring-app-certificate-secret-store   namespace: kubectl-ns spec:   provider:     yandexcertificatemanager:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ kubectl apply -f .\/kubectl\/cert-secret-store.yaml secretstore.external-secrets.io\/spring-app-certificate-secret-store created $ kubectl -n kubectl-ns get ss\/spring-app-certificate-secret-store NAME                                  AGE   STATUS   CAPABILITIES   READY spring-app-certificate-secret-store   20s   Valid    ReadOnly       True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p6\" id=\"p6\"><\/a><\/p>\n<h3>ExternalSecret (TLS Certificate)<\/h3>\n<details class=\"spoiler\">\n<summary>cert-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: spring-app-certificate-external-secret   namespace: kubectl-ns spec:   refreshInterval: 1h   secretStoreRef:     name: spring-app-certificate-secret-store     kind: SecretStore   target:     name: spring-app-certificate-secret     template:       type: kubernetes.io\/tls   data:   - secretKey: tls.crt     remoteRef:       key: $CERTIFICATE_ID       property: chain   - secretKey: tls.key     remoteRef:       key: $CERTIFICATE_ID       property: privateKey<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 $CERTIFICATE_ID. \u0422\u0430\u043a \u043a\u0430\u043a ID \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438\u0437 Certificate Manager \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043f\u043b\u043e\u0445\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0437\u043d\u0430\u0442\u044c ID \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f CERTIFICATE_ID \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 envsubst:<\/p>\n<pre><code class=\"bash\">$ export CERTIFICATE_ID=&lt;your_certificate_id_here> $ envsubst \\$CERTIFICATE_ID &lt; .\/kubectl\/cert-external-secret.yaml | kubectl apply -f - $ kubectl -n kubectl-ns get externalsecret\/spring-app-certificate-external-secret NAME                                     STORE                                 REFRESH INTERVAL   STATUS         READY spring-app-certificate-external-secret   spring-app-certificate-secret-store   1h                 SecretSynced   True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p7\" id=\"p7\"><\/a><\/p>\n<h3>SecretStore (Lockbox secret)<\/h3>\n<details class=\"spoiler\">\n<summary>lockbox-secret-store.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: SecretStore metadata:   name: spring-app-lockbox-secret-store   namespace: kubectl-ns spec:   provider:     yandexlockbox:       auth:         authorizedKeySecretRef:           name: yc-auth           key: authorized-key<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ kubectl apply -f .\/kubectl\/lockbox-secret-store.yaml secretstore.external-secrets.io\/spring-app-lockbox-secret-store created $ kubectl -n kubectl-ns get ss\/spring-app-lockbox-secret-store   NAME                              AGE   STATUS   CAPABILITIES   READY spring-app-lockbox-secret-store   51s   Valid    ReadOnly       True <\/code><\/pre>\n<p><a class=\"anchor\" name=\"p8\" id=\"p8\"><\/a><\/p>\n<h3>ExternalSecret (Lockbox secret)<\/h3>\n<details class=\"spoiler\">\n<summary>lockbox-external-secret.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: external-secrets.io\/v1beta1 kind: ExternalSecret metadata:   name: spring-app-lockbox-external-secret   namespace: kubectl-ns spec:   refreshInterval: 1h   secretStoreRef:     name: spring-app-lockbox-secret-store     kind: SecretStore   target:     name: spring-app-lockbox-secret   data:   - secretKey: JDBC_URL     remoteRef:       key: $SECRET_ID       property: JDBC_URL   - secretKey: DB_USERNAME     remoteRef:       key: $SECRET_ID       property: DB_USERNAME   - secretKey: DB_PASSWORD     remoteRef:       key: $SECRET_ID       property: DB_PASSWORD<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442<\/p>\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-358121","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358121","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=358121"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358121\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=358121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=358121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=358121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}