通过 Secret Manager 与 Google Kubernetes Engine (GKE) 之间的集成,您可以将 GKE 集群使用的密码和证书等敏感数据存储为 Secret Manager 中的 Secret。
本页面介绍了如何使用 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 插件。如需了解详情,请参阅从现有 Secret 存储区 CSI 驱动程序迁移。
优势
Secret Manager 插件具有以下优势:
- 您可以使用全代管式且受支持的解决方案从 GKE 中访问 Secret Manager 密钥,而不会产生任何操作开销。
- 您无需编写自定义代码即可访问存储在 Secret Manager 中的 Secret。
- 您可以在 Secret Manager 中集中管理所有 Secret,并使用 Secret Manager 插件有选择地从 GKE pod 访问 Secret。这样,您就可以使用 Secret Manager 提供的功能(例如 CMEK 加密、精细访问权限控制、代管式轮替、生命周期管理和审核日志),以及使用 Kubernetes 功能(例如以装载的卷的形式将 Secret 传递给容器)。
- 标准集群和 Autopilot 集群都支持 Secret Manager 插件。
- Secret Manager 插件支持
linux/arm64
和linux/amd64
部署。
限制
此 Secret Manager 插件的预览版不支持开源 Secrets Store CSI 驱动程序中提供的以下功能:
准备工作
-
启用 Secret Manager and Google Kubernetes Engine 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 的工作负载身份联合。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
请替换以下内容:
启用 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 进行身份验证时,会使用装载了密钥的 Pod 的工作负载身份。如需允许您的应用使用适用于 GKE 的工作负载身份联合向 Secret Manager API 进行身份验证,请按以下步骤操作:
在任意命名空间(包括默认的 Kubernetes ServiceAccount)中创建新的 Kubernetes ServiceAccount 或使用现有的 Kubernetes ServiceAccount。
在 Secret Manager 中为 Secret 创建 Identity and Access Management (IAM) 允许政策。
使用所配置的 Kubernetes ServiceAccount 的 Pod 在访问 Secret Manager API 时,会自动以与 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
:您的项目 IDSECRET_NAME
:Secret 名称SECRET_VERSION
:密钥版本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: 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
:装载密钥的 Kubernetes Pod 的名称KSA_NAME
:您在设置 Workload Identity 服务帐号步骤中设置的 Kubernetes ServiceAccountIMAGE_NAME
:容器映像的名称SECRET_PROVIDER_CLASS_NAME
:SecretProviderClass
对象的名称
将配置应用到您的集群。
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 清单:
按照以下清单中的说明,更新
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 插件
如需在现有标准集群或 Autopilot 集群上停用 Secret Manager 插件,请运行以下命令:
gcloud beta container clusters update CLUSTER_NAME \
--no-enable-secret-manager \
--region=REGION
请替换以下内容:
CLUSTER_NAME
:您的集群的名称REGION
:集群的区域,例如us-central1