实现在Kubernetes上使用“Vault with Secrets Store CSI Driver”
概述
在Kubernetes集群中使用Vault with Secrets Store CSI Driver可以实现对敏感数据(如密码、证书等)的安全存储和动态管理。本文将指导新手开发者如何在Kubernetes上实现这一功能。
流程图
flowchart TD
A(创建Vault服务) --> B(配置Vault)
B --> C(安装Secrets Store CSI Driver)
C --> D(创建Kubernetes Secret Provider对应的Secret对象)
D --> E(在应用程序中使用Secret)
详细步骤
1. 创建Vault服务
首先,我们需要在Kubernetes集群中创建一个Vault服务。Vault是一个用于安全访问敏感数据的工具,可以用于存储和管理这些数据。可以使用以下命令创建Vault服务:
kubectl create namespace vault
helm repo add hashicorp
helm install vault hashicorp/vault --namespace vault
2. 配置Vault
创建好Vault服务后,我们需要配置Vault以便与Kubernetes集群进行集成,并允许使用Secrets Store CSI Driver来访问Vault中的数据。
kubectl exec -it vault-0 -- vault login
登录Vault,并执行以下命令以启用Kubernetes验证:
kubectl exec -it vault-0 -- vault auth enable kubernetes
接下来,我们需要为Vault创建一个Kubernetes服务账户,并为其分配适当的角色和策略:
kubectl apply -f vault-service-account.yaml
kubectl apply -f vault-cluster-role-binding.yaml
在上述命令中,vault-service-account.yaml
文件定义了一个Kubernetes服务账户,vault-cluster-role-binding.yaml
文件定义了将该账户与适当的角色和策略绑定。
3. 安装Secrets Store CSI Driver
在配置好Vault后,我们需要安装并配置Secrets Store CSI Driver,使其能够访问Vault并将其中的数据以Kubernetes Secret的形式提供给应用程序。
安装Secrets Store CSI Driver的步骤如下:
-
添加Secrets Store CSI Driver的存储库:
helm repo add secrets-store-csi-driver
-
安装Secrets Store CSI Driver:
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver --set enableSecretRotation=true
4. 创建Kubernetes Secret Provider对应的Secret对象
在安装并配置好Secrets Store CSI Driver后,我们可以创建一个Kubernetes Secret Provider对应的Secret对象,用于指定需要从Vault中获取的敏感数据。
创建Secret对象的步骤如下:
-
创建一个包含敏感数据的YAML文件,如
my-secrets.yaml
:apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: vault-secrets spec: provider: vault parameters: vaultAddress: "http://vault:8200" vaultRole: "my-role"
在上述文件中,
vaultAddress
参数指定了Vault服务的地址,vaultRole
参数指定了用于访问Vault的角色。 -
创建SecretProviderClass对象:
kubectl apply -f my-secrets.yaml
5. 在应用程序中使用Secret
现在,我们可以在应用程序中使用上一步创建的Secret对象,从Vault中获取敏感数据。
以下是一个示例应用程序的代码,用于从Vault中获取数据库密码并在应用程序中使用:
import os
db_password = os.getenv("DB_PASSWORD")
print("Database password:", db_password)
在上述代码中,我们使用了os.getenv
函数来获取名为DB_PASSWORD
的环境变量,该环境变量包含了从Vault中获取的数据库密码。
序列图
sequenceDiagram
participant App
participant SecretsStoreCSI
participant Vault
participant K8s
App->SecretsStoreCSI: Get secret
SecretsStoreCSI->Vault: Retrieve secret from Vault
Vault-->SecretsStoreCSI: Secret
SecretsStoreCSI-->App: Secret
App->K8s: Retrieve secret from SecretsStoreCSI