通过 Secret Manager 与 Google Kubernetes Engine (GKE) 的集成,您可以将 GKE 集群使用的密码和证书等敏感数据作为 Secret 存储在 Secret Manager 中。
本页介绍了如何使用 Secret Manager 插件 访问存储在 Secret Manager 中的 Secret(作为 Kubernetes Pod 中装载的卷)。
此过程包括以下步骤:
- 在新集群或现有 GKE 集群上启用 Secret Manager 插件。
- 配置应用以向 Secret Manager API 进行身份验证。
- 使用
SecretProviderClass
YAML 文件定义要挂载到 Kubernetes pod 上的 Secret。 - 创建一个卷,用于装载 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,且无需产生任何运维开销。
- 您无需编写自定义代码即可访问存储在 Secret Manager 中的 Secret。
- 您可以在 Secret Manager 中集中存储和管理所有 Secret,并使用 Secret Manager 插件从 GKE Pod 选择性地访问 Secret。这样,您就可以使用由 Google 提供的 Secret Manager,例如 CMEK 加密、精细的访问权限控制, 代管式轮替、生命周期管理和审核日志,以及 Kubernetes 的功能,例如以 已装载的卷
- 标准集群和 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.
如果您要使用 Google Cloud CLI 执行此任务,请安装 然后初始化 gcloud CLI。如果您 已安装 gcloud CLI,请运行以下命令获取最新版本:
gcloud components update
命令。您无法使用 Google Cloud SDK 或 Google Cloud 控制台。
确保您的集群运行的是 GKE 1.27.14-gke.1042001 或更高版本,且使用 Linux 节点映像。
如果您使用的是 GKE Standard 集群,请确保该集群已启用适用于 GKE 的工作负载身份联合。默认情况下,Autopilot 集群会启用适用于 GKE 的工作负载身份联合。Kubernetes Pod 使用适用于 GKE 的工作负载身份联合向 Secret Manager API 进行身份验证。
启用 Secret Manager 插件
您可以在两个标准集群上启用 Secret Manager 插件 以及 Autopilot 集群。
在新的 GKE 集群上启用 Secret Manager 插件
如需在创建集群时启用 Secret Manager 插件,请执行以下操作:
控制台
-
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
点击 add_box创建。
在创建集群对话框中,点击配置。
在导航菜单的集群部分中,点击安全。
选中启用 Secret Manager 复选框。
选中启用 Workload Identity 复选框。
继续配置该集群,然后点击创建。
gcloud
{ Standard cluster}
如需在新虚拟机上启用 Secret Manager 插件,请执行以下操作: Standard 集群,请运行以下命令:
在使用下面的命令数据之前,请先进行以下替换:
- 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 集群}
如需在服务器上启用 Secret Manager 插件,请执行以下操作: 新的 Autopilot 集群时,请运行以下命令:
在使用下面的命令数据之前,请先进行以下替换:
- 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 插件,请执行以下操作: 执行以下操作:
控制台
-
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击要修改的集群的名称。
在集群详情页面的安全部分,点击
Secret Manager。在修改 Secret Manager 对话框中,选中 Enable Secret Manager 复选框。
点击保存更改。
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 插件安装
如需验证 Secret Manager 插件是否已安装在 Kubernetes 集群上,请运行以下命令:
gcloud container clusters describe CLUSTER_NAME --location LOCATION | grep secretManagerConfig -A 1
替换以下内容:
CLUSTER_NAME
:集群的名称LOCATION
:位置 例如us-central1
配置应用以向 Secret Manager API 进行身份验证
Google Secret Manager 提供方使用工作负载身份 向该 Pod 进行身份验证时装载密钥的 Secret Manager API。如需允许您的应用使用适用于 GKE 的工作负载身份联合向 Secret Manager API 进行身份验证,请按以下步骤操作:
创建新的 Kubernetes ServiceAccount,或使用与要将 Secret 挂载到的 Pod 位于同一命名空间中的现有 Kubernetes ServiceAccount。
在 Secret Manager 中为 Secret 创建 Identity and Access Management (IAM) 许可政策。
访问 Secret Manager API 时,使用已配置的 Kubernetes ServiceAccount 的 Pod 会自动以与 Kubernetes ServiceAccount 对应的 IAM 主体标识符进行身份验证。
创建新的 Kubernetes ServiceAccount
将以下清单保存为
service-account.yaml
:apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE
替换以下内容:
KSA_NAME
:新 Kubernetes ServiceAccount 的名称NAMESPACE
:ServiceAccount 的 Kubernetes 命名空间的名称
应用清单:
kubectl apply -f service-account.yaml
创建一个引用新 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 项目的项目 IDNAMESPACE
: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 项目的项目 IDNAMESPACE
:ServiceAccount 的 Kubernetes 命名空间的名称KSA_NAME
:现有 Kubernetes ServiceAccount 的名称
定义要挂载的 Secret
如需指定要在 Kubernetes Pod 中作为文件挂载的 Secret,请创建 SecretProviderClass
YAML 清单,并列出要挂载的 Secret 以及要将其挂载为的文件名。请按照以下步骤操作:
将以下清单保存为
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 名称。SECRET_VERSION
:Secret 版本。FILENAME.txt
:要挂载 Secret 值的文件名。您可以使用resourceName
和path
变量创建多个文件。
应用清单:
kubectl apply -f app-secrets.yaml
验证是否已创建
SecretProviderClass
对象:kubectl get SecretProviderClasses
配置将要装载 Secret 的卷
将以下配置保存为
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 ServiceAccountIMAGE_NAME
:容器映像的名称SECRET_PROVIDER_CLASS_NAME
:SecretProviderClass
对象的名称
仅在 Standard 集群中,将以下内容添加到
template.spec
字段,以将 Pod 放置在使用适用于 GKE 的工作负载身份联合的节点池上。在 Autopilot 集群中跳过此步骤,这会拒绝此 nodeSelector,因为每个节点都使用适用于 GKE 的工作负载身份联合。
spec: nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
将配置应用到您的集群。
kubectl apply -f my-pod.yaml
此步骤使用 CSI 驱动程序将卷 mysecret
装载到 /var/secrets
(secrets-store-gke.csi.k8s.io)。此卷引用了 SecretProviderClass
对象
后者充当提供程序
从现有的 Secrets Store CSI 驱动程序迁移
如果您要从现有的 Secrets Store CSI 驱动程序安装迁移到 Secret Manager 插件,请按如下方式更新 Pod 清单:
按照以下清单中的说明更新
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"
更新 Kubernetes 卷的
driver
和secretProviderClass
,如以下清单所述:volumes: - name: mysecret csi: driver: secrets-store-gke.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "app-secrets-gke"
停用 Secret Manager 插件
如需在现有集群上停用 Secret Manager 插件,请执行以下操作: 标准集群或 Autopilot 集群上,运行以下命令 命令:
控制台
-
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
在集群详情页面的安全部分中,点击
Secret Manager。在修改 Secret Manager 对话框中,清除启用 Secret Manager 复选框。
点击保存更改。
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 ^