{"id":309518,"date":"2020-09-06T03:00:16","date_gmt":"2020-09-06T03:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=309518"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=309518","title":{"rendered":"\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Custom Tooling \u0432 Argo CD"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/517966\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bl\/1t\/hr\/bl1thr-ilao8gyl97jiqgnnln7u.png\"><\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"https:\/\/habr.com\/post\/481662\/\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0433\u0434\u0435 \u044f \u043b\u043e\u0432\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 jsonnet \u0438 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u044f \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0438\u0437\u043b\u0438\u0448\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: &quot;\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c YAML \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 Kubernetes&quot;. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u0447\u0435\u043c Argo CD \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>Argo CD \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0438\u043d\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 Kubernetes. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439: Kustomize, Helm \u0447\u0430\u0440\u0442\u044b, Ksonnet, \u0433\u043e\u043b\u044b\u0439 Jsonnet \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 YAML\/JSON \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432 Argo CD \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c custom tooling.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/481662\/\">qbec<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/481662\/#git-crypt\">git-crypt<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043f\u043e\u043b\u043d\u0430 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e Argo CD \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0435 \u0444\u0430\u0437\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>init<\/strong> \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u0434\u0435\u043f\u043b\u043e\u0435\u043c, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u043e\u0435.<\/li>\n<li><strong>generate<\/strong> \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u0432\u044b\u0432\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c YAML stream, \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e, \u0447\u0442\u043e Argo \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f Helm. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 Argo CD Helm \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b Argo \u0443\u043c\u0435\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Helm-\u0445\u0443\u043a\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"qbec\">QBEC<\/h1>\n<p>  <\/p>\n<p>Qbec \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e jsonnet, \u0430 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c Helm-\u0447\u0430\u0440\u0442\u044b, \u0430 \u0442\u0430\u043a \u043a\u0430\u043a Argo CD \u0443\u043c\u0435\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Helm-\u0445\u0443\u043a\u0438, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 Argo CD \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 qbec \u0432 argocd \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 Argo CD \u0434\u043e\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432\u0430\u0448 custom plugin \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432.<\/li>\n<li>\u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 <strong>argocd-repo-server<\/strong>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 <a href=\"https:\/\/argoproj.github.io\/argo-cd\/user-guide\/config-management-plugins\/\" rel=\"nofollow\">\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f<\/a> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># cm.yaml data:   configManagementPlugins: |     - name: qbec       generate:         command: [sh, -xc]         args: ['qbec show &quot;$ENVIRONMENT&quot; -S --force:k8s-namespace &quot;$ARGOCD_APP_NAMESPACE&quot;']<\/code><\/pre>\n<p>  <\/p>\n<p><em>(\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>init<\/strong> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f)<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kubectl -n argocd patch cm\/argocd-cm -p &quot;$(cat cm.yaml)&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/custom_tools\/#byoi-build-your-own-image\" rel=\"nofollow\">\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437<\/a>, \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/custom_tools\/#adding-tools-via-volume-mounts\" rel=\"nofollow\">\u0442\u0440\u044e\u043a \u0441 init-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># deploy.yaml spec:   template:     spec:       # 1. Define an emptyDir volume which will hold the custom binaries       volumes:       - name: custom-tools         emptyDir: {}       # 2. Use an init container to download\/copy custom binaries into the emptyDir       initContainers:       - name: download-tools         image: alpine:3.12         command: [sh, -c]         args:         - wget -qO- https:\/\/github.com\/splunk\/qbec\/releases\/download\/v0.12.2\/qbec-linux-amd64.tar.gz | tar -xvzf - -C \/custom-tools\/         volumeMounts:         - mountPath: \/custom-tools           name: custom-tools       # 3. Volume mount the custom binary to the bin directory (overriding the existing version)       containers:       - name: argocd-repo-server         volumeMounts:         - mountPath: \/usr\/local\/bin\/qbec           name: custom-tools           subPath: qbec         - mountPath: \/usr\/local\/bin\/jsonnet-qbec           name: custom-tools           subPath: jsonnet-qbec<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kubectl -n argocd patch deploy\/argocd-repo-server -p &quot;$(cat deploy.yaml)&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">apiVersion: argoproj.io\/v1alpha1 kind: Application metadata:   name: qbec-app   namespace: argocd spec:   destination:      namespace: default     server: https:\/\/kubernetes.default.svc   project: default   source:      path: qbec-app     plugin:        env:          - name: ENVIRONMENT           value: default       name: qbec     repoURL: https:\/\/github.com\/kvaps\/argocd-play   syncPolicy:      automated:        prune: true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <strong>ENVIRONMENT<\/strong> \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3ca\/d59\/e62\/3cad59e622814f111b08b0e69d57677c.png\"><\/p>\n<p>  <\/p>\n<p>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u043e\u0441\u044c, \u043e\u0442\u043b\u0438\u0447\u043d\u043e!<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"git-crypt\">git-crypt<\/h1>\n<p>  <\/p>\n<p>Git-crypt \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432 git.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 git-crypt \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c <strong><code>git-crypt unlock<\/code><\/strong> \u043d\u0430 init-\u0441\u0442\u0430\u0434\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e custom-\u043f\u043b\u0430\u0433\u0438\u043d\u0430, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u043f\u043b\u043e\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Helm \u0438 Jsonnet, \u043c\u044b \u0442\u0435\u0440\u044f\u0435\u043c \u0433\u0438\u0431\u043a\u0438\u0439 GUI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (values-\u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435).<\/p>\n<p>  <\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0435\u0449\u0435 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u043f\u0440\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 Argo CD \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0445\u0443\u043a\u043e\u0432 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0445\u0438\u0442\u0440\u044b\u043c \u0448\u0435\u043b\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c-\u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 git:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh $(dirname $0)\/git.bin &quot;$@&quot; ec=$? [ &quot;$1&quot; = fetch ] &amp;&amp; [ -d .git-crypt ] || exit $ec GNUPGHOME=\/app\/config\/gpg\/keys git-crypt unlock 2&gt;\/dev\/null exit $ec<\/code><\/pre>\n<p>  <\/p>\n<p>Argo CD \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong><code>git fetch<\/code><\/strong> \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0434\u0435\u043f\u043b\u043e\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u044b \u0438 \u043f\u043e\u0432\u0435\u0441\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 <strong><code>git-crypt unlock<\/code><\/strong> \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/kvaps\/argocd-git-crypt\" rel=\"nofollow\">\u043c\u043e\u0439 docker-\u043e\u0431\u0440\u0430\u0437<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kubectl -n argocd set image deploy\/argocd-repo-server argocd-repo-server=docker.io\/kvaps\/argocd-git-crypt:v1.7.3<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a Argo \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c gpg-\u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043d\u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kubectl exec -ti deploy\/argocd-repo-server -- bash  $ printf &quot;%s\\n&quot; \\     &quot;%no-protection&quot; \\     &quot;Key-Type: default&quot; \\     &quot;Subkey-Type: default&quot; \\     &quot;Name-Real: YOUR NAME&quot; \\     &quot;Name-Email: YOUR EMAIL@example.com&quot; \\     &quot;Expire-Date: 0&quot; \\     &gt; genkey-batch   $ gpg --batch --gen-key genkey-batch gpg: WARNING: unsafe ownership on homedir '\/home\/argocd\/.gnupg' gpg: keybox '\/home\/argocd\/.gnupg\/pubring.kbx' created gpg: \/home\/argocd\/.gnupg\/trustdb.gpg: trustdb created gpg: key 8CB8B24F50B4797D marked as ultimately trusted gpg: directory '\/home\/argocd\/.gnupg\/openpgp-revocs.d' created gpg: revocation certificate stored as '\/home\/argocd\/.gnupg\/openpgp-revocs.d\/9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D.rev'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0438\u043c\u044f \u043a\u043b\u044e\u0447\u0430 <strong><code>8CB8B24F50B4797D<\/code><\/strong> \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0448\u0430\u0433\u043e\u0432. \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0430\u043c \u043a\u043b\u044e\u0447:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ gpg --list-keys gpg: WARNING: unsafe ownership on homedir '\/home\/argocd\/.gnupg' \/home\/argocd\/.gnupg\/pubring.kbx ------------------------------- pub   rsa3072 2020-09-04 [SC]       9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D uid           [ultimate] YOUR NAME &lt;YOUR EMAIL@example.com&gt; sub   rsa3072 2020-09-04 [E]  $ gpg --armor --export-secret-keys 8CB8B24F50B4797D<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># argocd-gpg-keys-secret.yaml apiVersion: v1 kind: Secret metadata:   name: argocd-gpg-keys-secret   namespace: argocd stringData:   8CB8B24F50B4797D: |-     -----BEGIN PGP PRIVATE KEY BLOCK-----      lQVYBF9Q8KUBDACuS4p0ctXoakPLqE99YLmdixfF\/QIvXVIG5uBXClWhWMuo+D0c     ZfeyC5GvH7XPUKz1cLMqL6o\/u9oHJVUmrvN\/g2Mnm365nTGw1M56AfATS9IBp0HH     O\/fbfiH6aMWmPrW8XIA0icoOAdP+bPcBqM4HRo4ssbRS9y\/i     =yj11     -----END PGP PRIVATE KEY BLOCK-----<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl apply -f argocd-gpg-keys-secret.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <strong>argocd-repo-server<\/strong>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c deployment:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl -n argocd edit deploy\/argocd-repo-server<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <strong>gpg-keys<\/strong> volume \u043d\u0430 <strong><code>projected<\/code><\/strong>, \u0433\u0434\u0435 \u0438 \u0443\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0448 \u0441\u0435\u043a\u0440\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">   spec:      template:        spec:          volumes:          - name: gpg-keys            projected:              defaultMode: 420              sources:              - secret:                  name: argocd-gpg-keys-secret              - configMap:                  name: argocd-gpg-keys-cm<\/code><\/pre>\n<p>  <\/p>\n<p>Argo CD \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u0442 gpg-\u043a\u043b\u044e\u0447\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u0438 \u043d\u0430\u0448 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447.<\/p>\n<p>  <\/p>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kubectl -n argocd exec -ti deploy\/argocd-repo-server -- bash $ GNUPGHOME=\/app\/config\/gpg\/keys gpg --list-secret-keys gpg: WARNING: unsafe ownership on homedir '\/app\/config\/gpg\/keys' \/app\/config\/gpg\/keys\/pubring.kbx -------------------------------- sec   rsa2048 2020-09-05 [SC] [expires: 2021-03-04]       ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28 uid           [ultimate] Anon Ymous (ArgoCD key signing key) &lt;noreply@argoproj.io&gt;  sec   rsa3072 2020-09-03 [SC]       9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D uid           [ultimate] YOUR NAME &lt;YOUR EMAIL@example.com&gt; ssb   rsa3072 2020-09-03 [E]<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043a\u043b\u044e\u0447 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d! \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Argo CD \u0432 \u043d\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043b\u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u043e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043b\u0435\u0442\u0443.<\/p>\n<p>  <\/p>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ gpg --armor --export-secret 8CB8B24F50B4797D &gt; 8CB8B24F50B4797D.pem $ gpg --import 8CB8B24F50B4797D.pem<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0432\u0435\u0440\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ gpg --edit-key 8CB8B24F50B4797D trust 5<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c argo \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043b\u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ git-crypt add-gpg-user 8CB8B24F50B4797D<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p><strong>\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435<\/strong>:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/kvaps\/argocd-git-crypt\" rel=\"nofollow\">GitHub: \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/a><\/li>\n<li><a href=\"https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/custom_tools\/\" rel=\"nofollow\">Argo CD: Custom Tooling<\/a><\/li>\n<li><a href=\"https:\/\/argoproj.github.io\/argo-cd\/user-guide\/config-management-plugins\/\" rel=\"nofollow\">Argo CD: Config Management Plugins<\/a><\/li>\n<li><a href=\"https:\/\/gist.github.com\/vrillusions\/5484422\" rel=\"nofollow\">GitHub Gist: \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f gpg \u043a\u043b\u044e\u0447\u0435\u0439 \u0431\u0435\u0437 \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435<\/a><\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/517966\/\"> https:\/\/habr.com\/ru\/post\/517966\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/517966\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bl\/1t\/hr\/bl1thr-ilao8gyl97jiqgnnln7u.png\"><\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"https:\/\/habr.com\/post\/481662\/\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0433\u0434\u0435 \u044f \u043b\u043e\u0432\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 jsonnet \u0438 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u044f \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0438\u0437\u043b\u0438\u0448\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: &quot;\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c YAML \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 Kubernetes&quot;. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u0447\u0435\u043c Argo CD \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>Argo CD \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0438\u043d\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 Kubernetes. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439: Kustomize, Helm \u0447\u0430\u0440\u0442\u044b, Ksonnet, \u0433\u043e\u043b\u044b\u0439 Jsonnet \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 YAML\/JSON \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432 Argo CD \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c custom tooling.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/481662\/\">qbec<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/481662\/#git-crypt\">git-crypt<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043f\u043e\u043b\u043d\u0430 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\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-309518","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/309518","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=309518"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/309518\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=309518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=309518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=309518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}