feat(security): External Secrets Operator + ClusterSecretStore на Vault

This commit was merged in pull request #8.
This commit is contained in:
2026-09-17 18:15:35 +00:00
committed by grachevko
parent 05d44d2e51
commit 07c32f9f79
7 changed files with 141 additions and 0 deletions
@@ -0,0 +1,26 @@
---
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
name: vault
spec:
provider:
vault:
# Внутрикластерный адрес, а не https://vault.<домен>: Vault слушает без TLS
# (tls_disable), а поход через шлюз потребовал бы ещё и доверия к internal-ca
# внутри ESO. Снаружи UI остаётся на https через envoy.
server: http://vault.security.svc:8200
path: kv
version: v2
auth:
kubernetes:
mountPath: kubernetes
role: eso
# Service account оператора: имя и namespace должны совпадать с
# bound_service_account_names/namespaces роли eso в Vault.
serviceAccountRef:
name: external-secrets
namespace: security
# Vault 1.21+ требует audience в роли, ESO по умолчанию просит "vault".
audiences:
- vault
@@ -0,0 +1,30 @@
---
# Проверочный ExternalSecret: доказывает всю цепочку ESO -> kubernetes-auth ->
# Vault -> Secret в кластере. Значение кладётся в Vault командой
# vault kv put kv/demo username=demo password=s3cr3t
# (key в ExternalSecret указывается без префикса path: demo -> kv/data/demo).
# Когда появятся настоящие потребители (токен вебхука Flux и приложения),
# этот объект можно удалить.
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: vault-smoke
namespace: security
spec:
refreshInterval: 1h
secretStoreRef:
name: vault
kind: ClusterSecretStore
target:
name: vault-smoke
creationPolicy: Owner
deletionPolicy: Retain
data:
- secretKey: username
remoteRef:
key: demo
property: username
- secretKey: password
remoteRef:
key: demo
property: password
@@ -0,0 +1,36 @@
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: external-secrets
spec:
interval: 1h
chartRef:
kind: OCIRepository
name: external-secrets
install:
crds: CreateReplace
upgrade:
crds: CreateReplace
cleanupOnFail: true
remediation:
retries: 3
# Оператор без состояния: переустановка с нуля безопасна, поэтому при
# падении апгрейда релиз снимается и ставится заново, а не залипает.
strategy: uninstall
values:
replicaCount: 1
# CRD ставит и обновляет сам чарт.
installCRDs: true
# Валидирующий вебхук и его certController включены: сертификаты чарт
# выпускает и продлевает сам, cert-manager для этого не нужен.
webhook:
create: true
certController:
create: true
resources:
requests:
cpu: 10m
memory: 64Mi
limits:
memory: 256Mi
@@ -0,0 +1,8 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./ocirepository.yaml
- ./helmrelease.yaml
- ./clustersecretstore.yaml
- ./externalsecret.yaml
@@ -0,0 +1,15 @@
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: OCIRepository
metadata:
name: external-secrets
spec:
interval: 15m
layerSelector:
mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
operation: copy
ref:
# Версия чарта external-secrets (равна appVersion). Релизы чарта тегируются
# как helm-chart-<version>, в ghcr публикуется тег без префикса.
tag: 2.10.0
url: oci://ghcr.io/external-secrets/charts/external-secrets