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

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

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

此过程包括以下步骤:

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

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

优势

Secret Manager 插件具有以下优势:

  • 您可以使用受支持的全代管式解决方案从 GKE 中访问 Secret Manager Secret,而不会产生任何操作开销。
  • 您无需编写自定义代码即可访问存储在 Secret Manager 中的 Secret。
  • 您可以在 Secret Manager 中集中存储和管理所有 Secret,并使用 Secret Manager 插件有选择地访问 GKE Pod 中的 Secret。这样,您就可以使用 Secret Manager 提供的功能(例如 CMEK 加密、精细访问权限控制、代管式轮替、生命周期管理和审核日志),还可以使用 Kubernetes 功能(例如以装载卷的形式将 Secret 传递给容器)。
  • 标准集群和 Autopilot 集群均支持 Secret Manager 插件。
  • Secret Manager 插件支持 linux/arm64linux/amd64 部署。

限制

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

准备工作

  • 启用 Secret Manager and Google Kubernetes Engine API。

    启用 API

  • 如果您要使用 Google Cloud CLI 执行此任务,请安装initialize gcloud CLI。如果您之前安装了 gcloud CLI,请运行 gcloud components update 命令获取最新版本。

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

安装 Secret Manager 插件

您可以在标准集群和 Autopilot 集群上安装 Secret Manager 插件。确保在标准集群上启用 Workload Identity Federation for GKE。默认情况下,系统会在 Autopilot 集群上启用适用于 GKE 的 Workload Identity Federation。Kubernetes Pod 使用工作负载身份向 Secret Manager API 进行身份验证。

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

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

标准集群

  • 如需在新的标准集群上启用 Secret Manager 插件,请运行以下命令:

    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 集群

  • 如需在新的 Autopilot 集群上启用 Secret Manager 插件,请运行以下命令:

    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 插件后,您可以通过驱动程序和预配工具名称 secrets-store-gke.csi.k8s.io 在 Kubernetes 卷中使用 Secrets Store CSI 驱动程序。

在现有 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 提供方在向 Secret Manager API 进行身份验证时使用 Secret 装载到的 Pod 的工作负载身份。如需允许您的应用使用 Workload Identity Federation for GKE 向 Secret Manager API 进行身份验证,请按以下步骤操作:

  • 使用 Identity and Access Management (IAM) 政策将 IAM 服务帐号绑定到 Kubernetes ServiceAccount。您可以创建新的 Kubernetes ServiceAccount,也可以在任何命名空间(包括默认 Kubernetes ServiceAccount)中使用现有的 Kubernetes ServiceAccount。
  • 使用 IAM 绑定向 IAM 服务帐号授予对 Secret Manager 中 Secret 的访问权限。

使用已配置的 Kubernetes ServiceAccount 的 Pod 会在访问 Secret Manager API 时自动以 IAM 服务帐号进行身份验证。

将 Kubernetes ServiceAccount 绑定到 IAM 服务帐号

通过在两个服务帐号之间添加 IAM 政策绑定,允许 Kubernetes ServiceAccount 模拟 IAM 服务帐号。

使用新的 Kubernetes ServiceAccount

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

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
      annotations:
        iam.gke.io/gcp-service-account: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    替换以下内容:

    • KSA_NAME:新 Kubernetes ServiceAccount 的名称
    • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
    • GSA_NAME:IAM 服务帐号的名称
    • PROJECT_ID:您的 IAM 服务帐号的 Google Cloud 项目的项目 ID
  2. 应用清单:

    kubectl apply -f service-account.yaml
    
  3. 如需将 IAM 服务帐号绑定到新的 Kubernetes ServiceAccount,请运行以下命令:

    gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

使用现有 Kubernetes ServiceAccount

如需将 IAM 服务帐号绑定到现有 Kubernetes ServiceAccount,请运行以下命令:

gcloud iam service-accounts add-iam-policy-binding \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \
    GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

替换以下内容:

  • KSA_NAME:现有 Kubernetes ServiceAccount 的名称
  • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
  • GSA_NAME:IAM 服务帐号的名称
  • PROJECT_ID:您的 IAM 服务帐号的 Google Cloud 项目的项目 ID

授予 IAM 服务帐号访问 Secret 的权限

如需向服务帐号授予访问 Secret 的权限,请运行以下命令:

gcloud secrets add-iam-policy-binding SECRET_NAME \
    --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/secretmanager.secretAccessor

替换以下内容:

  • SECRET_NAME:Secret Manager 中密钥的名称
  • GSA_NAME:IAM 服务帐号的名称
  • PROJECT_ID:您的 IAM 服务帐号的 Google Cloud 项目的项目 ID

定义要装载哪些 Secret

如需指定将哪些 Secret 作为文件装载到 Kubernetes Pod,请创建一个 SecretProviderClass YAML 清单,并列出要装载的 Secret 以及装载它们的文件名。请按照以下步骤操作:

  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_NAME:您的 SecretProviderClass 对象的名称
    • PROJECT_ID:您的项目 ID
    • SECRET_NAME:密钥名称
    • SECRET_VERSION:密钥版本
    • FILENAME.txt:将装载 Secret 值的文件名。您可以使用 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:您在设置 Workload Identity 服务帐号步骤中设置的 Kubernetes ServiceAccount
    • IMAGE_NAME:容器映像的名称
    • SECRET_PROVIDER_CLASS_NAME:您的 SecretProviderClass 对象的名称
  2. 将配置应用到您的集群。

    kubectl apply -f my-pod.yaml
    

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

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

如果您要从目前已安装的 Secrets Store CSI 驱动程序迁移到 Secret Manager 插件,请按以下方式更新 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 插件

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

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

替换以下内容:

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