{"id":478429,"date":"2026-05-04T05:49:38","date_gmt":"2026-05-04T05:49:38","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478429"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478429","title":{"rendered":"\u041e\u0442 Flux CLI \u043a Flux Operator \u0438 Status Page"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/fluxcd.io\/\" rel=\"noopener noreferrer nofollow\"><strong>Flux CD<\/strong><\/a>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f GitOps \u0432 Kubernetes. \u041e\u043d \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0451\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 Helm-\u0447\u0430\u0440\u0442\u0430\u043c\u0438. Flux \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 Git, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 Kubernetes API \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f graduated-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c CNCF.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0435 GitOps \u0432 Kubernetes,\u00a0<strong>Flux CD<\/strong>\u00a0\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c:\u00a0<code>flux bootstrap<\/code>, \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 Git, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0442\u044f\u043d\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u041d\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Flux Operator:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432<\/strong>\u00a0\u2014 \u0432\u0435\u0440\u0441\u0438\u044f, \u0440\u0435\u0435\u0441\u0442\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0432\u00a0<strong>FluxInstance<\/strong>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432\u00a0<code>gotk-components<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0434\u0438\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 Git<\/strong>\u00a0\u2014\u00a0<code>FluxInstance.spec.sync<\/code>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043a\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 Git<\/strong>\u00a0\u2014 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u043c \u0438 \u0440\u0435\u0432\u044c\u044e, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c<\/strong>\u00a0\u2014 \u043e\u0442\u0447\u0451\u0442\u044b, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u00a0<strong>Status Page<\/strong>, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>flux get<\/code>\u00a0\u0432 CLI.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 GitOps<\/strong>\u00a0\u2014\u00a0<code>GitRepository<\/code>,\u00a0<code>Kustomization<\/code>,\u00a0<code>HelmRelease<\/code>\u00a0\u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f; \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u00a0<strong>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430<\/strong>\u00a0\u0441\u0430\u043c\u043e\u0433\u043e Flux.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e bootstrap \u043a\u00a0<a href=\"https:\/\/fluxoperator.dev\/\" rel=\"noopener noreferrer nofollow\"><strong>Flux Operator<\/strong><\/a>\u00a0(<strong>FluxInstance<\/strong>) \u0438\u00a0<strong>FluxCD Status Page<\/strong>.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 1. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Flux: bootstrap \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<h4>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h4>\n<ul>\n<li>\n<p>\u0427\u0438\u0441\u0442\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes.<\/p>\n<\/li>\n<li>\n<p><strong>Flux CLI<\/strong>\u00a0\u2014\u00a0<a href=\"https:\/\/fluxcd.io\/flux\/installation\/\" rel=\"noopener noreferrer nofollow\">Installing the Flux CLI<\/a>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430:\u00a0<code>flux version --client<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f\u00a0<code>flux bootstrap<\/code>; \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 PAT (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<\/ul>\n<h4>GitHub Personal Access Token \u0434\u043b\u044f bootstrap<\/h4>\n<p>\u0414\u043b\u044f\u00a0<code>flux bootstrap github<\/code>\u00a0\u0442\u043e\u043a\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<code>GITHUB_TOKEN<\/code>\u00a0\u0438\u043b\u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aa8\/e7c\/c19\/aa8e7cc1912c34a2219e979fbcd98dbf.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PAT (Fine-grained token)\" width=\"911\" height=\"1005\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/aa8\/e7c\/c19\/aa8e7cc1912c34a2219e979fbcd98dbf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aa8\/e7c\/c19\/aa8e7cc1912c34a2219e979fbcd98dbf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PAT (Fine-grained token)<\/figcaption><\/div>\n<\/figure>\n<ol>\n<li>\n<p><a href=\"https:\/\/github.com\/settings\/personal-access-tokens\/new\" rel=\"noopener noreferrer nofollow\">GitHub \u2192 Fine-grained tokens<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>Repository access<\/strong>\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a0<code>fluxcd-operator-and-status-page<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>Permissions:<\/strong>\u00a0<strong>Contents<\/strong>\u00a0\u2014 Read and write;\u00a0<strong>Metadata<\/strong>\u00a0\u2014 Read-only;\u00a0<strong>Administration<\/strong>\u00a0\u2014 Read-only.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0<code>--token-auth<\/code>\u00a0Flux \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 PAT \u0432 Secret \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435; \u0434\u043b\u044f PAT \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u00a0<strong>Administration \u2192 Read-only<\/strong>.<\/p>\n<h4>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 bootstrap<\/h4>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 bootstrap \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Flux CLI \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0<code>base\/flux-system\/<\/code>\u00a0\u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (<code>gotk-components.yaml<\/code>) \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (<code>gotk-sync.yaml<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442 \u0438\u0445 \u0432 \u0432\u0435\u0442\u043a\u0443\u00a0<code>main<\/code>.<\/p>\n<pre><code>flux bootstrap github \\  --token-auth \\  --owner=patsevanton \\  --repository=fluxcd-operator-and-status-page \\  --branch=main \\  --path=base<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code>Please enter your GitHub personal access token (PAT):\u25ba connecting to github.com\u25ba cloning branch \"main\" from Git repository \"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page.git\"\u2714 cloned repository...\u2714 all components are healthy<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 bootstrap \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:<\/p>\n<pre><code>git pull<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 bootstrap<\/h4>\n<p>Flux \u0443\u0436\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 FluxCD:<\/p>\n<pre><code>flux get all -A<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0438\u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e\u00a0<code>broken-demo<\/code>\u00a0\u0441\u043b\u043e\u043c\u0430\u043d \u2014 \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0435\u0440\u0442\u043e\u0432 FluxCD:<\/p>\n<pre><code>flux get all -A | grep -v \"succeeded\" | grep -v Applied | grep -v pulled | grep -v \"stored artifact\" | grep -v ReadyNAMESPACE  NAME                     REVISION          SUSPENDEDREADYMESSAGE                                           NAMESPACE  NAME                               REVISION       SUSPENDEDREADYMESSAGE                                     NAMESPACE  NAME                                          REVISIONSUSPENDEDREADYMESSAGE                                                         NAMESPACE  NAME                                REVISIONSUSPENDEDREADYMESSAGE                                                                                                               NAMESPACE  NAME                          REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                                                                                                                                                                                                                                                                                                 flux-systemkustomization\/broken-demo                       False    FalseHelmRelease\/broken-demo\/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io \"broken-demo\" is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: \"OCIRepository\": supported values: \"HelmRepository\", \"GitRepository\", \"Bucket\", &lt;nil&gt;: Invalid value: \"null\": some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                        Namespace\/broken-demo created                      <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c HelmReleases \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code>flux get helmreleases -n flux-systemNAME                    REVISIONSUSPENDEDREADYMESSAGE                                                                                                               prometheus-operator-crds28.0.1  False    True Helm install succeeded for release flux-system\/prometheus-operator-crds.v1 with chart prometheus-operator-crds@28.0.1vmks                    0.74.1  False    True Helm upgrade succeeded for release vmks\/vmks.v2 with chart victoria-metrics-k8s-stack@0.74.1  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c Kustomization&#8217;\u044b:<\/p>\n<pre><code>flux get kustomizations -ANAMESPACE  NAME            REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                       flux-systembroken-demo                       False    FalseHelmRelease\/broken-demo\/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io \"broken-demo\" is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: \"OCIRepository\": supported values: \"HelmRepository\", \"GitRepository\", \"Bucket\", &lt;nil&gt;: Invalid value: \"null\": some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                           flux-systemflux-system     main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemprometheus-crds main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemvictoria-metricsmain@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0    <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0430\u0441\u0442\u044c 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Flux Operator<\/h3>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flux Operator<\/h4>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Flux Operator \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0448\u0430\u0433\u0438 \u043d\u0438\u0436\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code>mkdir -p apps\/flux-operator<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 Kustomization \u0434\u043b\u044f\u00a0<code>flux-operator<\/code>\u00a0\u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430\u00a0<code>base\/apps.yaml<\/code>\u00a0(\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\u00a0<code>victoria-metrics<\/code>,\u00a0<code>broken-demo<\/code>,\u00a0<code>prometheus-crds<\/code>\u00a0\u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435):<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt;&gt; base\/apps.yaml---apiVersion: kustomize.toolkit.fluxcd.io\/v1kind: Kustomizationmetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 10m  sourceRef:    kind: GitRepository    name: flux-system  serviceAccountName: kustomize-controller  path: .\/apps\/flux-operator  prune: true  wait: true  timeout: 10mEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 HelmRepository \u0434\u043b\u044f OCI-\u0447\u0430\u0440\u0442\u0430 ControlPlane:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-operator\/sources.yamlapiVersion: source.toolkit.fluxcd.io\/v1kind: HelmRepositorymetadata:  name: cp-flux-operator  namespace: flux-systemspec:  interval: 24h  type: oci  url: oci:\/\/ghcr.io\/controlplaneio-fluxcd\/chartsEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 HelmRelease \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044e\u00a0<code>web<\/code>\u00a0\u2014 \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Status Page \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Ingress:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-operator\/helmrelease.yamlapiVersion: helm.toolkit.fluxcd.io\/v2kind: HelmReleasemetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 30m  timeout: 10m  chart:    spec:      chart: flux-operator      version: \"0.47.0\"      sourceRef:        kind: HelmRepository        name: cp-flux-operator        namespace: flux-system      interval: 30m  releaseName: flux-operator  values:    web:      enabled: true      config:        baseURL: http:\/\/flux.apatsev.org.ru\/      ingress:        enabled: true        className: nginx        hosts:          - host: flux.apatsev.org.ru            paths:              - path: \/                pathType: PrefixEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u044c\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code>git add .git commit -m \"Add flux-operator manifests\"git push<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c, \u043f\u043e\u043a\u0430 Flux \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u0443\u044e Kustomization \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440:<\/p>\n<pre><code>flux get kustomizations -n flux-system | grep flux-operatorflux-operator   main@sha1:e23386eaFalse    True Applied revision: main@sha1:e23386ea<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e HelmRelease \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d:<\/p>\n<pre><code>flux get helmreleases -n flux-system | grep flux-operatorflux-operator           0.47.0  False    True Helm install succeeded for release flux-system\/flux-operator.v1 with chart flux-operator@0.47.0                 <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 FluxInstance<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Flux Operator \u0444\u0430\u0439\u043b\u00a0<code>base\/flux-system\/kustomization.yaml<\/code>\u00a0(\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439\u00a0<code>flux bootstrap<\/code>) \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0<code>gotk-components.yaml<\/code>\u00a0\u0438\u00a0<code>gotk-sync.yaml<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Flux \u0432\u0441\u0451 \u0435\u0449\u0451 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c bootstrap.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0<code>FluxInstance<\/code>. \u042d\u0442\u043e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443, \u043a\u0430\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Flux \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0441 \u043a\u0430\u043a\u043e\u0433\u043e Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/strong>\u00a0\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f\u00a0<code>FluxInstance<\/code>, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0435\u0440\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Flux \u043d\u0430 \u0441\u0435\u0431\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b bootstrap. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u00a0<code>gotk-*<\/code>\u00a0\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\u00a0<code>FluxInstance<\/code>\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b FluxInstance:<\/p>\n<pre><code>mkdir -p base\/flux-systemcat &lt;&lt;'EOF' &gt; base\/flux-system\/flux-instance.yamlapiVersion: fluxcd.controlplane.io\/v1kind: FluxInstancemetadata:  name: flux  namespace: flux-systemspec:  distribution:    version: \"2.8.x\"    registry: \"ghcr.io\/fluxcd\"  components:    - source-controller    - kustomize-controller    - helm-controller    - notification-controller  sync:    kind: GitRepository    url: \"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page.git\"    ref: \"refs\/heads\/main\"    path: \".\/base\"EOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435 FluxInstance \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 kubectl, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0430\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c Flux:<\/p>\n<pre><code>kubectl apply -f base\/flux-system\/flux-instance.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0<code>FluxInstance<\/code>\u00a0\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c Flux: \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u00a0<code>FluxReport<\/code>.<\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 FluxInstance:<\/p>\n<pre><code>kubectl -n flux-system get fluxinstance fluxNAME   AGE     READY   STATUS                           REVISIONflux   2m21s   True    Reconciliation finished in 19s   v2.8.5@sha256:df269637e1cbd79f25263d77f754ec782afb780ad197f4732771f661ceb73f3f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440):<\/p>\n<pre><code>kubectl -n flux-system get podsNAME                                       READY   STATUS    RESTARTS   AGEflux-operator-64bbc44d7c-v87fj             1\/1     Running   0          40mhelm-controller-65ff4c7c98-fvjg9           1\/1     Running   0          2m20skustomize-controller-59fc467858-mhsbz      1\/1     Running   0          2m20snotification-controller-6d66bb7797-7wp5r   1\/1     Running   0          2m20ssource-controller-7846484bbc-6rfg5         1\/1     Running   0          2m19s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Flux Operator \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e bootstrap \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c\u00a0<code>base\/flux-system\/kustomization.yaml<\/code>\u00a0\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u0441\u044b\u043b\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0<code>flux-instance.yaml<\/code>.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:\u00a0<a href=\"https:\/\/fluxcd.control-plane.io\/operator\/flux-bootstrap-migration\" rel=\"noopener noreferrer nofollow\">Flux Bootstrap Migration<\/a>.<\/p>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e bootstrap:<\/p>\n<pre><code>rm base\/flux-system\/gotk-components.yamlrm base\/flux-system\/gotk-sync.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0<code>base\/flux-system\/kustomization.yaml<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>flux-instance.yaml<\/code>:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; base\/flux-system\/kustomization.yamlapiVersion: kustomize.config.k8s.io\/v1beta1kind: Kustomizationresources:- flux-instance.yamlEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441:<\/p>\n<pre><code>git add .<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u044c\u0442\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code>git commit -m \"Moved Flux resources\"git push<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0430\u0441\u0442\u044c 3. FluxCD Status Page<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Flux Operator \u0432 \u0438\u0433\u0440\u0443 \u0432\u0445\u043e\u0434\u044f\u0442\u00a0<strong>FluxReport<\/strong>, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u00a0<code>FluxInstance<\/code>\u00a0\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Prometheus.<\/p>\n<p><strong>\u0414\u0435\u043c\u043e-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/strong>\u00a0<a href=\"http:\/\/flux.apatsev.org.ru\/\" rel=\"noopener noreferrer nofollow\">http:\/\/flux.apatsev.org.ru\/<\/a>.<\/p>\n<h4>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b<\/h4>\n<h3>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u2014 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u043b\u043e\u043a (overview)<\/h3>\n<p>\u0421\u0432\u043e\u0434\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Flux \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ca\/b37\/9c0\/0cab379c02967803a96f0ac2dbc55f8b.png\" alt=\"FluxCD Status Page \u2014 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (overview)\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0ca\/b37\/9c0\/0cab379c02967803a96f0ac2dbc55f8b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ca\/b37\/9c0\/0cab379c02967803a96f0ac2dbc55f8b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>FluxCD Status Page \u2014 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (overview)<\/figcaption><\/div>\n<\/figure>\n<h3>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u2014 \u0431\u043b\u043e\u043a Flux Reconcilers<\/h3>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 reconciler-\u043e\u0432 Flux.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24e\/d59\/6f5\/24ed596f5fa140d781774df0faca987a.png\" alt=\"FluxCD Status Page \u2014 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (Flux Reconcilers)\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/24e\/d59\/6f5\/24ed596f5fa140d781774df0faca987a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24e\/d59\/6f5\/24ed596f5fa140d781774df0faca987a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>FluxCD Status Page \u2014 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (Flux Reconcilers)<\/figcaption><\/div>\n<\/figure>\n<h3>Resources \u2014 failed state<\/h3>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1d\/2ca\/c43\/f1d2cac43f315483a56823060b7fccf0.png\" alt=\"FluxCD Status Page \u2014 resources (failed)\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f1d\/2ca\/c43\/f1d2cac43f315483a56823060b7fccf0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1d\/2ca\/c43\/f1d2cac43f315483a56823060b7fccf0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>FluxCD Status Page \u2014 resources (failed)<\/figcaption><\/div>\n<\/figure>\n<h3>Events \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Flux<\/h3>\n<p>\u042d\u043a\u0440\u0430\u043d \u0441 \u043b\u0435\u043d\u0442\u043e\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Flux \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438 \u043f\u043e namespace, kind \u0438 severity.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/201\/ba5\/5e4\/201ba55e460057bf1fb05f8511112a61.png\" alt=\"FluxCD Status Page \u2014 events\" width=\"1920\" height=\"1200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/201\/ba5\/5e4\/201ba55e460057bf1fb05f8511112a61.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/201\/ba5\/5e4\/201ba55e460057bf1fb05f8511112a61.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>FluxCD Status Page \u2014 events<\/figcaption><\/div>\n<\/figure>\n<h4>FluxReport<\/h4>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u00a0<code>FluxReport<\/code>\u00a0<code>flux<\/code>\u00a0\u0432\u00a0<code>flux-system<\/code>\u00a0(\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437 \u0432 5 \u043c\u0438\u043d\u0443\u0442):<\/p>\n<pre><code>kubectl -n flux-system get fluxreport flux -o yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 (\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442):<\/p>\n<pre><code>apiVersion: fluxcd.controlplane.io\/v1kind: FluxReportmetadata:  annotations:    reconcile.fluxcd.io\/requestedAt: \"1777814067\"  creationTimestamp: \"2026-05-03T12:18:48Z\"  generation: 7  name: flux  namespace: flux-system  resourceVersion: \"46482\"  uid: fe113d16-e144-433b-a666-53a94a042b5cspec:  cluster:    nodes: 3    platform: linux\/amd64    serverVersion: v1.32.1  components:  - image: ghcr.io\/fluxcd\/helm-controller:v1.5.3@sha256:b150af0cd7a501dafe2374b1d22c39abf0572465df4fa1fb99b37927b0d95d75    name: helm-controller    ready: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><a href=\"https:\/\/fluxoperator.dev\/docs\/crd\/fluxreport\" rel=\"noopener noreferrer nofollow\">Flux Report API<\/a>.<\/p>\n<h4>\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 FluxInstance:<\/p>\n<pre><code>kubectl -n flux-system get events --for fluxinstance\/fluxLAST SEEN   TYPE     REASON                    OBJECT              MESSAGE43m         Normal   ReconciliationSucceeded   FluxInstance\/flux   Reconciliation finished in 2s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f (Slack, Teams \u0438 \u0434\u0440.) \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437\u00a0<code>notification-controller<\/code>\u00a0\u0438 CRD\u00a0<code>Provider\/Alert<\/code>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:\u00a0<a href=\"https:\/\/fluxoperator.dev\/docs\/crd\/provider\" rel=\"noopener noreferrer nofollow\">Provider\/Alert<\/a>.<\/p>\n<h4>\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f Flux \u0432 Alertmanager<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Flux:<\/p>\n<pre><code>mkdir -p apps\/flux-resources<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u0441 Provider \u0438 Alert \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Flux \u0432 Alertmanager:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-resources\/flux-notifications.yaml# Flux notification-controller \u2192 Prometheus Alertmanager (VMAlertmanager \u0438\u0437 victoria-metrics-k8s-stack).# \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0441 severity error \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 Alertmanager; Grafana \u0438\u0445 \u0432\u0438\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 datasource Alertmanager.---apiVersion: notification.toolkit.fluxcd.io\/v1beta3kind: Providermetadata:  name: alertmanager  namespace: flux-systemspec:  type: alertmanager  # VMAlertmanager CR: vmks-victoria-metrics-k8s-stack (release vmks, chart victoria-metrics-k8s-stack), ns vmks  address: http:\/\/vmalertmanager-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:9093\/api\/v2\/alerts---apiVersion: notification.toolkit.fluxcd.io\/v1beta3kind: Alertmetadata:  name: flux-to-alertmanager  namespace: flux-systemspec:  providerRef:    name: alertmanager  eventSeverity: error  eventSources:    - kind: GitRepository      name: \"*\"    - kind: OCIRepository      name: \"*\"    - kind: HelmRepository      name: \"*\"    - kind: HelmChart      name: \"*\"    - kind: HelmRelease      name: \"*\"    - kind: Kustomization      name: \"*\"EOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 Kustomization \u0434\u043b\u044f\u00a0<code>flux-resources<\/code>\u00a0\u0432\u00a0<code>base\/apps.yaml<\/code>:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt;&gt; base\/apps.yaml---apiVersion: kustomize.toolkit.fluxcd.io\/v1kind: Kustomizationmetadata:  name: flux-resources  namespace: flux-systemspec:  interval: 10m  sourceRef:    kind: GitRepository    name: flux-system  serviceAccountName: kustomize-controller  path: .\/apps\/flux-resources  prune: true  wait: true  timeout: 5mEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0<code>kustomization.yaml<\/code>\u00a0\u0434\u043b\u044f \u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-resources\/kustomization.yamlapiVersion: kustomize.config.k8s.io\/v1beta1kind: Kustomizationresources:- flux-notifications.yamlEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u044c\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code>git add .git commit -m \"Add Flux Alertmanager notifications\"git push<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u00a0<code>flux-system<\/code>:<\/p>\n<ul>\n<li>\n<p><code><strong>Provider<\/strong><\/code>\u00a0<code>alertmanager<\/code>\u00a0\u2014 \u0442\u0438\u043f\u00a0<code>alertmanager<\/code>, \u0430\u0434\u0440\u0435\u0441 HTTP API VMAlertmanager \u0438\u0437\u00a0<a href=\"https:\/\/github.com\/VictoriaMetrics\/helm-charts\/tree\/master\/charts\/victoria-metrics-k8s-stack\" rel=\"noopener noreferrer nofollow\">VictoriaMetrics K8s Stack<\/a>\u00a0(\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u0437\u0430\u0434\u0430\u043d \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0435\u043b\u0438\u0437\u0430\u00a0<code>vmks-victoria-metrics-k8s-stack<\/code>\u00a0\u0432 namespace\u00a0<code>vmks<\/code>).<\/p>\n<\/li>\n<li>\n<p><code><strong>Alert<\/strong><\/code>\u00a0<code>flux-to-alertmanager<\/code>\u00a0\u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u00a0<strong>severity\u00a0<\/strong><code><strong>error<\/strong><\/code>\u00a0\u043e\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 (<code>GitRepository<\/code>,\u00a0<code>OCIRepository<\/code>,\u00a0<code>HelmRepository<\/code>,\u00a0<code>HelmChart<\/code>,\u00a0<code>HelmRelease<\/code>,\u00a0<code>Kustomization<\/code>) \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0443\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435\u00a0<strong>notification-controller<\/strong>\u00a0(\u0432\u00a0<a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/base\/flux-system\/flux-instance.yaml\" rel=\"noopener noreferrer nofollow\">FluxInstance<\/a>\u00a0\u043e\u043d \u0432\u00a0<code>spec.components<\/code>) \u0438\u00a0<strong>VMAlertmanager<\/strong>\u00a0\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u0437\u00a0<code>Provider.spec.address<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f<\/h3>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u043b\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u044e \u0441 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c:<\/p>\n<pre><code>flux get kustomizations -n flux-system flux-system<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<code>Provider<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u043d:<\/p>\n<pre><code>kubectl get providers.notification.toolkit.fluxcd.io -n flux-systemNAME           AGEalertmanager   23s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<code>Alert<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u043d:<\/p>\n<pre><code>kubectl get alerts.notification.toolkit.fluxcd.io -n flux-systemNAME                   AGEflux-to-alertmanager   29s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0435\u0442\u0430\u043b\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u00a0<code>Provider<\/code>:<\/p>\n<pre><code>kubectl -n flux-system get provider alertmanager -o yamlapiVersion: notification.toolkit.fluxcd.io\/v1beta3kind: Providermetadata:  creationTimestamp: \"2026-05-03T14:09:46Z\"  finalizers:  - finalizers.fluxcd.io  generation: 1  labels:    kustomize.toolkit.fluxcd.io\/name: flux-resources    kustomize.toolkit.fluxcd.io\/namespace: flux-system  name: alertmanager  namespace: flux-system  resourceVersion: \"52687\"  uid: 311becb0-ea11-454f-859b-0f76585bbbc0spec:  address: http:\/\/vmalertmanager-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:9093\/api\/v2\/alerts  type: alertmanager<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0435\u0442\u0430\u043b\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u00a0<code>Alert<\/code>:<\/p>\n<pre><code>kubectl -n flux-system get alert flux-to-alertmanager -o yamlapiVersion: notification.toolkit.fluxcd.io\/v1beta3kind: Alertmetadata:  creationTimestamp: \"2026-05-03T14:09:46Z\"  generation: 1  labels:    kustomize.toolkit.fluxcd.io\/name: flux-resources    kustomize.toolkit.fluxcd.io\/namespace: flux-system  name: flux-to-alertmanager  namespace: flux-system  resourceVersion: \"52685\"  uid: c49e6233-63f0-499e-8293-db2be1838c5fspec:  eventSeverity: error  eventSources:  - kind: GitRepository    name: '*'  - kind: OCIRepository    name: '*'  - kind: HelmRepository    name: '*'  - kind: HelmChart    name: '*'  - kind: HelmRelease    name: '*'  - kind: Kustomization    name: '*'  providerRef:    name: alertmanager<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 kustomize:<\/p>\n<pre><code>kubectl kustomize apps\/flux-resources | grep -E 'kind: (Provider|Alert)|name: (alertmanager|flux-to-alertmanager)'kind: Alert  name: flux-to-alertmanager    name: alertmanagerkind: Provider  name: alertmanager<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b Flux \u044d\u043a\u0441\u043f\u043e\u043d\u0438\u0440\u0443\u044e\u0442 Prometheus-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443\u00a0<code>http-prom<\/code>\u00a0\u2014 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u0438 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u0439, \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a. \u0411\u0435\u0437 \u0441\u0431\u043e\u0440\u0430 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 Grafana,<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u043d\u0430 \u0440\u043e\u0441\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0448\u0438\u0431\u043e\u043a (\u0441\u043c. Alertmanager \u0432\u044b\u0448\u0435),<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043d\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p><strong>PodMonitor<\/strong>\u00a0\u2014 \u0440\u0435\u0441\u0443\u0440\u0441 Prometheus Operator (CRD\u00a0<code>monitoring.coreos.com\/v1<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 vmagent \/ Prometheus, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u044b \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442\u044c \u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 ServiceMonitor, PodMonitor \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e \u043b\u0435\u0439\u0431\u043b\u0430\u043c \u2014 \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e Service \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 PodMonitor \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0441\u043e \u0432\u0441\u0435\u0445 Flux-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-resources\/podmonitor.yamlapiVersion: monitoring.coreos.com\/v1kind: PodMonitormetadata:  name: flux-system  namespace: flux-system  labels:    app.kubernetes.io\/part-of: flux    app.kubernetes.io\/component: monitoringspec:  namespaceSelector:    matchNames:      - flux-system  selector:    matchExpressions:      - key: app        operator: In        values:          - helm-controller          - source-controller          - kustomize-controller          - notification-controller          - image-automation-controller          - image-reflector-controller  podMetricsEndpoints:    - port: http-promEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435\u00a0<code>apps\/flux-resources\/kustomization.yaml<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0431\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0430:<\/p>\n<pre><code>cat &lt;&lt;'EOF' &gt; apps\/flux-resources\/kustomization.yamlapiVersion: kustomize.config.k8s.io\/v1beta1kind: Kustomizationresources:- flux-notifications.yaml- podmonitor.yamlEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u044c\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code>git add .git commit -m \"Added PodMonitor for Flux\"git push<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 PodMonitor \u0438 \u043c\u0435\u0442\u0440\u0438\u043a<\/h3>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e Kustomization\u00a0<code>flux-resources<\/code>\u00a0\u043f\u043e\u0434\u0442\u044f\u043d\u0443\u043b\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u044e \u0441\u00a0<code>podmonitor.yaml<\/code>:<\/p>\n<pre><code>flux get kustomizations -n flux-system flux-resourcesNAME          REVISION                     SUSPENDEDREADYMESSAGE                                         flux-resourcesrefs\/heads\/main@sha1:429293c9False    True Applied revision: refs\/heads\/main@sha1:429293c9<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f Kustomization (\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u00a0<code>flux<\/code>\u00a0\u043d\u0435\u0442 \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>describe<\/code>):<\/p>\n<pre><code>kubectl get events -n flux-system --field-selector involvedObject.name=flux-resources --sort-by='.lastTimestamp'LAST SEEN   TYPE     REASON                    OBJECT                         MESSAGE5m46s       Normal   Progressing               kustomization\/flux-resources   Alert\/flux-system\/flux-to-alertmanager created...5m46s       Normal   Progressing               kustomization\/flux-resources   Health check passed in 32.876003ms5m46s       Normal   ReconciliationSucceeded   kustomization\/flux-resources   Reconciliation finished in 204.558291ms, next run in 10m0s101s        Normal   ReconciliationSucceeded   kustomization\/flux-resources   Reconciliation finished in 241.056785ms, next run in 10m0s38s         Normal   Progressing               kustomization\/flux-resources   PodMonitor\/flux-system\/flux-system created38s         Normal   Progressing               kustomization\/flux-resources   Health check passed in 100.046212ms37s         Normal   ReconciliationSucceeded   kustomization\/flux-resources   Reconciliation finished in 334.747203ms, next run in 10m0s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 PodMonitor \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0420\u0435\u0441\u0443\u0440\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 namespace\u00a0<code>flux-system<\/code>\u00a0\u2014 \u0431\u0435\u0437\u00a0<code>metadata.namespace<\/code>\u00a0Flux \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443\u00a0<code>PodMonitor\/... namespace not specified<\/code>:<\/p>\n<pre><code>kubectl get podmonitor -n flux-systemNAME          AGEflux-system   84s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0435\u0442\u0430\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>kubectl describe podmonitor flux-system -n flux-systemName:         flux-systemNamespace:    flux-systemLabels:       app.kubernetes.io\/component=monitoring              app.kubernetes.io\/part-of=flux              kustomize.toolkit.fluxcd.io\/name=flux-resources              kustomize.toolkit.fluxcd.io\/namespace=flux-systemAnnotations:  &lt;none&gt;API Version:  monitoring.coreos.com\/v1Kind:         PodMonitorMetadata:  Creation Timestamp:  2026-05-03T14:14:54Z  Generation:          1  Resource Version:    54801  UID:                 601a63ec-4b61-4349-9096-ffc38fdc7b33Spec:  Namespace Selector:    Match Names:      flux-system  Pod Metrics Endpoints:    Port:  http-prom  Selector:    Match Expressions:      Key:       app      Operator:  In      Values:        helm-controller        source-controller        kustomize-controller        notification-controller        image-automation-controller        image-reflector-controllerEvents:  &lt;none&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e PodMonitor \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 kustomize:<\/p>\n<pre><code>kubectl kustomize apps\/flux-resources | grep -E 'kind: PodMonitor|name: flux-system|namespace: flux-system|http-prom'kind: PodMonitor  name: flux-system  namespace: flux-system  - port: http-prom  namespace: flux-system  namespace: flux-system<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434\u044b Flux \u0432\u00a0<code>flux-system<\/code>\u00a0\u0438 \u043f\u043e\u0440\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u00a0<code><strong>http-prom<\/strong><\/code>:<\/p>\n<pre><code>kubectl get pods -n flux-system -l 'app in (helm-controller,source-controller,kustomize-controller,notification-controller,image-automation-controller,image-reflector-controller)' -o wideNAME                                       READY   STATUS    RESTARTS   AGE    IP              NODE                        NOMINATED NODE   READINESS GATEShelm-controller-65ff4c7c98-sgtg7           1\/1     Running   0          118m   10.112.130.12   cl1lo7src0ijsb1bv4i6-ehuw   &lt;none&gt;           &lt;none&gt;kustomize-controller-59fc467858-c8phv      1\/1     Running   0          118m   10.112.129.11   cl1lo7src0ijsb1bv4i6-oban   &lt;none&gt;           &lt;none&gt;notification-controller-6d66bb7797-2rm5f   1\/1     Running   0          118m   10.112.130.13   cl1lo7src0ijsb1bv4i6-ehuw   &lt;none&gt;           &lt;none&gt;source-controller-7846484bbc-j88ww         1\/1     Running   0          118m   10.112.129.12   cl1lo7src0ijsb1bv4i6-oban   &lt;none&gt;           &lt;none&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0440\u0442\u00a0<code>http-prom<\/code>:<\/p>\n<pre><code>kubectl get pods -n flux-system -l app=source-controller -o jsonpath='{range .items[*]}{.metadata.name}{\"\\t\"}{range .spec.containers[*].ports[*]}{.name}{\" \"}{end}{\"\\n\"}{end}'source-controller-7846484bbc-j88wwhttp http-prom healthz <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 VictoriaMetrics K8s Stack \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0441 UI, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u043e\u0442 \u043f\u043e\u0434\u043e\u0432\u00a0<code>flux-system<\/code>\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Grafana Explore).<\/p>\n<p>\u0414\u043b\u044f Prometheus Operator:\u00a0<code>serviceMonitor.create=true<\/code>\u00a0\u0432\u00a0<code>values<\/code>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:\u00a0<a href=\"https:\/\/fluxcd.control-plane.io\/operator\/monitoring\" rel=\"noopener noreferrer nofollow\">Flux Monitoring and Reporting<\/a>.<\/p>\n<h3>\u0423\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0421\u0438\u043c\u043f\u0442\u043e\u043c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GitRepository<\/code>\u00a0\/\u00a0<code>Kustomization<\/code>\u00a0\u043d\u0435 Ready<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>flux get sources git -A<\/code>,\u00a0<code>kubectl describe gitrepository -n flux-system<\/code>, \u0441\u0435\u0442\u044c \u0438 \u043f\u0440\u0430\u0432\u0430 PAT \/ deploy key<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HelmRelease \u0437\u0430\u0432\u0438\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>flux get helmreleases -A<\/code>, \u043b\u043e\u0433\u0438\u00a0<code>helm-controller<\/code>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u00a0<code>HelmRelease<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\u00a0<code>base\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u00a0<code>FluxInstance.spec.sync.path<\/code>\u00a0\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\u00a0<code>.\/base<\/code>, \u0435\u0441\u043b\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043b\u0435\u0436\u0430\u0442 \u043f\u043e\u0434\u00a0<code>base\/<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a Flux-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u0434\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0440\u0442\u00a0<code>http-prom<\/code>; PodMonitor \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u00a0<code>flux-system<\/code>\u00a0\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Status Page \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 Ingress \u0438\u00a0<code>web.enabled: true<\/code>\u00a0\/\u00a0<code>web.config.baseURL<\/code>\u00a0\u0432 values HelmRelease \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 Grafana<\/h3>\n<p><a href=\"https:\/\/github.com\/VictoriaMetrics\/helm-charts\/tree\/master\/charts\/victoria-metrics-k8s-stack\" rel=\"noopener noreferrer nofollow\">VictoriaMetrics K8s Stack<\/a>\u00a0\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u00a0<strong>Grafana<\/strong>\u00a0\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 vmagent, VMSingle \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433\u0430.<\/p>\n<p><strong>\u0412\u0435\u0431-\u0434\u043e\u0441\u0442\u0443\u043f:<\/strong>\u00a0\u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f Grafana \u0432\u043a\u043b\u044e\u0447\u0451\u043d Ingress \u2014\u00a0<a href=\"http:\/\/grafana.apatsev.org.ru\" rel=\"noopener noreferrer nofollow\">http:\/\/grafana.apatsev.org.ru<\/a>\u00a0(\u0441\u043c.\u00a0<a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/apps\/victoria-metrics\/helmrelease.yaml\" rel=\"noopener noreferrer nofollow\">apps\/victoria-metrics\/helmrelease.yaml<\/a>).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 Grafana:<\/p>\n<pre><code>kubectl get secret vmks-grafana -n vmks -o jsonpath='{.data.admin-password}' | base64 --decode; echo<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 FluxCD dashboard \u0432 Grafana<\/h4>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u0432\u0437\u044f\u0442\u044b \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u00a0<a href=\"https:\/\/github.com\/fluxcd\/flux2-monitoring-example\/tree\/main\/monitoring\/configs\/dashboards\" rel=\"noopener noreferrer nofollow\">flux2-monitoring-example<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/grafana.com\/grafana\/dashboards\/16714-flux2\/\" rel=\"noopener noreferrer nofollow\">Grafana Dashboard ID 16714 (Flux2)<\/a>, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Flux 2.8+ \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0441\u0442\u0435\u043a\u043e\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Flux \u0443\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f (\u0447\u0435\u0440\u0435\u0437\u00a0<code>PodMonitor<\/code>), \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0414\u0430\u0448\u0431\u043e\u0440\u0434<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">JSON<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Flux2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 FluxCD (Kustomization, HelmRelease, GitRepository \u0438 \u0434\u0440.). \u0410\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f Flux 2.8+: \u0437\u0430\u043c\u0435\u043d\u0451\u043d deprecated\u00a0<code>gotk_reconcile_condition<\/code>\u00a0\u043d\u0430\u00a0<code>gotk_resource_info<\/code>\u00a0\u0438\u0437 kube-state-metrics.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/flux2.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/flux2.json<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Flux Cluster Stats<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 Flux: \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u043e namespace, \u0442\u0438\u043f\u0430\u043c \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/cluster.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/cluster.json<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Flux Control Plane<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 control plane Flux: \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/control-plane.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/control-plane.json<\/code><\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b Grafana<\/h4>\n<h3>Flux2 Dashboard<\/h3>\n<p>JSON:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/flux2.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/flux2.json<\/code><\/a><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/81e\/4e0\/9a1\/81e4e09a1654c0dbbd6719ae5f20830f.png\" alt=\"Grafana \u2014 Flux2 Dashboard (section 1)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/81e\/4e0\/9a1\/81e4e09a1654c0dbbd6719ae5f20830f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/81e\/4e0\/9a1\/81e4e09a1654c0dbbd6719ae5f20830f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux2 Dashboard (section 1)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c3a\/03a\/e99\/c3a03ae998b3bfb9969388672ca786f6.png\" alt=\"Grafana \u2014 Flux2 Dashboard (section 2)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c3a\/03a\/e99\/c3a03ae998b3bfb9969388672ca786f6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c3a\/03a\/e99\/c3a03ae998b3bfb9969388672ca786f6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux2 Dashboard (section 2)<\/figcaption><\/div>\n<\/figure>\n<h3>Flux Cluster Stats Dashboard<\/h3>\n<p>JSON:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/cluster.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/cluster.json<\/code><\/a><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/540\/b53\/fd6\/540b53fd6e04b4b47c064477c4df02e2.png\" alt=\"Grafana \u2014 Flux Cluster Stats (section 1)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/540\/b53\/fd6\/540b53fd6e04b4b47c064477c4df02e2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/540\/b53\/fd6\/540b53fd6e04b4b47c064477c4df02e2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Cluster Stats (section 1)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6ee\/4ec\/ca6\/6ee4ecca6e454853fdad9d9d9848a4f7.png\" alt=\"Grafana \u2014 Flux Cluster Stats (section 2)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6ee\/4ec\/ca6\/6ee4ecca6e454853fdad9d9d9848a4f7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6ee\/4ec\/ca6\/6ee4ecca6e454853fdad9d9d9848a4f7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Cluster Stats (section 2)<\/figcaption><\/div>\n<\/figure>\n<h3>Flux Control Plane Dashboard<\/h3>\n<p>JSON:\u00a0<a href=\"https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page\/blob\/main\/dashboard\/control-plane.json\" rel=\"noopener noreferrer nofollow\"><code>dashboard\/control-plane.json<\/code><\/a><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4ba\/cbb\/8e4\/4bacbb8e4a192925254ce69e87c5b7eb.png\" alt=\"Grafana \u2014 Flux Control Plane (section 1)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4ba\/cbb\/8e4\/4bacbb8e4a192925254ce69e87c5b7eb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4ba\/cbb\/8e4\/4bacbb8e4a192925254ce69e87c5b7eb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Control Plane (section 1)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d94\/3dc\/284\/d943dc2843854f294a61eedc47d1f838.png\" alt=\"Grafana \u2014 Flux Control Plane (section 2)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d94\/3dc\/284\/d943dc2843854f294a61eedc47d1f838.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d94\/3dc\/284\/d943dc2843854f294a61eedc47d1f838.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Control Plane (section 2)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/08a\/f49\/7c8\/08af497c856c802af27c8bbd9fc9e5a9.png\" alt=\"Grafana \u2014 Flux Control Plane (section 3)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/08a\/f49\/7c8\/08af497c856c802af27c8bbd9fc9e5a9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/08a\/f49\/7c8\/08af497c856c802af27c8bbd9fc9e5a9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Control Plane (section 3)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/77b\/b00\/103\/77bb0010342f78f7024cd6420bb2f432.png\" alt=\"Grafana \u2014 Flux Control Plane (section 4)\" width=\"1680\" height=\"1050\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/77b\/b00\/103\/77bb0010342f78f7024cd6420bb2f432.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/77b\/b00\/103\/77bb0010342f78f7024cd6420bb2f432.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Flux Control Plane (section 4)<\/figcaption><\/div>\n<\/figure>\n<h3>Alertmanager Dashboard<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d99\/a66\/ebb\/d99a66ebbfe2547395f51bc99c36d0e6.png\" alt=\"Grafana \u2014 Alertmanager\" width=\"1678\" height=\"787\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d99\/a66\/ebb\/d99a66ebbfe2547395f51bc99c36d0e6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d99\/a66\/ebb\/d99a66ebbfe2547395f51bc99c36d0e6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana \u2014 Alertmanager<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 Flux \u0447\u0435\u0440\u0435\u0437\u00a0<code>GitRepository<\/code>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u044e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445\u00a0<code>Kustomization<\/code>\u00a0\u0438\u00a0<code>HelmRelease<\/code>. \u0415\u0441\u043b\u0438 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (<code>ReconciliationFailed<\/code>), notification-controller \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043b\u0435\u0440\u0442 \u0432 Alertmanager. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 Alertmanager \u0438 Grafana \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u0441\u0431\u043e\u044e.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1030980\/\">https:\/\/habr.com\/ru\/articles\/1030980\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Flux CD\u00a0\u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f GitOps \u0432 Kubernetes. \u041e\u043d \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0451\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 Helm-\u0447\u0430\u0440\u0442\u0430\u043c\u0438. Flux \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 Git, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 Kubernetes API \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f graduated-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c CNCF.\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0435 GitOps \u0432 Kubernetes,\u00a0Flux CD\u00a0\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c:\u00a0flux bootstrap, \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 Git, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0442\u044f\u043d\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.\u041d\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Flux Operator:\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u00a0\u2014 \u0432\u0435\u0440\u0441\u0438\u044f, \u0440\u0435\u0435\u0441\u0442\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0432\u00a0FluxInstance\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432\u00a0gotk-components.\u0415\u0434\u0438\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 Git\u00a0\u2014\u00a0FluxInstance.spec.sync\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043a\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 Git\u00a0\u2014 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u043c \u0438 \u0440\u0435\u0432\u044c\u044e, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c\u00a0\u2014 \u043e\u0442\u0447\u0451\u0442\u044b, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u00a0Status Page, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0flux get\u00a0\u0432 CLI.\u041f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 GitOps\u00a0\u2014\u00a0GitRepository,\u00a0Kustomization,\u00a0HelmRelease\u00a0\u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f; \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00a0\u0441\u0430\u043c\u043e\u0433\u043e Flux.\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e bootstrap \u043a\u00a0Flux Operator\u00a0(FluxInstance) \u0438\u00a0FluxCD Status Page.\u0427\u0430\u0441\u0442\u044c 1. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Flux: bootstrap \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0427\u0438\u0441\u0442\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes.Flux CLI\u00a0\u2014\u00a0Installing the Flux CLI. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430:\u00a0flux version &#8212;client.\u0414\u043e\u0441\u0442\u0443\u043f \u043a Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f\u00a0flux bootstrap; \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 PAT (\u0441\u043c. \u043d\u0438\u0436\u0435).GitHub Personal Access Token \u0434\u043b\u044f bootstrap\u0414\u043b\u044f\u00a0flux bootstrap github\u00a0\u0442\u043e\u043a\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0GITHUB_TOKEN\u00a0\u0438\u043b\u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0435.\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PAT (Fine-grained token)GitHub \u2192 Fine-grained tokens.Repository access\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00a0fluxcd-operator-and-status-page).Permissions:\u00a0Contents\u00a0\u2014 Read and write;\u00a0Metadata\u00a0\u2014 Read-only;\u00a0Administration\u00a0\u2014 Read-only.\u0421 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0&#8212;token-auth\u00a0Flux \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 PAT \u0432 Secret \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435; \u0434\u043b\u044f PAT \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u00a0Administration \u2192 Read-only.\u041a\u043e\u043c\u0430\u043d\u0434\u0430 bootstrap\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 bootstrap \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Flux CLI \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0base\/flux-system\/\u00a0\u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (gotk-components.yaml) \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (gotk-sync.yaml), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442 \u0438\u0445 \u0432 \u0432\u0435\u0442\u043a\u0443\u00a0main.flux bootstrap github \\  &#8212;token-auth \\  &#8212;owner=patsevanton \\  &#8212;repository=fluxcd-operator-and-status-page \\  &#8212;branch=main \\  &#8212;path=base\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430:Please enter your GitHub personal access token (PAT):\u25ba connecting to github.com\u25ba cloning branch &#171;main&#187; from Git repository &#171;https:\/\/github.com\/patsevanton\/fluxcd-operator-and-status-page.git&#187;\u2714 cloned repository&#8230;\u2714 all components are healthy\u041f\u043e\u0441\u043b\u0435 bootstrap \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:git pull\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 bootstrapFlux \u0443\u0436\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 FluxCD:flux get all -A\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0438\u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e\u00a0broken-demo\u00a0\u0441\u043b\u043e\u043c\u0430\u043d \u2014 \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0435\u0440\u0442\u043e\u0432 FluxCD:flux get all -A | grep -v &#171;succeeded&#187; | grep -v Applied | grep -v pulled | grep -v &#171;stored artifact&#187; | grep -v ReadyNAMESPACE  NAME                     REVISION          SUSPENDEDREADYMESSAGE                                           NAMESPACE  NAME                               REVISION       SUSPENDEDREADYMESSAGE                                     NAMESPACE  NAME                                          REVISIONSUSPENDEDREADYMESSAGE                                                         NAMESPACE  NAME                                REVISIONSUSPENDEDREADYMESSAGE                                                                                                               NAMESPACE  NAME                          REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                                                                                                                                                                                                                                                                                                 flux-systemkustomization\/broken-demo                       False    FalseHelmRelease\/broken-demo\/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io &#171;broken-demo&#187; is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: &#171;OCIRepository&#187;: supported values: &#171;HelmRepository&#187;, &#171;GitRepository&#187;, &#171;Bucket&#187;, &lt;nil&gt;: Invalid value: &#171;null&#187;: some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                        Namespace\/broken-demo created                      \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c HelmReleases \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:flux get helmreleases -n flux-systemNAME                    REVISIONSUSPENDEDREADYMESSAGE                                                                                                               prometheus-operator-crds28.0.1  False    True Helm install succeeded for release flux-system\/prometheus-operator-crds.v1 with chart prometheus-operator-crds@28.0.1vmks                    0.74.1  False    True Helm upgrade succeeded for release vmks\/vmks.v2 with chart victoria-metrics-k8s-stack@0.74.1  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c Kustomization&#8217;\u044b:flux get kustomizations -ANAMESPACE  NAME            REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                       flux-systembroken-demo                       False    FalseHelmRelease\/broken-demo\/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io &#171;broken-demo&#187; is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: &#171;OCIRepository&#187;: supported values: &#171;HelmRepository&#187;, &#171;GitRepository&#187;, &#171;Bucket&#187;, &lt;nil&gt;: Invalid value: &#171;null&#187;: some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                           flux-systemflux-system     main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemprometheus-crds main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemvictoria-metricsmain@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0    \u0427\u0430\u0441\u0442\u044c 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Flux Operator\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flux Operator\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Flux Operator \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0448\u0430\u0433\u0438 \u043d\u0438\u0436\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:mkdir -p apps\/flux-operator\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 Kustomization \u0434\u043b\u044f\u00a0flux-operator\u00a0\u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430\u00a0base\/apps.yaml\u00a0(\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\u00a0victoria-metrics,\u00a0broken-demo,\u00a0prometheus-crds\u00a0\u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435):cat &lt;&lt;&#8216;EOF&#8217; &gt;&gt; base\/apps.yaml&#8212;apiVersion: kustomize.toolkit.fluxcd.io\/v1kind: Kustomizationmetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 10m  sourceRef:    kind: GitRepository    name: flux-system  serviceAccountName: kustomize-controller  path: .\/apps\/flux-operator  prune: true  wait: true  timeout: 10mEOF\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 HelmRepository \u0434\u043b\u044f OCI-\u0447\u0430\u0440\u0442\u0430 ControlPlane:cat &lt;&lt;&#8216;EOF&#8217; &gt; apps\/flux-operator\/sources.yamlapiVersion: source.toolkit.fluxcd.io\/v1kind: HelmRepositorymetadata:  name: cp-flux-operator  namespace: flux-systemspec:  interval: 24h  type: oci  url: oci:\/\/ghcr.io\/controlplaneio-fluxcd\/chartsEOF\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 HelmRelease \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044e\u00a0web\u00a0\u2014 \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Status Page \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Ingress:cat &lt;&lt;&#8216;EOF&#8217; &gt; apps\/flux-operator\/helmrelease.yamlapiVersion: helm.toolkit.fluxcd.io\/v2kind: HelmReleasemetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 30m  timeout: 10m  chart:    spec:      chart: flux-operator      version: &#171;0.47.0&#187;      sourceRef:        kind: HelmRepository        name: cp-flux-operator        namespace: flux-system      interval: 30m  releaseName: flux-operator  values:    web:      enabled: true      config:        baseURL: http:\/\/flux.apatsev.org.ru\/      ingress:        enabled: true        className: nginx        hosts:          &#8212; host: flux.apatsev.org.ru            paths:              &#8212; path: \/                pathType: PrefixEOF\u0417\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u044c\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:git add .git commit -m &#171;Add flux-operator manifests&#187;git push\u0414\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c, \u043f\u043e\u043a\u0430 Flux \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u0443\u044e Kustomization \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440:flux get kustomizations -n flux-system | grep flux-operatorflux-operator   main@sha1:e23386eaFalse    True Applied revision: main@sha1:e23386ea\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e HelmRelease \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d:flux get helmreleases -n flux-system | grep flux-operatorflux-operator           0.47.0  False    True Helm install succeeded for release flux-system\/flux-operator.v1 with chart flux-operator@0.47.0                 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 FluxInstance\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Flux Operator \u0444\u0430\u0439\u043b\u00a0base\/flux-system\/kustomization.yaml\u00a0(\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439\u00a0flux bootstrap) \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0gotk-components.yaml\u00a0\u0438\u00a0gotk-sync.yaml, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Flux \u0432\u0441\u0451 \u0435\u0449\u0451 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c bootstrap.\u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0FluxInstance. \u042d\u0442\u043e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443, \u043a\u0430\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Flux \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0441 \u043a\u0430\u043a\u043e\u0433\u043e Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b.\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:\u00a0\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f\u00a0FluxInstance, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0435\u0440\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Flux \u043d\u0430 \u0441\u0435\u0431\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b bootstrap. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u00a0gotk-*\u00a0\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\u00a0FluxInstance\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c.\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b FluxInstance:mkdir -p base\/flux-systemcat &lt;&lt;&#8216;EOF&#8217; &gt; base\/flux-system\/flux-instance.yamlapiVersion: fluxcd.controlplane.io\/v1kind: FluxInstancemetadata:  name: flux  namespace: flux-systemspec:  distribution:    version: &#171;2.8.x&#187;    registry: &#171;ghcr.io\/fluxcd&#187;  components:    -&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478429","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478429","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=478429"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478429\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}