K8s Secrets管理方案介绍(K8s密钥管理方案)etcd、Sealed Secrets(kubeseal、ArgoCD)、ESO、HashiCorp Vault、CSI
文章目录
0. 前言
在 Kubernetes 发展过程中,Secrets 一直是一个争议点:
- Kubernetes 原生 Secret 并不是真正意义上的“安全存储”
- Base64 不是加密,只是编码
- Secret 会出现在 etcd、节点内存、Pod 环境变量等多个位置
- 企业环境通常不会直接使用原生 Secret
因此围绕 Secret 管理,逐渐形成了几种主流方案。
1. Kubernetes 原生 Secret
最基础的方案。
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: cGFzc3dvcmQ=
Pod 中引用:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
优点:
- Kubernetes 内置
- 配置简单
- 无额外组件
缺点:
- Base64 不是加密
- Secret 默认存储于 etcd(etc distribution 分布式配置)(etcd 是一个分布式、高可用的键值(Key-Value)存储系统,在 Kubernetes 中,etcd 是整个集群的核心数据存储,被称为 Kubernetes 的"大脑"或"注册表")
- 运维人员容易获取
- GitOps 不方便管理
适合:
- 开发环境
- 测试环境
- 小型项目
2. etcd Encryption
Kubernetes 官方提供的静态加密方案。
开启后:
Secret
↓
API Server
↓ 加密
etcd
配置 EncryptionConfiguration:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-key>
优点:
- 官方支持
- 部署简单
- 防止直接读取 etcd
缺点:
- Key 仍需自行管理
- API Server 解密后依然明文
- 无法解决 Git 泄漏问题
适合:
- 所有生产环境
基本可以视为最低安全要求。
3. Sealed Secrets
基本介绍
由 Bitnami 提出。
核心思想:
Secret
↓
kubeseal
↓
SealedSecret
↓ Git
开发者:
kubeseal < secret.yaml > sealed-secret.yaml
生成:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
提交 Git:
Git
↓
ArgoCD
↓
Cluster
↓
Secret
优点:
- Git 中存储密文
- GitOps 友好
- 使用简单
缺点:
- 私钥保存在集群
- 集群迁移复杂
- 多集群管理麻烦
适合:
- ArgoCD(ArgoCD 是一个基于 GitOps 模式 的 Kubernetes 持续交付(CD)工具,主要用于自动化管理 Kubernetes 集群中的应用部署与配置同步,以 Git 为唯一可信源)
- Flux
- GitOps 场景
为什么需要 Sealed Secrets?
在传统的 Kubernetes 部署中,Secrets 是 base64 编码的,并不是加密的。如果直接将 Secret YAML 文件提交到 Git 仓库,任何有仓库访问权限的人都能看到敏感信息(如数据库密码、API 密钥等)。
Sealed Secrets 就是为了解决这个问题而设计的。
完整工作流程详解
1. 本地加密阶段(开发者操作)
# 1. 首先创建一个普通的 Secret 文件
cat > secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: default
data:
password: $(echo -n "my-super-secret-password" | base64)
EOF
# 2. 使用 kubeseal 命令加密
kubeseal < secret.yaml > sealed-secret.yaml
关键点:
kubeseal会从 Kubernetes 集群获取公钥- 用这个公钥加密 Secret 的内容
- 生成的
sealed-secret.yaml可以安全地提交到 Git
生成的文件类似:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: my-secret
namespace: default
spec:
encryptedData:
password: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq...
template:
metadata:
name: my-secret
namespace: default
2. Git 存储阶段
sealed-secret.yaml → Git 仓库
安全性:
- Git 中只存储加密后的密文
- 没有私钥,任何人(包括 Git 仓库管理员)都无法解密
- 可以像普通代码一样进行代码审查、版本控制
3. 部署阶段(GitOps 工具)
Git 仓库
↓ (通过 ArgoCD/Flux 监控)
Kubernetes 集群
↓ (Sealed Secrets 控制器监听)
SealedSecret 资源
4. 解密阶段(集群内部)
SealedSecret 资源
↓ (集群内的 Sealed Secrets 控制器)
自动解密
↓
生成原始 Secret
核心机制:
- 集群中运行一个 Sealed Secrets 控制器
- 该控制器持有私钥(这个私钥永远不离开集群)
- 当检测到新的 SealedSecret 时,控制器用私钥解密
- 自动生成对应的 Kubernetes Secret
为什么这种设计是安全的?
安全边界划分
- 开发者机器:有公钥,可以加密,但无法解密
- Git 仓库:只有密文,没有任何解密能力
- Kubernetes 集群:持有私钥,可以解密,但私钥永不外泄
权限控制
- 开发者只需要权限创建 SealedSecret 资源
- 他们不需要直接访问 Secret 资源
- 集群管理员控制私钥的生命周期
与传统方法的对比
传统方式(不安全):
Secret (明文base64) → Git → ArgoCD → Secret
❌ 问题:Git 中存储的是可逆的 base64 编码,等同于明文
Sealed Secrets 方式:
Secret → kubeseal (加密) → SealedSecret (密文) → Git → 集群 (解密) → Secret
✅ 优势:Git 中只有真正的加密数据,无法被解密
多集群管理问题
你提到的缺点确实存在:
问题场景:
- 每个集群有自己独立的密钥对
- 同一个 SealedSecret 不能在多个集群使用
- 集群迁移时,旧的 SealedSecret 无法在新集群解密
解决方案:
- 使用相同密钥:在多个集群间同步私钥(有安全风险)
- 范围策略:使用
--scope参数指定作用范围kubeseal --scope cluster-wide < secret.yaml > sealed-secret.yaml - 命名空间管理:为每个环境(dev/staging/prod)使用不同的集群
实际使用示例
开发者日常流程:
# 1. 更新敏感配置
echo "new-password" | kubectl create secret generic db-secret \
--dry-run=client --from-file=password=/dev/stdin -o yaml > secret.yaml
# 2. 加密
kubeseal --controller-name=sealed-secrets < secret.yaml > sealed-secret.yaml
# 3. 提交到 Git
git add sealed-secret.yaml
git commit -m "Update database password"
git push
为什么适合 GitOps?
- 声明式配置:SealedSecret 是声明式的 Kubernetes 资源
- 版本控制:所有变更都有 Git 历史记录
- 自动化:ArgoCD/Flux 可以自动同步和部署
- 审计追踪:谁在何时修改了什么密钥,一目了然
- 环境一致性:不同环境使用相同的部署流程
总结
Sealed Secrets 的核心价值在于:将敏感数据的加密责任从人类转移到了系统。开发者不需要记住复杂的加密流程,只需要一个简单的命令;运维人员不需要担心 Git 仓库泄露导致的敏感信息泄露;安全团队可以确信私钥始终在受控的集群环境中。
虽然它有私钥管理、多集群支持等挑战,但在大多数中小型团队的 GitOps 实践中,它仍然是目前最实用、最安全的秘密管理方案之一。
4. External Secrets Operator (ESO)
近几年最流行的方案之一。
项目:External Secrets Operator
架构:
AWS Secrets Manager
HashiCorp Vault
Azure Key Vault
Google Secret Manager
↓
External Secrets Operator
↓
Kubernetes Secret
示例:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
spec:
secretStoreRef:
name: vault
data:
- secretKey: password
remoteRef:
key: prod/db/password
同步后:
Vault
↓
ESO
↓
Secret
优点:
- Secret 不进入 Git
- 支持多种 Secret Backend
- 云原生生态成熟
- GitOps 友好
缺点:
- Secret 最终仍会生成 K8s Secret
- 需要额外 Operator
适合:
- 大多数企业生产环境
目前很多团队已经把 ESO 作为默认方案。
5. HashiCorp Vault
业界最知名的 Secrets 管理平台。
HashiCorp Vault
架构:
Application
↓
Vault Agent
↓
Vault Server
Vault 可以:
- 存储 Secret
- 动态生成数据库账号
- 动态生成云账号
- 自动轮换密码
例如:
App
↓
请求 PostgreSQL 凭证
↓
Vault
↓
返回临时账号
↓
30分钟后自动失效
优点:
- 企业级
- 支持动态 Secret
- 完整审计日志
- 细粒度权限控制
缺点:
- 运维复杂
- 学习成本高
- 高可用部署较重
适合:
- 金融
- 大型企业
- 高安全场景
6. Vault Agent Injector
Vault 在 Kubernetes 中最经典的落地方式。
工作流程:
Pod 创建
↓
Admission Webhook
↓
注入 Vault Agent Sidecar
↓
从 Vault 拉取 Secret
↓
写入共享 Volume
Pod:
annotations:
vault.hashicorp.com/agent-inject: "true"
最终:
Vault
↓
Agent
↓
tmpfs
↓
Application
优点:
- Secret 不经过 Git
- Secret 不写入 etcd
- 支持动态更新
缺点:
- 每个 Pod 多一个 Sidecar
- 资源开销较大
7. Secrets Store CSI Driver
Container Storage Interface(容器存储接口)
目前云厂商最推荐的方案之一。
项目:
Secrets Store CSI Driver
架构:
AWS Secrets Manager
Azure Key Vault
Vault
GCP Secret Manager
↓
CSI Driver
↓
Pod Volume
Pod:
volumeMounts:
- name: secrets-store
挂载后:
/mnt/secrets/password
优点:
- Secret 不进入 etcd
- 不创建 Kubernetes Secret
- 原生 CSI 生态
- 自动轮换支持较好
缺点:
- 应用需读取文件
- 兼容性依赖 Provider
适合:
- 云原生环境
- 安全要求较高场景
8. 云厂商托管方案
各大云基本都有自己的 Secret 服务:
| 云厂商 | 服务 |
|---|---|
| Amazon Web Services | AWS Secrets Manager |
| Google Cloud | Google Secret Manager |
| Microsoft | Azure Key Vault |
| Alibaba Cloud | Alibaba Cloud KMS |
通常配合:
- ESO
- CSI Driver
使用。
演进路线
很多团队都会经历类似路径:
阶段1
K8s Secret
阶段2
K8s Secret + etcd Encryption
阶段3
Sealed Secrets
阶段4
External Secrets Operator
阶段5
Vault / 云 Secret Manager
阶段6
Vault + CSI Driver
或
Cloud Secret Manager + CSI Driver
当前主流推荐
如果是 2026 年的新项目:
个人项目 / 小团队
K8s Secret
+
etcd Encryption
足够。
中大型企业
External Secrets Operator
+
AWS Secrets Manager
或者
External Secrets Operator
+
Vault
这是目前最常见的组合。
高安全要求
Vault
+
Secrets Store CSI Driver
这样 Secret 可以做到:
Git 中没有
etcd 中没有
镜像中没有
仅在 Pod 运行期间以内存文件形式存在,是 Kubernetes Secret 管理体系中安全性较高的一种实现方式。
更多推荐
所有评论(0)