将 Secret Manager 插件与 Google Kubernetes Engine 搭配使用

Secret Manager 与 Google Kubernetes Engine (GKE) 之间的集成 可让您存储 GKE 使用的密码和证书等敏感数据 以 Secret Manager 的形式将集群作为 Secret。

本页介绍了如何使用 Secret Manager 插件 访问存储在 Secret Manager 中的 Secret(作为 Kubernetes Pod 中装载的卷)。

此过程包括以下步骤:

  1. 在新的或现有的设备上安装 Secret Manager 插件 GKE 集群。
  2. 配置应用以向 Secret Manager API 进行身份验证。
  3. 使用 SecretProviderClass YAML 文件定义要装载到 Kubernetes Pod 上的 Secret。
  4. 创建一个卷,用于装载 Secret。挂接该卷后 容器中的应用可以访问容器文件系统中的数据。

Secret Manager 插件衍生自开源 Kubernetes Secrets Store CSI 驱动程序 以及 Google Secret Manager 提供方。 如果您使用开源 Secrets Store CSI 驱动程序来访问 Secret, 您可以改用 Secret Manager 插件有关详情,请参阅 从现有的 Secrets Store CSI 驱动程序迁移

优势

Secret Manager 插件具有以下优势:

  • 您可以使用受支持的全代管式解决方案访问 Secret Manager 在 GKE 内管理密文,而无需产生任何运维开销。
  • 您无需编写自定义代码即可访问存储在 Secret Manager 中的 Secret。
  • 您可以在 Secret Manager 中集中存储和管理所有 Secret 并使用 Secret Manager 插件。这样,您就可以使用由 Google 提供的 Secret Manager,例如 CMEK 加密、精细的访问权限控制, 代管式轮替、生命周期管理和审核日志,以及 Kubernetes 功能,例如以 已装载的卷
  • 标准集群和 Autopilot 集群都支持 Secret Manager 插件。
  • Secret Manager 插件支持 linux/arm64linux/amd64 部署。

限制

此 Secret Manager 的预览版 插件不支持开源软件中提供的以下功能, Secrets Store CSI 驱动程序:

准备工作

  • 启用 Secret Manager and Google Kubernetes Engine API。

    启用 API

  • 如果您要使用 Google Cloud CLI 执行此任务,请安装 然后初始化 gcloud CLI。如果您 已安装 gcloud CLI,请运行以下命令获取最新版本: gcloud components update 命令。

  • 确保您的集群运行 GKE 1.29 或更高版本, Linux 节点映像Secret Manager 插件不支持 Windows 服务器节点。

安装 Secret Manager 插件

您可以在两个标准集群上安装 Secret Manager 插件 以及 Autopilot 集群。确保 GKE 工作负载身份联合已 标准集群上启用的自动扩缩器。适用于 GKE 的工作负载身份联合现为 在 Autopilot 集群上默认启用。Kubernetes Pod 使用工作负载身份 向 Secret Manager API 进行身份验证。

在新的 GKE 集群上安装 Secret Manager 插件

如需在创建集群时安装 Secret Manager 插件,请执行以下操作: 请按以下步骤操作:

标准集群

  • 如需在新虚拟机上启用 Secret Manager 插件,请执行以下操作: Standard 集群,请运行以下命令:

    gcloud beta container clusters create CLUSTER_NAME \
        --enable-secret-manager \
        --location=LOCATION \
        --cluster-version=VERSION \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • LOCATION:集群的 Compute Engine 区域或可用区。
    • VERSION:使用 GKE 存储分区 资源。确保您的集群运行 GKE 版本 1.29 或更高版本。如果默认 发布渠道 不包含此版本,请使用 --release-channel 标志选择一个 发布渠道
    • PROJECT_ID:您的 Google Cloud 项目的 ID。

Autopilot 集群

  • 如需在服务器上启用 Secret Manager 插件,请执行以下操作: 新的 Autopilot 集群时,请运行以下命令:

    gcloud beta container clusters create-auto CLUSTER_NAME \
        --enable-secret-manager \
        --cluster-version=VERSION \
        --location=LOCATION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • VERSION:使用 GKE 存储分区 资源。确保您的集群运行 GKE 版本 1.29 或更高版本。如果默认的发布渠道 不包含此版本,请使用 --release-channel 标志选择一个 发布渠道
    • LOCATION:集群的区域,例如 us-central1

启用 Secret Manager 插件后, 可以使用驱动程序在 Kubernetes 卷中使用 Secrets Store CSI 驱动程序 预配工具名称:secrets-store-gke.csi.k8s.io

在现有 GKE 集群上安装 Secret Manager 插件

如需在现有集群上启用 Secret Manager 插件,请执行以下操作: 运行以下命令:

  gcloud beta container clusters update CLUSTER_NAME \
      --enable-secret-manager \
      --location=LOCATION

替换以下内容:

  • CLUSTER_NAME:现有集群的名称
  • LOCATION:以下各项的区域: 例如 us-central1

配置应用以向 Secret Manager API 进行身份验证

Google Secret Manager 提供方使用工作负载身份 向该 Pod 进行身份验证时装载密钥的 Secret Manager API。要允许您的应用向 Secret Manager API 和适用于 GKE 的工作负载身份联合,请按照以下步骤操作:

  • 创建新的 Kubernetes 服务账号 或使用任意命名空间(包括 默认 Kubernetes ServiceAccount

  • 在 Secret Manager 中为 Secret 创建 Identity and Access Management (IAM) 允许政策。

使用所配置的 Kubernetes ServiceAccount 的 Pod 会自动进行身份验证 作为 IAM 主账号标识符,它对应于 Kubernetes ServiceAccount(访问 Secret Manager API 时)。

创建新的 Kubernetes ServiceAccount

  1. 将以下清单保存为 service-account.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    

    替换以下内容:

    • KSA_NAME:新 Kubernetes ServiceAccount 的名称
    • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
  2. 应用清单:

    kubectl apply -f service-account.yaml
    
  3. 创建引用新 Kubernetes 的 IAM 允许政策 ServiceAccount 并向其授予访问密钥的权限:

    gcloud secrets add-iam-policy-binding SECRET_NAME \
        --role=roles/secretmanager.secretAccessor \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
    

    替换以下内容:

    • SECRET_NAME:Secret Manager 中 Secret 的名称
    • PROJECT_NUMBER:您的 Google Cloud 数字项目编号
    • PROJECT_ID:包含您的 GKE 集群的 Google Cloud 项目的 ID
    • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
    • KSA_NAME:现有 Kubernetes ServiceAccount 的名称

使用现有的 Kubernetes ServiceAccount

创建引用现有 Kubernetes 的 IAM 允许政策 ServiceAccount 并向其授予访问密钥的权限:

gcloud secrets add-iam-policy-binding SECRET_NAME \
    --role=roles/secretmanager.secretAccessor \
    --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME

替换以下内容:

  • SECRET_NAME:Secret Manager 中 Secret 的名称
  • PROJECT_NUMBER:您的 Google Cloud 数字项目编号
  • PROJECT_ID:包含您的 GKE 集群的 Google Cloud 项目的 ID
  • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
  • KSA_NAME:现有 Kubernetes ServiceAccount 的名称

定义要装载的 Secret

要指定在 Kubernetes Pod 中作为文件装载的 Secret,请创建一个 SecretProviderClass YAML 清单,并列出要装载的密钥及其文件名 以其形式装载请按照以下步骤操作:

  1. 将以下清单保存为 app-secrets.yaml

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: SECRET_PROVIDER_CLASS_NAME
    spec:
      provider: gke
      parameters:
        secrets: |
          - resourceName: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION"
            path: "FILENAME.txt"
    

    替换以下内容:

    • SECRET_PROVIDER_CLASS_NAMESecretProviderClass 对象的名称
    • PROJECT_ID:您的项目 ID
    • SECRET_NAME:Secret 名称
    • SECRET_VERSION:密钥版本
    • FILENAME.txt:密钥值将使用的文件名 已装载。您可以使用 resourceNamepath 创建多个文件 变量。
  2. 应用清单:

    kubectl apply -f app-secrets.yaml
    
  3. 验证 SecretProviderClass 对象是否已创建:

    kubectl get SecretProviderClasses
    

配置将装载 Secret 的卷

  1. 将以下配置保存为 my-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: default
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - image: IMAGE_NAME
        imagePullPolicy: IfNotPresent
        name: POD_NAME
        resources:
          requests:
            cpu: 100m
        stdin: true
        stdinOnce: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        tty: true
        volumeMounts:
          - mountPath: "/var/secrets"
            name: mysecret
      volumes:
      - name: mysecret
        csi:
          driver: secrets-store-gke.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: SECRET_PROVIDER_CLASS_NAME
    

    替换以下内容:

    • POD_NAME:Secret 所在的 Kubernetes Pod 的名称 已装载
    • KSA_NAME:您设置的 Kubernetes ServiceAccount 设置 Workload Identity 服务账号步骤
    • IMAGE_NAME:容器映像的名称
    • SECRET_PROVIDER_CLASS_NAMESecretProviderClass 对象的名称
  2. 将配置应用到您的集群。

    kubectl apply -f my-pod.yaml
    

此步骤使用 CSI 驱动程序将卷 mysecret 装载到 /var/secrets (secrets-store-gke.csi.k8s.io)。此卷引用了 SecretProviderClass 对象 后者充当提供程序

从现有的 Secrets Store CSI 驱动程序迁移

如果您要从 Google Secret Manager 已安装 Secrets Store CSI 驱动程序, 按如下所示更新您的 Pod 清单:

  1. 按照说明更新 SecretProviderClass 的名称和 provider (位于以下清单中):

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: app-secrets-gke
    spec:
      provider: gke
      parameters:
        secrets: |
          - resourceName: "projects/<project_id>/secrets/<secret_name>/versions/<secret_version>"
            path: "good1.txt"
    
  2. 更新 Kubernetes 的 driversecretProviderClass 卷(如以下清单中所述):

    volumes:
      - name: mysecret
        csi:
          driver: secrets-store-gke.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "app-secrets-gke"
    

停用 Secret Manager 插件

如需在现有集群上停用 Secret Manager 插件,请执行以下操作: 标准集群或 Autopilot 集群上,运行以下命令 命令:

  gcloud beta container clusters update CLUSTER_NAME \
      --no-enable-secret-manager \
      --region=REGION

替换以下内容:

  • CLUSTER_NAME:您的集群的名称
  • REGION:集群的区域,例如 us-central1