{"id":1581,"date":"2025-04-04T14:29:03","date_gmt":"2025-04-04T12:29:03","guid":{"rendered":"https:\/\/olvas.dev\/?p=1581"},"modified":"2025-04-04T14:29:04","modified_gmt":"2025-04-04T12:29:04","slug":"%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-elasticsearch-%d0%b2-kubernetes-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8f-operator-%d0%b8-fluxcd","status":"publish","type":"post","link":"https:\/\/olvas.dev\/?p=1581","title":{"rendered":"\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c Elasticsearch \u0432 Kubernetes \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f operator \u0438 FluxCD"},"content":{"rendered":"\n<p>Elasticsearch \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0430\u044f \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Elasticsearch \u0432 Kubernetes \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ECK (Elastic Cloud on Kubernetes), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0414\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u044b Elasticsearch \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0432\u044f\u0437\u043a\u0430 Prometheus \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0451\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a. \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0451\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 (\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432) \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f Prometheus \u0447\u0435\u0440\u0435\u0437 ServiceMonitor. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043c\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0431\u0435\u043a\u0430\u043f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Elasticsearch \u0447\u0435\u0440\u0435\u0437 ECK \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e FluxCD \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c FluxCD, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c\u0443 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 FluxCD \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ECK \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Elasticsearch-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Namespace<\/h3>\n\n\n\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c&nbsp;Namespace&nbsp;\u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ECK:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Namespace\nmetadata:\n  name: es-operator<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442&nbsp;Namespace&nbsp;\u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 ECK \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 GitRepository<\/h3>\n\n\n\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 FluxCD \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Git, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f ECK. \u042d\u0442\u043e\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 FluxCD \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 ECK \u0441 \u0442\u0435\u0433\u043e\u043c&nbsp;v2.10.0, \u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u0440\u043e\u043c\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&nbsp;deploy\/eck-operator.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: source.toolkit.fluxcd.io\/v1\nkind: GitRepository\nmetadata:\n  name: eck\n  namespace: es-operator\nspec:\n  interval: 24h\n  ref:\n    tag: v2.10.0\n  url: https:\/\/github.com\/elastic\/cloud-on-k8s\n  ignore: |\n    # exclude all\n    \/*\n    # include this path\n    !\/deploy\/eck-operator<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 es-operator<\/h3>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ECK (Elastic Cloud on Kubernetes) \u0447\u0435\u0440\u0435\u0437 Helm-\u0440\u0435\u043b\u0438\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0447\u0430\u0440\u0442 \u0438\u0437 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041e\u043d \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Elasticsearch-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c namespace (myelasticsearch), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u0432\u0435\u0440\u0441\u0438\u0438 2.10.0 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u044b\u0435 5 \u043c\u0438\u043d\u0443\u0442.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 Helm-\u0440\u0435\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ECK (Elastic Cloud on Kubernetes)\napiVersion: helm.toolkit.fluxcd.io\/v2\nkind: HelmRelease\nmetadata:\n  name: eck  # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 HelmRelease \u0432 Kubernetes\n  namespace: es-operator  # Namespace, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ECK\nspec:\n  releaseName: es-operator  # \u0418\u043c\u044f \u0441\u0430\u043c\u043e\u0433\u043e Helm-\u0440\u0435\u043b\u0438\u0437\u0430\n  chart:\n    spec:\n      chart: .\/deploy\/eck-operator  # \u041f\u0443\u0442\u044c \u043a \u0447\u0430\u0440\u0442\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\n      sourceRef:\n        kind: GitRepository  # \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0447\u0430\u0440\u0442\u0430 - Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\n        name: eck  # \u0418\u043c\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 GitRepository\n        namespace: es-operator  # Namespace GitRepository\n  interval: 5m0s  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 (\u043a\u0430\u0436\u0434\u044b\u0435 5 \u043c\u0438\u043d\u0443\u0442)\n  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 CRD (Custom Resource Definitions)\n  install:\n    crds: Create  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f CRD \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\n  upgrade:\n    crds: CreateReplace  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f CRD (\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c)\n  # \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u0430\n  values:\n    managedNamespaces:\n      - myelasticsearch  # Namespace, \u0433\u0434\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 Elasticsearch\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\n    image:\n      repository: elastic\/eck-operator  # \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c\n      pullPolicy: IfNotPresent  # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\n      tag: 2.10.0  # \u0412\u0435\u0440\u0441\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\n    replicaCount: 1  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 Elasticsearch \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e External Secrets Operator<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n\n\n\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 DevOps-\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. External Secrets Operator (ESO) \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044f\u0441\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u043c\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a HashiCorp Vault, AWS Secrets Manager \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c ESO \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 Elasticsearch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 External Secrets Operator<\/h3>\n\n\n\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c External Secrets Operator \u0432 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c FluxCD.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n# \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 Helm-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f External Secrets Operator\napiVersion: source.toolkit.fluxcd.io\/v1\nkind: HelmRepository\nmetadata:\n  name: external-secrets  # \u0418\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u0441\u044b\u043b\u043e\u043a\nspec:\n  interval: 24h  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (1 \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438)\n  url: https:\/\/charts.external-secrets.io  # URL \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f External Secrets\n\n---\n# \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 Helm-\u0440\u0435\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 External Secrets Operator\napiVersion: helm.toolkit.fluxcd.io\/v2\nkind: HelmRelease\nmetadata:\n  name: external-secrets  # \u0418\u043c\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 HelmRelease\nspec:\n  releaseName: external-secrets  # \u0418\u043c\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0432 Helm\n  interval: 5m  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 (\u043a\u0430\u0436\u0434\u044b\u0435 5 \u043c\u0438\u043d\u0443\u0442)\n  chart:\n    spec:\n      chart: external-secrets  # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u0430 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\n      version: 0.9.20  # \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\n      sourceRef:\n        kind: HelmRepository  # \u0422\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 - \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 Helm-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\n        name: external-secrets  # \u0418\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u0447\u0430\u0440\u0442\n  install:\n    crds: CreateReplace  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 CRD: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\n    createNamespace: true  # \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 namespace \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\n  upgrade:\n    crds: CreateReplace  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f CRD: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438<\/code><\/pre>\n\n\n\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n external-secrets<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432<\/h3>\n\n\n\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HashiCorp Vault \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Vault \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435&nbsp;ClusterSecretStore<\/h4>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e Kubernetes \u0441 HashiCorp Vault \u0447\u0435\u0440\u0435\u0437 External Secrets Operator. \u0421\u0435\u043a\u0440\u0435\u0442 (vault-secret) \u2013 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 secret-id, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 Vault \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c AppRole. ClusterSecretStore (vault-backend) \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Vault (\u0430\u0434\u0440\u0435\u0441, \u043f\u0443\u0442\u044c, \u0432\u0435\u0440\u0441\u0438\u044f KV-\u0434\u0432\u0438\u0436\u043a\u0430), \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 AppRole (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c roleId \u0438 secret-id \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430) \u0438 TLS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, External Secrets Operator \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0438\u0437 Vault \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 Kubernetes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n# \u0421\u0435\u043a\u0440\u0435\u0442 Kubernetes, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 sensitive \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 Vault\napiVersion: v1\nkind: Secret\nmetadata:\n  name: vault-secret  # \u0418\u043c\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\ntype: Opaque  # \u0422\u0438\u043f \u0441\u0435\u043a\u0440\u0435\u0442\u0430 - \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\nstringData:\n  secret-id: \"secret-id-of-roleId\"  # \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 ID \u0434\u043b\u044f AppRole \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 Vault\n  # \u042d\u0442\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0435\n\n---\n# \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f ClusterSecretStore \u0434\u043b\u044f External Secrets Operator\n# \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a Vault \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b\napiVersion: external-secrets.io\/v1beta1\nkind: ClusterSecretStore\nmetadata:\n  name: vault-backend  # \u0418\u043c\u0435\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\nspec:\n  provider:\n    vault:  # \u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 - HashiCorp Vault\n      server: \"https:\/\/vault.example.com\"  # URL \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Vault\n      path: \"secret\"  # \u041f\u0443\u0442\u044c \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432 Vault\n      version: v2  # \u0412\u0435\u0440\u0441\u0438\u044f KV (Key-Value) \u0431\u044d\u043a\u0435\u043d\u0434\u0430 (v1 \u0438\u043b\u0438 v2)\n      caBundle: \"base64 encoded string of certificate\"  # CA \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 TLS \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\n      auth:\n        appRole:  # \u041c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 - AppRole\n          path: path-secret  # \u041f\u0443\u0442\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f AppRole \u0432 Vault\n          roleId: \"roleId\"  # Role ID \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\n          secretRef:  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Kubernetes Secret, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 Secret ID\n            key: secret-id  # \u041a\u043b\u044e\u0447 \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 Secret ID\n            name: vault-secret  # \u0418\u043c\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0434\u043b\u044f Elasticsearch<\/h3>\n\n\n\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d YAML-\u0444\u0430\u0439\u043b&nbsp;eso-auth.yaml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 Kubernetes-\u0441\u0435\u043a\u0440\u0435\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Elasticsearch, \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0438\u0437 Vault \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u043a\u0440\u0435\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c basic-auth, \u043a\u0443\u0434\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u043e\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 kibana_admin \u0438 superuser. \u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 External Secrets Operator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0432 Vault \u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0435\u043a\u0440\u0435\u0442.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n# ExternalSecret - \u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0432 Kubernetes\napiVersion: external-secrets.io\/v1beta1\nkind: ExternalSecret\nmetadata:\n  name: es-admin  # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ExternalSecret \u0440\u0435\u0441\u0443\u0440\u0441\u0430\n  namespace: myelasticsearch  # Namespace, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0435\u043a\u0440\u0435\u0442\n\nspec:\n  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 SecretStore, \u0433\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Vault\n  secretStoreRef:\n    name: vault-backend  # \u0418\u043c\u044f ClusterSecretStore, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435\n    kind: ClusterSecretStore  # \u0422\u0438\u043f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439)\n\n  refreshInterval: \"1m\"  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430 (\u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443)\n\n  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e Kubernetes Secret\n  target:\n    name: es-admin  # \u0418\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u0432 Kubernetes\n\n    # \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\n    template:\n      engineVersion: v2  # \u0412\u0435\u0440\u0441\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430\n      type: kubernetes.io\/basic-auth  # \u0422\u0438\u043f \u0441\u0435\u043a\u0440\u0435\u0442\u0430 - \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\n\n      # \u0414\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0435\n      data:\n        username: \"{{ .username }}\"  # \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        password: \"{{ .password }}\"  # \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u044f\n        roles: kibana_admin,superuser  # \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u043e\u043b\u0438 (\u043d\u0435 \u0438\u0437 Vault)\n\n  # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 Vault\n  data:\n    - secretKey: username  # \u041a\u043b\u044e\u0447 \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u0435\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch  # \u041f\u0443\u0442\u044c \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u0443 \u0432 Vault\n        property: admin_user  # \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0435 Vault\n\n    - secretKey: password  # \u041a\u043b\u044e\u0447 \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u0435\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch  # \u041f\u0443\u0442\u044c \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u0443 \u0432 Vault\n        property: admin_password  # \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0435 Vault\n---\napiVersion: external-secrets.io\/v1beta1\nkind: ExternalSecret\nmetadata:\n  name: myelasticsearch-user\n  namespace: myelasticsearch\nspec:\n  secretStoreRef:\n    name: vault-backend\n    kind: ClusterSecretStore\n  refreshInterval: \"1m\"\n  target:\n    name: myelasticsearch-user\n    template:\n      engineVersion: v2\n      type: kubernetes.io\/basic-auth\n      data:\n        username: \"{{ .username }}\"\n        password: \"{{ .password }}\"\n        roles: viewer,myelasticsearch-role\n  data:\n    - secretKey: username\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: myelasticsearch_user\n    - secretKey: password\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: myelasticsearch_password\n---\napiVersion: external-secrets.io\/v1beta1\nkind: ExternalSecret\nmetadata:\n  name: viewer-user\n  namespace: myelasticsearch\nspec:\n  secretStoreRef:\n    name: vault-backend\n    kind: ClusterSecretStore\n  refreshInterval: \"1m\"\n  target:\n    name: viewer-user\n    template:\n      engineVersion: v2\n      type: kubernetes.io\/basic-auth\n      data:\n        username: \"{{ .username }}\"\n        password: \"{{ .password }}\"\n        roles: viewer-role,kibana_user\n  data:\n    - secretKey: username\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: viewer_user\n    - secretKey: password\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: viewer_password\n---\napiVersion: external-secrets.io\/v1beta1\nkind: ExternalSecret\nmetadata:\n  name: elastic-backup-myelasticsearch-credentials\n  namespace: myelasticsearch\nspec:\n  secretStoreRef:\n    name: vault-backend\n    kind: ClusterSecretStore\n  refreshInterval: \"1m\"\n  target:\n    name: elastic-backup-myelasticsearch-credentials\n  data:\n    - secretKey: s3.client.backups.access_key\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: backup_s3_accesskey\n    - secretKey: s3.client.backups.secret_key\n      remoteRef:\n        key: ycloud\/elasticsearch\/myelasticsearch\n        property: backup_s3_secretkey<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/h3>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u044b:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get externalsecrets.external-secrets.io -n myelasticsearch\nkubectl get secrets -n myelasticsearch<\/code><\/pre>\n\n\n\n<p>\u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0435\u043a\u0440\u0435\u0442:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get secret es-admin -n myelasticsearch -o yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Elasticsearch \u0438 Kibana \u0432 Kubernetes \u0441 \u0440\u043e\u043b\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d<\/h4>\n\n\n\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d&nbsp;myelasticsearch:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: myelasticsearch<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0434\u043b\u044f Elasticsearch<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u043e\u043b\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Kubernetes Secrets.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0420\u043e\u043b\u044c \u0441 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>---\nkind: Secret\napiVersion: v1\nmetadata:\n  name: myelasticsearch-role\n  namespace: myelasticsearch\nstringData:\n  roles.yml: |-\n    myelasticsearch-role:\n      cluster: &#91;'monitor']\n      indices:\n        - names: &#91;'myelasticsearch-*']\n          privileges: &#91; 'all' ]\n        - names: &#91;'myelasticsearch']\n          privileges: &#91; 'all' ]<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u0420\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>---\nkind: Secret\napiVersion: v1\nmetadata:\n  name: viewer-role\n  namespace: myelasticsearch\nstringData:\n  roles.yml: |-\n    viewer-role:\n      cluster: &#91;'monitor']\n      indices:\n        - names: &#91;'*']\n          privileges: &#91;'read', 'view_index_metadata', 'monitor']<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ECK Custom Resources<\/h3>\n\n\n\n<p>ECK Custom Resources \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Elasticsearch \u0438 Kibana \u0432 Kubernetes. ECK Custom Resources \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0440\u043e\u043b\u0438, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 Kibana \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 snapshot-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 Kubernetes, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Elastic-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n\n\n\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Elasticsearch \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c HelmRelease:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: source.toolkit.fluxcd.io\/v1beta1\nkind: HelmRepository\nmetadata:\n  name: eck-custom-resources\n  namespace: myelasticsearch\nspec:\n  interval: 24h\n  url: https:\/\/xco-sk.github.io\/eck-custom-resources\/\n\n---\napiVersion: helm.toolkit.fluxcd.io\/v2\nkind: HelmRelease\nmetadata:\n  name: es-cr-operator\n  namespace: myelasticsearch\nspec:\n  chart:\n    spec:\n      chart: eck-custom-resources-operator\n      version: 0.4.4\n      sourceRef:\n        kind: HelmRepository\n        name: eck-custom-resources\n  interval: 5m\n  releaseName: es-cr-operator\n  values:\n    image:\n      repository: harbor.corp\/dockerhub\/xcosk\/eck-custom-resources\n    elasticsearch:\n      enabled: true\n      url: \"http:\/\/myelasticsearch-es-http:9200\"\n      certificate:\n        secretName: myelasticsearch-es-http-certs-public\n        certificateKey: ca.crt\n      authentication:\n        usernamePasswordSecret:\n          secretName: myelasticsearch-es-elastic-user\n          username: elastic<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Kibana<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: kibana.k8s.elastic.co\/v1\nkind: Kibana\nmetadata:\n  name: kibana\n  namespace: myelasticsearch\nspec:\n  version: 8.14.1\n  count: 1\n  image: harbor.corp\/dockerhub\/elastic\/kibana:8.14.1\n  elasticsearchRef:\n    name: myelasticsearch\n  config:\n    server.publicBaseUrl: https:\/\/kibana-kb-http:5601\n  podTemplate:\n    spec:\n      nodeSelector:\n        role: elasticsearch-master\n      tolerations:\n        - key: role\n          operator: Equal\n          value: elasticsearch-master\n          effect: NoSchedule\n      containers:\n        - name: kibana\n          resources:\n            requests:\n              memory: 500Mi\n            limits:\n              memory: 1Gi<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Ingress \u0434\u043b\u044f Kibana \u0432 Kubernetes<\/h2>\n\n\n\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Ingress \u0434\u043b\u044f Kibana \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Nginx \u0438 TLS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n\n\n\n<p>Ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 HTTP\/HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c&nbsp;<strong>nginx-ingress<\/strong>&nbsp;\u0438&nbsp;<strong>cert-manager<\/strong>&nbsp;\u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Ingress<\/h3>\n\n\n\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 Ingress-\u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f Kibana.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">YAML-\u0444\u0430\u0439\u043b:<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  annotations:\n    cert-manager.io\/cluster-issuer: cluster-issuer\n    # \u0421\u0435\u0440\u0432\u0438\u0441 kibana-kb-http \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 HTTPS, \u043d\u0430 HTTP \u0441\u0442\u043e\u0438\u0442 302 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u043d\u0430 HTTPS\n    nginx.ingress.kubernetes.io\/backend-protocol: HTTPS\n    nginx.ingress.kubernetes.io\/proxy-ssl-verify: \"false\"\n    nginx.ingress.kubernetes.io\/proxy-body-size: 100m\n    nginx.ingress.kubernetes.io\/proxy-connect-timeout: \"100\"\n    nginx.ingress.kubernetes.io\/proxy-send-timeout: \"100\"\n    nginx.ingress.kubernetes.io\/proxy-read-timeout: \"100\"\n    nginx.ingress.kubernetes.io\/proxy-buffering: \"on\"\n  name: myelasticsearch-kibana\n  namespace: myelasticsearch\nspec:\n  ingressClassName: nginx\n  tls:\n    - hosts:\n        - kibana.myelasticsearch.es.k8s.corp\n      secretName: kibana-myelasticsearch-tls\n  rules:\n    - host: kibana.myelasticsearch.es.k8s.corp\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: kibana-kb-http\n                port:\n                  number: 5601<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Elasticsearch \u0432 Kubernetes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Elasticsearch<\/h3>\n\n\n\n<p>\u0424\u0430\u0439\u043b&nbsp;elasticsearch.yaml&nbsp;\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Elasticsearch.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0412\u0435\u0440\u0441\u0438\u044f Elasticsearch:\u00a08.14.1<\/li>\n\n\n\n<li>\u041e\u0431\u0440\u0430\u0437 Docker:\u00a0harbor.corp\/dockerhub\/elastic\/elasticsearch:8.14.1<\/li>\n\n\n\n<li>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f:\u00a0fileRealm\u00a0\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438\u00a0es-admin\u00a0\u0438\u00a0viewer<\/li>\n\n\n\n<li>HTTPS \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a<\/li>\n\n\n\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u00a0podDisruptionBudget\u00a0\u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430:\n<ul class=\"wp-block-list\">\n<li><strong>Master-\u0443\u0437\u043b\u044b<\/strong>\u00a0(3 \u0448\u0442.)<\/li>\n\n\n\n<li><strong>Data-\u0443\u0437\u043b\u044b<\/strong>\u00a0(3 \u0448\u0442.)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u043e\u043b\u043d\u044b\u0439 YAML-\u043a\u043e\u0434 Elasticsearch<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: elasticsearch.k8s.elastic.co\/v1\nkind: Elasticsearch\nmetadata:\n  name: myelasticsearch\n  namespace: myelasticsearch\n  annotations:\n    eck.k8s.elastic.co\/downward-node-labels: \"topology.kubernetes.io\/zone\"\nspec:\n  version: 8.14.1\n  image: harbor.corp\/dockerhub\/elastic\/elasticsearch:8.14.1\n  secureSettings:\n    - secretName: elastic-backup-myelasticsearch-credentials\n  auth:\n    fileRealm:\n      - secretName: es-admin  # \u0424\u0430\u0439\u043b \u0441 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\n      - secretName: viewer-user  # \u0424\u0430\u0439\u043b \u0441 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430\n    roles:\n      - secretName: myelasticsearch-role  # \u0420\u043e\u043b\u0438 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\n      - secretName: viewer-role  # \u0420\u043e\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430\n  http:\n    tls:\n      selfSignedCertificate:\n        disabled: true  # \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430\n  podDisruptionBudget:\n    spec:\n      minAvailable: 2  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438\n      selector:\n        matchLabels:\n          elasticsearch.k8s.elastic.co\/cluster-name: myelasticsearch\n  nodeSets:\n    - name: master\n      count: 3  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0441\u0442\u0435\u0440-\u0443\u0437\u043b\u043e\u0432\n      config:\n        node.roles: &#91;\"master\", \"remote_cluster_client\"]  # \u0420\u043e\u043b\u0438 \u043c\u0430\u0441\u0442\u0435\u0440-\u0443\u0437\u043b\u043e\u0432\n        xpack.monitoring.collection.enabled: true  # \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430\n        s3.client.backups.endpoint: storage.yandexcloud.net\n        s3.client.backups.region: ru-central1\n      podTemplate:\n        spec:\n          initContainers:\n            - name: sysctl\n              securityContext:\n                privileged: true\n                runAsUser: 0\n              command: &#91;\"sh\", \"-c\", \"sysctl -w vm.max_map_count=262144\"]  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438\n          containers:\n            - name: elasticsearch\n              resources:\n                requests:\n                  cpu: 4\n                  memory: 8Gi\n                limits:\n                  cpu: 4\n                  memory: 8Gi\n    - name: data\n      count: 3  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e data-\u0443\u0437\u043b\u043e\u0432\n      config:\n        node.roles:\n          - \"data\"\n          - \"ingest\"\n          - \"ml\"\n          - \"transform\"\n          - \"remote_cluster_client\"\n        s3.client.backups.endpoint: storage.yandexcloud.net\n        s3.client.backups.region: ru-central1\n        xpack.monitoring.collection.enabled: true\n        node.attr.zone: ${ZONE}  # \u0417\u043e\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430\n        cluster.routing.allocation.awareness.attributes: k8s_node_name,zone\n      podTemplate:\n        spec:\n          initContainers:\n            - name: sysctl\n              securityContext:\n                privileged: true\n                runAsUser: 0\n              command: &#91;\"sh\", \"-c\", \"sysctl -w vm.max_map_count=262144\"]\n          containers:\n            - name: elasticsearch\n              env:\n                - name: ZONE\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.annotations&#91;'topology.kubernetes.io\/zone']\n              resources:\n                requests:\n                  cpu: 4\n                  memory: 10Gi  # \u0417\u0430\u043f\u0440\u043e\u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u0442\u0438\u043f\u0430 A\n                limits:\n                  cpu: 4\n                  memory: 10Gi<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Ingress \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Elasticsearch<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 Elasticsearch \u0438\u0437\u0432\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441&nbsp;Ingress:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  annotations:\n    cert-manager.io\/cluster-issuer: cluster-issuer\n    nginx.ingress.kubernetes.io\/ssl-redirect: \"false\"\n    nginx.ingress.kubernetes.io\/proxy-ssl-verify: \"false\"\n    nginx.ingress.kubernetes.io\/proxy-body-size: \"100m\"\n  name: myelasticsearch-elastic\n  namespace: myelasticsearch\nspec:\n  ingressClassName: nginx\n  tls:\n    - hosts:\n        - myelasticsearch.es.k8s.corp  # \u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Elasticsearch\n      secretName: myelasticsearch-tls\n  rules:\n    - host: myelasticsearch.es.k8s.corp\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: myelasticsearch-es-http\n                port:\n                  number: 9200  # \u041f\u043e\u0440\u0442 \u0434\u043b\u044f HTTP-\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Elasticsearch<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 myelasticsearch-index:<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -k -X PUT -u myelasticsearch-user:\u043f\u0430\u0440\u043e\u043b\u044c \\\n\"https:\/\/myelasticsearch.es.k8s.corp\/myelasticsearch-index\" \\\n-H \"Content-Type: application\/json\" -d '{}'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 Elasticsearch \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Prometheus<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Elasticsearch Exporter<\/h3>\n\n\n\n<p>Prometheus Elasticsearch Exporter \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0438\u0437 Elasticsearch \u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 Prometheus. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 Kubernetes, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c&nbsp;HelmRelease&nbsp;\u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0424\u0430\u0439\u043b&nbsp;exporter.yaml<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: helm.toolkit.fluxcd.io\/v2\nkind: HelmRelease\nmetadata:\n  name: myelasticsearch-exporter\n  namespace: myelasticsearch\nspec:\n  chart:\n    spec:\n      chart: prometheus-elasticsearch-exporter\n      version: 5.9.0\n      sourceRef:\n        kind: HelmRepository\n        name: prometheus-community\n        namespace: monitoring\n  interval: 5m\n  releaseName: myelasticsearch-exporter\n  values:\n    env:\n      ES_USERNAME: elastic\n    extraEnvSecrets:\n      ES_PASSWORD:\n        secret: myelasticsearch-es-elastic-user\n        key: elastic\n    es:\n      uri: http:\/\/myelasticsearch-es-http:9200\n      useExistingSecrets: true\n      sslSkipVerify: true\n    secretMounts:\n      - name: elastic-certs # \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u043a elasticsearch \u043f\u043e HTTPS\n        secretName: myelasticsearch-es-http-certs-internal\n        path: \/ssl\n    log:\n      format: json\n    serviceMonitor:\n      enabled: true<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432\u0438\u043b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0432 Prometheus \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c&nbsp;PrometheusRule, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0424\u0430\u0439\u043b&nbsp;prometheus-rules.yaml<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: monitoring.coreos.com\/v1\nkind: PrometheusRule\nmetadata:\n  name: myelasticsearch\n  namespace: myelasticsearch\n  labels:\n    release: prometheus-operator\nspec:\n  groups:\n    - name: ElasticsearchExporter\n      rules:\n        - alert: ElasticsearchExporterDown\n          expr: up{service=~ \".*elasticsearch.*\"} != 1\n          for: 1m\n          labels:\n            severity: warning\n          annotations:\n            summary: Elasticsearch exporter down!\n            description: \"{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute\"\n\n        - alert: ElasticsearchCpuUsageHigh\n          expr: \"elasticsearch_process_cpu_percent &gt; 80\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: Elasticsearch CPU Usage High\n            description: \"The {{ $labels.cluster }} node {{ $labels.name }} CPU usage is over 80% (value {{ $value }})\"\n\n        - alert: ElasticsearchHeapUsageTooHigh\n          expr: '(elasticsearch_jvm_memory_used_bytes{area=\"heap\"} \/ elasticsearch_jvm_memory_max_bytes{area=\"heap\"}) * 100 &gt; 90'\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: Elasticsearch Heap Usage Too High\n            description: \"The {{ $labels.cluster }} node {{ $labels.name }} heap usage is over 90% (value {{ $value }})\"\n\n        - alert: ElasticsearchDiskSpaceLow\n          expr: \"elasticsearch_filesystem_data_available_bytes \/ elasticsearch_filesystem_data_size_bytes * 100 &lt; 20\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: Elasticsearch disk space low\n            description: \"The {{ $labels.cluster }} node {{ $labels.name }} disk usage is over 80% (value {{ $value }})\"\n\n        - alert: ElasticsearchClusterRed\n          expr: 'elasticsearch_cluster_health_status{color=\"red\"} == 1'\n          for: 0m\n          labels:\n            severity: warning\n          annotations:\n            summary: Elasticsearch Cluster Red!\n            description: \"Elastic Cluster {{ $labels.cluster }} is in Red status!\"<\/code><\/pre>\n\n\n\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430: kustomization.yaml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: kustomize.config.k8s.io\/v1beta1\nkind: Kustomization\nresources:\n  - elasticsearch.yaml  # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b Elasticsearch\n  - es-cr-operator.yaml  # \u0424\u0430\u0439\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 Elasticsearch\n  - eso-auth.yaml  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\n  - es-roles.yaml  # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439\n  - exporter.yaml  # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\n  - kibana.yaml  # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Kibana\n  - namespace.yaml  # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d\n  - prometheus-rules.yaml  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f Prometheus<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0411\u0435\u043a\u0430\u043f elasticsearch<\/h3>\n\n\n\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430: snapshot-policy.yaml \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: es.eck.github.com\/v1alpha1  # \u0412\u0435\u0440\u0441\u0438\u044f API \u0434\u043b\u044f Custom Resource Definition\nkind: SnapshotLifecyclePolicy           # \u0422\u0438\u043f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 - \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432\nmetadata:\n  name: myelasticsearch-backup-policy   # \u0418\u043c\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438\n  namespace: myelasticsearch           # \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\nspec:\n  body: |  # \u0422\u0435\u043b\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON\n    {\n      \"schedule\": \"0 2 * * * ?\",        # \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u0432 02:00)\n      \"name\": \"myelasticsearch-snapshot-policy\",  # \u0418\u043c\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0432 Elasticsearch\n      \"repository\": \"myelasticsearch-backup-repository\",  # \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432\n      \"config\": {                       # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432\n        \"indices\": &#91;\"*\"],               # \u041a\u0430\u043a\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c (\u0432\u0441\u0435)\n        \"ignore_unavailable\": false,    # \u041d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b\n        \"include_global_state\": true    # \u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\n      },\n      \"retention\": {                   # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432\n        \"expire_after\": \"14d\",         # \u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b \u0441\u0442\u0430\u0440\u0448\u0435 14 \u0434\u043d\u0435\u0439\n        \"min_count\": 72,               # \u041c\u0438\u043d\u0438\u043c\u0443\u043c 72 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430 (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0435)\n        \"max_count\": 336               # \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 336 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 (\u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0441\u0442\u0430\u0440\u044b\u0435)\n      }\n    }<\/code><\/pre>\n\n\n\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430: snapshot-repository.yaml \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: es.eck.github.com\/v1alpha1  # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e API, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0443\u044e \u0434\u043b\u044f Elasticsearch Operator\nkind: SnapshotRepository  # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043a\u0430\u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432\nmetadata:\n  name: backup-repository  # \u0418\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0431\u044d\u043a\u0430\u043f\u043e\u0432\n  namespace: myelasticsearch  # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c namespace, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\nspec:\n  body: |\n    {\n      \"type\": \"s3\",\n      \"settings\": {\n        \"bucket\": \"elastic-backup\",\n        \"client\": \"backups\"\n      }\n    }<\/code><\/pre>\n\n\n\n<p>\u0413\u0434\u0435 elastic-backup &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 S3-\u0431\u0430\u043a\u0435\u0442\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 backups &#8212; \u0438\u043c\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0432 Elastic \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a S3 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 s3.client.backups.*)<\/p>\n\n\n\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430: kustomization.yaml \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: kustomize.config.k8s.io\/v1beta1\nkind: Kustomization\nresources:\n  - snapshot-policy.yaml\n  - snapshot-repository.yaml<\/code><\/pre>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0433\u043e\u0442\u043e\u0432 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n\n\n\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 Elasticsearch \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Prometheus, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Elasticsearch \u0432 Kubernetes \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0441 master \u0438 data-\u0443\u0437\u043b\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 Ingress \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Elasticsearch \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0430\u044f \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Elasticsearch \u0432 Kubernetes \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ECK (Elastic Cloud on Kubernetes), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1582,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[361,33,31,30,207],"class_list":["post-1581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-likbez","tag-elasticsearch","tag-fluxcd","tag-k8s","tag-kubernetes","tag-prometheus","entry-card--wide"],"_links":{"self":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/1581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1581"}],"version-history":[{"count":1,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/1581\/revisions"}],"predecessor-version":[{"id":1583,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/1581\/revisions\/1583"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/media\/1582"}],"wp:attachment":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}