修改退市办法意味着什么?征求意见稿

百度 马化腾补充说。

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

本页介绍如何使用 Secret Manager 加载项来访问存储在 Secret Manager 中的 Secret,这些 Secret 作为卷装载在 Kubernetes Pod 中。

此过程包括以下步骤:

  1. 在新 GKE 集群或现有 GKE 集群上启用 Secret Manager 插件。
  2. 配置应用以向 Secret Manager API 进行身份验证。
  3. 使用 SecretProviderClass YAML 文件定义要装载到 Kubernetes Pod 上的 Secret。 Secret Manager 加载项支持全局和区域级密文
  4. 创建一个将装载 Secret 的卷。卷附加后,容器中的应用可以访问容器文件系统中的数据。

Secret Manager 加载项派生自开源 Kubernetes Secrets Store CSI 驱动程序Google Secret Manager 提供程序。如果您使用的是开源 Secrets Store CSI Driver 来访问密文,则可以迁移到 Secret Manager 插件。如需了解相关信息,请参阅从现有 Secrets Store CSI 驱动程序迁移

优势

Secret Manager 加载项具有以下优势:

  • 您可以使用全代管式且受支持的解决方案,从 GKE 中访问 Secret Manager Secret,而无需任何运营开销。
  • 您无需编写自定义代码即可访问存储在 Secret Manager 中的密文。
  • 您可以在 Secret Manager 中集中存储和管理所有 Secret,并使用 Secret Manager 插件从 GKE pod 中选择性地访问 Secret。这样一来,您就可以使用 Secret Manager 提供的功能,例如 CMEK 加密、精细的访问权限控制、受管理的轮替、生命周期管理和审核日志,同时还可以使用 Kubernetes 功能,例如以装载卷的形式将 Secret 传递给容器。
  • Standard 集群和 Autopilot 集群均支持 Secret Manager 插件。
  • Secret Manager 插件支持使用 Container-Optimized OS 或 Ubuntu 节点映像的节点。

限制

Secret Manager 加载项具有以下限制:

  • Secret Manager 插件不支持以下功能(该功能可在开源 Secrets Store CSI 驱动程序中使用):

  • Secret Manager 插件不支持 Windows Server 节点。

准备工作

  • Enable the Secret Manager and Google Kubernetes Engine APIs.

    Enable the APIs

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

    您无法使用 Google Cloud SDK 或 Google Cloud 控制台手动设置 Secret Manager 插件。

  • 确保您的集群运行的是 GKE 1.27.14-gke.1042001 版或更高版本,并使用 Linux 节点映像。

  • 如果您使用的是 GKE Standard 集群,请确保您的集群已启用 Workload Identity Federation for GKE。Autopilot 集群默认启用 Workload Identity Federation for GKE。 Kubernetes Pod 使用 Workload Identity Federation for GKE 向 Secret Manager API 进行身份验证。

启用 Secret Manager 加载项

您可以在标准集群和 Autopilot 集群上启用 Secret Manager 插件。

在新 GKE 集群上启用 Secret Manager 插件

如需在创建集群时启用 Secret Manager 插件,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 创建集群对话框中,点击配置

  4. 在导航菜单的集群部分中,点击安全

  5. 选中启用 Secret Manager 复选框。

  6. 选中启用 Workload Identity 复选框。

  7. 继续配置该集群,然后点击创建

gcloud

{ Standard 集群}

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

在使用下面的命令数据之前,请先进行以下替换:

  • CLUSTER_NAME:您的集群的名称。
  • LOCATION:集群的 Compute Engine 区域,例如 us-central1
  • VERSION:您要使用的特定 GKE 版本。确保您的集群运行的是 GKE 1.27.14-gke.1042001 版或更高版本。如果默认发布渠道不包含此版本,请使用 --release-channel 标志选择包含此版本的发布渠道。
  • PROJECT_ID:您的 Google Cloud 项目的 ID。

执行以下命令:

Linux、macOS 或 Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

{ Autopilot 集群}

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

在使用下面的命令数据之前,请先进行以下替换:

  • CLUSTER_NAME:您的集群的名称。
  • VERSION:您要使用的特定 GKE 版本。确保您的集群运行的是 GKE 1.27.14-gke.1042001 版或更高版本。如需设置特定版本,请参阅设置新的 Autopilot 集群的版本和发布渠道
  • LOCATION:集群的 Compute Engine 区域,例如 us-central1

执行以下命令:

Linux、macOS 或 Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

启用 Secret Manager 加载项后,您可以使用驱动程序和预配工具名称 secrets-store-gke.csi.k8s.io 在 Kubernetes 卷中使用密文库 CSI 驱动程序。

在现有 GKE 集群上启用 Secret Manager 插件

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

控制台

  1. 在 Google Cloud 控制台中,前往 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 在集群详情页面的安全部分中,点击 Secret Manager

  4. 修改 Secret Manager 对话框中,选中启用 Secret Manager 复选框。

  5. 点击保存更改

gcloud

在使用下面的命令数据之前,请先进行以下替换:

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

执行以下命令:

Linux、macOS 或 Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

配置密文的自动轮替

您可以配置 Secret Manager 插件以自动轮替密钥,以便在初始 pod 部署后在 Secret Manager 中更新的密钥会自动定期推送到 pod。挂载的密文的自动轮换功能可让应用自动接收更新后的密文,而无需重启或手动干预。此功能可确保应用始终使用最新的 Secret。

请注意以下有关配置密钥自动轮替的事项:

  • 密文自动轮替是一项可选配置。
  • 您可以在创建新集群或更新现有集群时配置此功能。
  • GKE 1.32.2-gke.1059000 版或更高版本支持自动轮替 Secret。

如需配置 Secret 自动轮替,您必须启用 enable-secret-manager-rotation 功能,并通过设置 secret-manager-rotation-interval 来配置轮替间隔。

例如,如需在现有 GKE 集群上配置自动轮换,请使用以下命令:

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

替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群的位置,例如 us-central1
  • ROTATION_INTERVAL:轮换间隔时间(以秒为单位)。默认轮换间隔为 120 秒。

验证 Secret Manager 加载项安装

如需验证 Secret Manager 插件是否已安装在 Kubernetes 集群上,请运行以下命令:

  gcloud container clusters describe CLUSTER_NAME --location LOCATION | grep secretManagerConfig -A 4

替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群的位置,例如 us-central1

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

Google Secret Manager 提供程序在向 Secret Manager API 进行身份验证时,会使用 Secret 所挂载到的 Pod 的工作负载身份。如需允许应用使用 Workload Identity Federation for GKE 向 Secret Manager API 进行身份验证,请按以下步骤操作:

  • 创建新的 Kubernetes ServiceAccount,或使用与要装载 Secret 的 Pod 位于同一命名空间中的现有 Kubernetes ServiceAccount。

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

访问 Secret Manager API 时,使用已配置的 Kubernetes 服务账号的 Pod 会自动以与该 Kubernetes 服务账号对应的 IAM 正文标识符身份进行身份验证。

创建新的 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 ServiceAccount 的 IAM 许可政策,并授予其访问相应 Secret 的权限:

    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 ServiceAccount 的 IAM 允许政策,并向其授予访问相应 Secret 的权限:

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 中,请创建 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_NAMESecretProviderClass 对象的名称。
    • PROJECT_ID:您的项目 ID。
    • SECRET_NAME:密文名称。
    • SECRET_VERSION:密文版本。
    • FILENAME.txt:将装载 Secret 值的文件的文件名。您可以使用 resourceNamepath 变量创建多个文件。

    对于区域级密钥,resourceName 是密钥资源的完整路径,其中包含区域级密钥的位置。例如,“projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_NAME/versions/SECRET_VERSION

  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: NAMESPACE
    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 的名称
    • NAMESPACE:ServiceAccount 的 Kubernetes 命名空间的名称
    • KSA_NAME:您在配置应用以向 Secret Manager API 进行身份验证步骤中设置的 Kubernetes 服务账号
    • IMAGE_NAME:容器映像的名称
    • SECRET_PROVIDER_CLASS_NAMESecretProviderClass 对象的名称
  2. 仅在 Standard 集群中,将以下内容添加到 template.spec 字段,以将 Pod 放置在使用适用于 GKE 的工作负载身份联合的节点池上。

    在 Autopilot 集群中跳过此步骤,这会拒绝此 nodeSelector,因为每个节点都使用适用于 GKE 的工作负载身份联合。

    spec:
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
    
  3. 将配置应用到您的集群。

    kubectl apply -f my-pod.yaml
    

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

从现有 Secret Store CSI 驱动程序迁移

如果您要从现有安装的 Secrets Store CSI 驱动程序迁移到 Secret Manager 加载项,请按如下方式更新 Pod 清单:

  1. 按照以下清单中的说明更新 SecretProviderClassprovider 的名称:

    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 插件,请运行以下命令:

控制台

  1. 在 Google Cloud 控制台中,前往 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 在集群详情页面的安全部分中,点击 Secret Manager

  4. 修改 Secret Manager 对话框中,清除启用 Secret Manager 复选框。

  5. 点击保存更改

gcloud

在使用下面的命令数据之前,请先进行以下替换:

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

执行以下命令:

Linux、macOS 或 Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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