External Secrets Operator 外部密钥同步
External Secrets Operator(ESO)把 Vault、AWS Secrets Manager、阿里云 KMS、腾讯云 Secret Manager 等外部密钥同步成 Kubernetes Secret。它支持自动刷新、模板、命名空间隔离和 PushSecret。
核心资源:SecretStore、ClusterSecretStore、ExternalSecret、PushSecret 和 SecretStore 的 provider 配置。
安装:
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
--namespace external-secrets --create-namespace
kubectl -n external-secrets get pods
创建 SecretStore(以 Vault 为例):
kubectl apply -f - <<'EOF'
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault
namespace: demo
spec:
provider:
vault:
server: https://vault.example.com
path: secret
version: v2
auth:
kubernetes:
mountPath: kubernetes
role: demo
EOF
创建 ExternalSecret:
kubectl apply -f - <<'EOF'
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db
namespace: demo
spec:
refreshInterval: 1h
secretStoreRef:
name: vault
kind: SecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: demo/db
property: password
EOF
查看同步状态:
kubectl get externalsecret -n demo
kubectl describe externalsecret db -n demo
kubectl get secret db-secret -n demo
使用 ClusterSecretStore 跨命名空间:
kubectl apply -f - <<'EOF'
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: vault-global
spec:
provider:
vault:
server: https://vault.example.com
path: secret
version: v2
auth:
kubernetes:
mountPath: kubernetes
role: global
EOF
remoteRef.key 的路径对 KV v2 要省略 data/,版本和路径写法容易错。refreshInterval 太长会导致密钥轮换后应用长时间使用旧值。kubectl get externalsecret -A — 查看同步对象kubectl describe externalsecret — 查看失败原因kubectl get secretstore,clustersecretstore — 查看存储配置kubectl logs -n external-secrets deploy/external-secrets — 控制器日志vault / aws secretsmanager — 核对远端密钥