实现在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的步骤如下:

  1. 添加Secrets Store CSI Driver的存储库:

    helm repo add secrets-store-csi-driver 
    
  2. 安装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对象的步骤如下:

  1. 创建一个包含敏感数据的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的角色。

  2. 创建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