如何配置k8s etcd使用vault加密secret
时间: 2025-06-04 13:43:27 浏览: 17
<think>好的,我现在需要帮用户解答如何配置Kubernetes的etcd使用Vault来加密Secret。这个问题看起来有点复杂,我需要仔细理清楚步骤,确保没有遗漏关键点。首先,我应该回忆一下Kubernetes中etcd的作用,以及如何对存储的数据进行加密。
用户提到的是使用Vault来加密,而不是Kubernetes自带的静态加密。可能用户已经了解Kubernetes的EncryptionConfiguration,但想用Vault作为KMS提供商。所以,这可能涉及到Kubernetes的KMS插件机制,以及Vault的配置。
首先,我需要确认Kubernetes支持通过KMS插件进行数据加密。是的,从1.10版本开始,Kubernetes支持使用KMS提供商进行加密。而Vault可以作为KMS的一个选项,但需要配置相关的插件或者集成。
接下来,步骤可能包括:安装和配置Vault,配置Vault的密钥,设置Kubernetes的EncryptionConfiguration指向Vault的KMS插件,然后重启相关组件。不过可能需要更多的细节,比如如何部署Vault,是否使用现有的,或者需要安装到集群中?
然后,关于KMS插件的实现,可能需要使用一个gRPC服务器,作为Kubernetes API服务器和Vault之间的桥梁。比如,Hashicorp Vault可能有相关的插件或者需要自行实现这个接口。比如,Kubernetes社区是否有现成的Vault KMS插件?或者需要用户自己开发?
这里可能需要使用一个KMS插件实现,比如参考Kubernetes的示例,或者查找开源项目。例如,kubernetes-sigs下的kms-vault项目可能是一个可行的选择。或者,用户可能需要自己编写一个gRPC服务,调用Vault的加密API。
假设存在一个现成的插件,比如kms-vault,那么步骤可能包括部署这个插件,配置它连接Vault,然后配置EncryptionConfiguration。但是,如果用户需要手动设置,可能需要详细说明如何搭建这个中间层。
另外,需要考虑Vault的安装和配置,包括启用transit引擎,创建加密密钥,设置访问策略等。这部分需要详细步骤,比如使用vault命令启用transit引擎,创建密钥,生成令牌供KMS插件使用。
然后,配置EncryptionConfiguration文件,指定使用kms提供程序,并指向本地的Unix socket或者某个服务的地址,这个地址是KMS插件监听的。接着,需要重启kube-apiserver,或者如果是kubeadm部署的集群,可能需要更新manifest文件,并重新启动apiserver的Pod。
还有,需要确保所有控制平面节点上的apiserver都应用了这个配置,特别是etcd运行在多个节点的情况下。此外,测试加密是否生效,比如创建Secret,检查etcd中的数据是否加密。
可能遇到的问题包括:插件无法连接Vault,权限问题,配置错误,apiserver无法加载EncryptionConfiguration等。这时候需要检查日志,如kube-apiserver的日志,或者插件的日志。
另外,用户可能想知道如何验证配置是否成功。比如,使用etcdctl查看存储的数据是否为加密的,或者检查apiserver的日志中是否有成功加载KMS配置的信息。
总结一下,步骤大概是:
1. 安装并配置Vault,启用transit引擎,创建加密密钥,设置策略和认证方式(如AppRole)。
2. 部署KMS插件,例如kms-vault,配置它连接Vault的地址、令牌等信息。
3. 创建Kubernetes的EncryptionConfiguration,指定使用kms提供程序,并指向插件的Unix socket。
4. 将EncryptionConfiguration应用到所有kube-apiserver实例,并重启它们。
5. 验证配置是否生效,例如创建Secret并检查etcd中的内容是否加密。
需要注意的细节包括:插件的部署方式(作为DaemonSet或静态Pod),Vault的高可用性,插件与Vault之间的TLS配置,以及如何处理插件故障对Kubernetes的影响。
另外,可能还需要考虑密钥轮换、插件更新等问题,但用户可能暂时不需要这些高级内容。需要确保步骤清晰,并提醒用户在实际操作时注意备份和测试环境验证。</think>以下是配置 Kubernetes 使用 **Vault 加密 etcd 中 Secret** 的步骤指南,通过 Kubernetes 的 KMS 插件机制实现:
---
### **1. 准备工作**
- **环境要求**:
- Kubernetes 集群(v1.10+,推荐最新稳定版)。
- Vault 服务(已部署且可被 Kubernetes 访问)。
- 集群控制节点的 `kube-apiserver` 可访问 Vault。
---
### **2. 配置 Vault**
#### **2.1 启用 Vault Transit 引擎**
```bash
vault secrets enable transit
```
#### **2.2 创建加密密钥**
```bash
vault write -f transit/keys/k8s-encryption-key
```
#### **2.3 配置访问策略**
创建策略文件 `k8s-encryption-policy.hcl`:
```hcl
path "transit/encrypt/k8s-encryption-key" {
capabilities = ["update"]
}
path "transit/decrypt/k8s-encryption-key" {
capabilities = ["update"]
}
```
应用策略:
```bash
vault policy write k8s-encryption k8s-encryption-policy.hcl
```
#### **2.4 生成认证令牌(或使用 AppRole)**
```bash
vault token create -policy=k8s-encryption -format=json | jq -r .auth.client_token
```
保存输出的 Token,后续插件将使用它访问 Vault。
---
### **3. 部署 KMS 插件**
Kubernetes 需要与 Vault 通信的 **KMS 插件**(需实现 gRPC 服务)。可使用开源项目如 **[kms-vault](https://github.com/sercanarga/kms-vault)** 或自行开发。
#### **示例:使用 kms-vault**
1. **下载插件二进制**:
```bash
wget https://github.com/sercanarga/kms-vault/releases/download/v0.1.0/kms-vault
chmod +x kms-vault
```
2. **创建配置文件 `/etc/kms-vault/config.yaml`**:
```yaml
vault:
address: "http://vault-server:8200"
token: "YOUR_VAULT_TOKEN"
key: "k8s-encryption-key"
mount: "transit"
```
3. **启动插件(以 Systemd 服务为例)**:
```bash
/path/to/kms-vault --config=/etc/kms-vault/config.yaml --socket=/var/run/kms-vault.sock
```
插件会监听 Unix socket `/var/run/kms-vault.sock`。
---
### **4. 配置 Kubernetes Encryption**
#### **4.1 创建 EncryptionConfiguration**
创建文件 `/etc/kubernetes/enc/encryption-config.yaml`:
```yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- kms:
name: vault-kms
endpoint: unix:///var/run/kms-vault.sock
cachesize: 1000
timeout: 3s
- identity: {} # 允许未加密资源回退(可选)
```
#### **4.2 修改 kube-apiserver 配置**
- **kubeadm 集群**:
编辑 `/etc/kubernetes/manifests/kube-apiserver.yaml`,添加:
```yaml
spec:
containers:
- command:
- --encryption-provider-config=/etc/kubernetes/enc/encryption-config.yaml
volumeMounts:
- name: enc-config
mountPath: /etc/kubernetes/enc
- name: kms-socket
mountPath: /var/run/kms-vault.sock
volumes:
- name: enc-config
hostPath:
path: /etc/kubernetes/enc
- name: kms-socket
hostPath:
path: /var/run/kms-vault.sock
type: Socket
```
- **重启 kube-apiserver**:
修改后,kubelet 会自动重启 Pod。
---
### **5. 验证加密**
#### **5.1 创建测试 Secret**
```bash
kubectl create secret generic test-secret --from-literal=key=supersecret
```
#### **5.2 检查 etcd 数据**
使用 `etcdctl` 查看数据是否加密:
```bash
ETCDCTL_API=3 etcdctl --endpoints=https://etcd-node:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/test-secret
```
若输出包含 `k8s:enc:kms:v1:vault-kms` 前缀,表示加密成功。
---
### **6. 注意事项**
- **插件高可用**:确保 KMS 插件多副本部署,避免单点故障。
- **Vault 可用性**:若 Vault 不可用,Kubernetes 可能无法读取加密数据。
- **密钥轮换**:通过 Vault 管理密钥生命周期,定期轮换密钥。
- **备份 EncryptionConfiguration**:丢失配置可能导致数据无法解密。
---
通过以上步骤,Kubernetes 将使用 Vault 动态加密 etcd 中的 Secret 数据,提升集群安全性。建议在生产环境中提前验证并备份关键数据。
阅读全文
相关推荐

















