使用 Workload Identity

本页面介绍了 Google Kubernetes Engine (GKE) 应用使用 Google API 所提供服务的推荐方式。

概览

由于 Workload Identity 具有增强的安全属性和可管理性,因此它是从 GKE 内运行的应用访问 Google Cloud 服务的推荐方法。如需了解从 GKE 访问 Google Cloud API 的其他方法,请参阅下面的替代方案部分。

队列工作负载身份为在队列中注册的集群(包括 Anthos 集群)提供工作负载身份联合支持。

术语

本文档介绍了 Kubernetes 服务帐号Google 服务帐号的区别。Kubernetes 服务帐号属于 Kubernetes 资源,而 Google 服务帐号专用于 Google Cloud。其他 Google Cloud 文档将 Google 服务帐号称为“服务帐号”。

概念

在 GKE 上运行的应用必须经过身份验证才能使用 Google Cloud API,例如计算 API、 存储和数据库 API 或机器学习 API。

借助 Workload Identity,您可以将 Kubernetes 服务帐号配置为充当 Google 服务帐号。以 Kubernetes 服务帐号的身份运行的 Pod 在访问 Google Cloud API 时,会自动以 Google 服务帐号的身份进行身份验证。这让您可以为集群中的每个应用分配不同的精细身份和授权。

为实现 Kubernetes 服务帐号与 Google 服务帐号之间的安全映射,Workload Identity 引入了集群的工作负载身份池概念,此概念可让 Identity and Access Management (IAM) 能够信任和了解 Kubernetes 服务帐号凭据。

在 GKE 集群上启用 Workload Identity 时,集群的工作负载身份池将设置为 PROJECT_ID.svc.id.goog。这让您可以以以下成员名称身份对 Kubernetes 服务帐号进行身份验证:

serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]

在此成员名称中:

  • PROJECT_ID.svc.id.goog 是在集群上设置的工作负载身份池。
  • KSA_NAME 是发出请求的 Kubernetes 服务帐号的名称。
  • K8S_NAMESPACE 是在其中定义了 Kubernetes 服务帐号的 Kubernetes 命名空间。

GKE 会为每个 Google Cloud 项目自动创建一个固定的工作负载身份池 PROJECT_ID.svc.id.goog。此工作负载身份池用于项目中的所有 GKE 集群。

不同集群之间身份相同

所有共用名称、命名空间名称和工作负载身份池的 Kubernetes 服务帐号都会解析为同一成员名称,因此共享对 Google Cloud 资源的访问权限。这种通用身份使工作负载身份池中的应用能够一次访问外部资源,而不是逐个集群地访问。

为了进一步说明这一点,请参考以下示例。在同一工作负载身份池中注册集群 A、B 和 C。当 backend 命名空间中的应用访问 Google Cloud 资源时,其身份将被映射到名为 back 的常用 Google 服务帐号,而与托管该应用的集群无关。可以在任意数量的 Google Cloud API 上对 Google 服务帐号 back (从 Cloud Storage 到 Cloud SQL)进行授权。

由于身份相同,因此确保工作负载身份池中的所有集群都值得信任且妥善管理。回顾之前的例子,如果集群 C 归一个单独的不受信任的团队所有,则他们还可以创建 backend 命名空间并访问 Google Cloud API,就像集群 A 或集群 B 中的 backend 一样。

说明工作负载身份池中身份相同性的示意图
通过 Workload Identity 访问 Google Cloud API 的身份相同性

如果不希望集群共享权限,则必须将集群置于不同的项目中,或者为这些集群使用不同的 Kubernetes 命名空间名称。举一个具体例子:具有宽松权限的集群“dev”和锁定权限的集群“prod”的用户应该考虑将这两个集群分别置于不同的项目中,以为两者分别使用不同的工作负载身份池。

限制

  • 目前,每个 Google Cloud 项目都只有一个固定的工作负载身份池 PROJECT_ID.svc.id.goog,它是由系统自动为您创建的。

  • Workload Identity 取代了使用元数据隐藏的需要,因此这两种方法不兼容。由元数据隐藏保护的敏感源数据也受 Workload Identity 的保护。

  • 在节点池上启用 GKE 元数据服务器后,Pod 将无法再访问 Compute Engine 元数据服务器。相反,这些 Pod 向 Metadata API 发出的请求将路由到 GKE 元数据服务器。唯一的例外情况是在主机网络上运行的 Pod(请参阅下一项)。

  • 主机网络上运行的 Pod 不能使用 Workload Identity。这些 Pod 向 Metadata API 发出的请求将路由到 Compute Engine 元数据服务器。

  • GKE 元数据服务器需要几秒钟的时间才能开始在新创建的 Pod 上接受请求。因此,尝试在 Pod 生命周期的前几秒内使用 Workload Identity 进行身份验证可能会失败。重试调用会解决问题。如需了解详情,请参阅下面的问题排查部分

  • GKE 内置的日志记录和监控代理将继续使用节点的服务帐号

  • Workload Identity 需要手动设置 Cloud Run for Anthos 才能继续发布请求指标

  • 如果创建集群时未使用 --disable-default-snat 标志,则 Workload Identity 会安装 ip-masq-agent

  • Workload Identity 将每个节点的 GKE 元数据服务器连接限制为 200 个,以避免内存问题。如果您的节点数超出此限制,则可能会遇到超时情况。

准备工作

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

在集群上启用 Workload Identity

您可以使用 gcloud 工具在新的或现有的 GKE 标准集群上启用 Workload Identity。默认情况下,GKE Autopilot 集群上会启用 Workload Identity。

  1. 确保您已启用 IAM Service Account Credentials API。

    启用 IAM Credentials API

  2. 如需创建启用了 Workload Identity 的新集群,请使用以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • PROJECT_ID:您的 Google Cloud 项目的 ID。

    此操作需要项目的 container.clusters.create 权限。

  3. 如需在现有集群上启用 Workload Identity,请使用以下命令修改集群:

    gcloud container clusters update CLUSTER_NAME \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    现有节点池不受影响;新节点池默认为 --workload-metadata=GKE_METADATA

    此操作需要集群的 container.clusters.update 权限。

将应用迁移到 Workload Identity

选择最适合您的环境的迁移策略。您可以就地迁移节点池,也可以创建启用了 Workload Identity 的新节点池。如果您还需要修改应用以兼容此功能,我们建议您创建新的节点池。

向启用了 Workload Identity 的集群添加新的节点池,并手动将工作负载迁移到该池。只有在集群上启用 Workload Identity 后,此操作才能成功。

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --workload-metadata=GKE_METADATA

如果集群启用了 Workload Identity,您可以通过明确指定 --workload-metadata=GCE_METADATA 在特定节点池中选择性地停用它。如需了解详情,请参阅保护集群元数据

方案 2:修改节点池

修改现有节点池以启用 GKE_METADATA。只有在集群上启用 Workload Identity 后,此更新才会成功。它会立即为已经部署到节点池的工作负载启用 Workload Identity。此更改可防止工作负载使用 Compute Engine 服务帐号,必须谨慎部署。

gcloud container node-pools update NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --workload-metadata=GKE_METADATA

此操作需要项目的 container.nodes.update 权限。

向 Google Cloud 进行身份验证

本部分介绍了应用如何使用 Workload Identity 向 Google Cloud 进行身份验证。为此,请向应用分配一个 Kubernetes 服务帐号,并将其配置为充当 Google 服务帐号:

  1. 配置 kubectl 以与集群通信:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME 替换为您在上一步中创建的集群的名称。

    此操作需要项目的 container.clusters.get 权限。

  2. 像大多数其他资源一样,Kubernetes 服务帐号也位于命名空间中。创建用于 Kubernetes 服务帐号的命名空间。

    kubectl create namespace K8S_NAMESPACE
    

    此操作需要集群内的创建命名空间 RBAC 权限

  3. 创建要用于您的应用的 Kubernetes 服务帐号:

    kubectl create serviceaccount --namespace K8S_NAMESPACE KSA_NAME
    

    替换以下内容:

    • K8S_NAMESPACE:您在上一步中创建的 Kubernetes 命名空间的名称。
    • KSA_NAME:您要用于 Kubernetes 服务帐号的名称。

    此操作需要命名空间内的创建服务帐号 RBAC 权限

    或者,您也可以在默认命名空间或任何其他现有命名空间中使用默认的 Kubernetes 服务帐号。

  4. 将您的应用配置为使用 Kubernetes 服务帐号:

    spec:
      serviceAccountName: KSA_NAME
    
  5. 为您的应用创建 Google 服务帐号,或使用现有的 Google 服务帐号。您可以在组织中的任何项目中使用任何 Google 服务帐号。对于 Config Connector,请为所选服务帐号应用 IAMServiceAccount 对象。

    gcloud

    如需使用 gcloud 工具创建新的 Google 服务帐号,请运行以下命令。

    gcloud iam service-accounts create GSA_NAME
    

    GSA_NAME 替换为新的 Google 服务帐号的名称。

    Config Connector

    如需将新的或现有的 Google 服务帐号与 Config Connector 结合使用,请应用以下配置文件。

    注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [GSA_NAME]
    spec:
      displayName: [GSA_NAME]
    如需部署此清单,请将它以 service-account.yaml 的形式下载到您的机器上。

    使用 kubectl 应用清单:

    kubectl apply -f service-account.yaml
    

    此操作需要项目的 iam.serviceAccounts.create 权限。

    如需了解如何授权 Google 服务帐号访问 Google Cloud API,请参阅了解服务帐号

  6. 确保您的 Google 服务帐号具有所需的 IAM 角色。您可以使用以下命令授予其他角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • GSA_NAME:您的 Google 服务帐号的名称。
    • ROLE_NAME:要分配给服务帐号的 IAM 角色,如 roles/spanner.viewer
  7. 通过在 Kubernetes 服务帐号和 Google 服务帐号之间创建 IAM 政策绑定,允许 Kubernetes 服务帐号模拟 Google 服务帐号。此绑定允许 Kubernertes 服务帐号充当 Google 服务帐号。

    gcloud

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

    Config Connector

    注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicy
    metadata:
      name: iampolicy-workload-identity-sample
    spec:
      resourceRef:
        apiVersion: iam.cnrm.cloud.google.com/v1beta1
        kind: IAMServiceAccount
        name: [GSA_NAME]
      bindings:
        - role: roles/iam.workloadIdentityUser
          members:
            - serviceAccount:[PROJECT_ID].svc.id.goog[[K8S_NAMESPACE]/[KSA_NAME]]
    如需部署此清单,请将它以 policy-binding.yaml 的形式下载到您的机器上。将 GSA_NAMEPROJECT_IDK8S_NAMESPACEKSA_NAME 替换为您的环境中的值,然后运行以下命令:

    kubectl apply -f policy-binding.yaml
    

    此操作需要项目的 iam.serviceAccounts.setIamPolicy 权限。

  8. 使用 Google 服务帐号的电子邮件地址,向 Kubernetes 服务帐号添加 iam.gke.io/gcp-service-account=GSA_NAME@PROJECT_ID 注释。

    kubectl

    kubectl annotate serviceaccount \
        --namespace K8S_NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    yaml

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

    此操作需要 Kubernetes 服务帐号的 RBAC 修改权限

  9. 通过使用运行特定于操作系统的容器映像的 Kubernetes 服务帐号创建 Pod,然后通过交互式会话连接到该服务帐号,验证服务帐号是否配置正确。

    对于 Linux 节点

    1. 使用运行 cloud-sdk 容器映像的 Kubernetes 服务帐号创建 Pod:

      将以下配置保存为 wi-test.yaml

      apiVersion: v1
      kind: Pod
      metadata:
        name: workload-identity-test
        namespace: K8S_NAMESPACE
      spec:
        containers:
        - image: google/cloud-sdk:slim
          name: workload-identity-test
          command: ["sleep","infinity"]
        serviceAccountName: KSA_NAME
      

      创建 pod:

      kubectl apply -f wi-test.yaml
      

      在 Pod 中打开交互式会话:

      kubectl exec -it workload-identity-test \
          --namespace K8S_NAMESPACE -- /bin/bash
      

      google/cloud-sdk 映像中包含 gcloud 命令行工具,可以方便地使用 Google Cloud API。映像下载可能需要一段时间。

      此操作需要命名空间内的创建 Pod RBAC 权限。

    2. 现在,您已连接到所创建的 Pod 中的交互式 shell。 在 Pod 中运行以下命令:

      gcloud auth list
      

      如果服务帐号正确配置,Google 服务帐号电子邮件地址会列为活跃(也是唯一)的身份。这表明在默认情况下,Pod 会在调用 Google Cloud API 时使用 Google 服务帐号的权限。

    对于 Windows Server 节点

    1. 使用运行 servercore 容器映像的 Kubernetes 服务帐号创建 Pod:

      apiVersion: v1
      kind: Pod
      metadata:
        name: workload-identity-test
        namespace: K8S_NAMESPACE
      spec:
        containers:
        - image: IMAGE_NAME
          name: workload-identity-test
          command: ["powershell.exe", "sleep", "3600"]
        serviceAccountName: KSA_NAME
        nodeSelector:
          kubernetes.io/os: windows
          cloud.google.com/gke-os-distribution: windows_ltsc
      

      IMAGE_NAME 替换为以下容器 servercore 映像值之一:

      Windows Server 节点映像 容器 servercore 映像
      WINDOWS_LTSC,
      WINDOWS_LTSC_CONTAINERD
      mcr.microsoft.com/windows/servercore:ltsc2019
      WINDOWS_SAC,
      WINDOWS_SAC_CONTAINERD
      检查 GKE 节点版本和 Windows SAC 版本之间的版本映射。对于 Windows Server 1909 版,请指定 mcr.microsoft.com/windows/servercore:1909;否则,请指定 mcr.microsoft.com/windows/servercore:20H2

      此操作需要命名空间内的创建 Pod RBAC 权限。

      在 Pod 中打开交互式会话:

      kubectl exec -it workload-identity-test \
          --namespace K8S_NAMESPACE -- powershell
      
    2. 现在,您已连接到所创建的 Pod 中的交互式 shell。 在 Pod 中运行以下 powershell 命令:

      Invoke-WebRequest  -Headers @{"Metadata-Flavor"="Google"} -Uri  http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email  -UseBasicParsing
      

      如果服务帐号正确配置,Google 服务帐号电子邮件地址会列为活跃(也是唯一)的身份。这表明在默认情况下,Pod 会在调用 Google Cloud API 时使用 Google 服务帐号的权限。

通过代码使用 Workload Identity

通过代码向 Google Cloud 服务进行身份验证的过程,与使用 Compute Engine 元数据服务器进行身份验证的过程相同。使用 Workload Identity 时,您对实例元数据服务器发出的请求将路由到 GKE 元数据服务器。使用实例元数据服务器进行身份验证的现有代码(如使用 Google Cloud 客户端库的代码)在运行时不应进行任何修改。

了解 GKE 元数据服务器

GKE 元数据服务器是专为与 Kubernetes 搭配使用而设计的新元数据服务器。服务器作为 daemonset 运行,每个集群 Linux 节点上都有一个 Pod,或每个 Windows 节点上的原生 Windows 服务。该元数据服务器会拦截对 http://metadata.google.internal (169.254.169.254:80) 的 HTTP 请求(包括 GET /computeMetadata/v1/instance/service-accounts/default/token 等请求),以便为 Pod 配置充当的 Google 服务帐号检索令牌。指向元数据服务器的流量绝不会离开托管 Pod 的虚拟机实例。

GKE 元数据服务器仅实现部分 Compute Engine 元数据服务器端点,这些端点对于 Kubernetes 工作负载是相关且安全的:

  • /computeMetadata/v1/instance/attributes/cluster-location
  • /computeMetadata/v1/instance/attributes/cluster-name
  • /computeMetadata/v1/instance/attributes/cluster-uid
  • /computeMetadata/v1/instance/hostname
  • /computeMetadata/v1/instance/id
  • /computeMetadata/v1/project/numeric-project-id
  • /computeMetadata/v1/project/project-id
  • /computeMetadata/v1/instance/service-accounts
  • /computeMetadata/v1/instance/service-accounts/default
  • /computeMetadata/v1/instance/service-accounts/default/aliases
  • /computeMetadata/v1/instance/service-accounts/default/email
  • /computeMetadata/v1/instance/service-accounts/default/identity
  • /computeMetadata/v1/instance/service-accounts/default/identity?audience=audience
  • /computeMetadata/v1/instance/service-accounts/default/scopes
  • /computeMetadata/v1/instance/service-accounts/default/token
  • /computeMetadata/v1/instance/service-accounts/default/token?scopes=comma-separated-list-of-scopes

撤消访问权限

  1. 使用 IAM 撤消对 Google 服务帐号的访问权限:

    gcloud

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

    替换以下内容:

    • PROJECT_ID:GKE 集群的项目 ID 容器。
    • K8S_NAMESPACE:您的 Kubernetes 服务帐号所在的 Kubernetes 命名空间的名称。
    • KSA_NAME:将撤消其访问权限的 Kubernetes 服务帐号的名称。
    • GSA_NAME:Google 服务帐号的名称。
    • GSA_PROJECT_ID:包含 Google 服务帐号的项目 ID。

    Config Connector

    如果您使用 Config Connector 创建服务帐号,请通过 kubectl 删除服务帐号。

    kubectl delete -f service-account.yaml
    

    此操作需要服务帐号的 iam.serviceAccounts.setIamPolicy 权限。

    缓存的令牌最长可能需要 30 分钟才会过期。您可以使用此命令检查缓存的令牌是否已过期:

    gcloud auth list
    

    如果此命令的输出结果中不再包含 GSA_NAME@PROJECT_ID.iam.gserviceaccount.com,则表明缓存的令牌已经过期。

  2. 从 Kubernetes 服务帐号中移除注释。这是可选步骤,因为访问权限已被 IAM 撤消。

    kubectl annotate serviceaccount KSA_NAME \
        --namespace K8S_NAMESPACE iam.gke.io/gcp-service-account-
    

问题排查

Pod 无法向 Google Cloud 进行身份验证

如果您的应用无法向 Google Cloud 进行身份验证,请确保以下设置正确配置:

  1. 确保您已在包含 GKE 集群的项目中启用 IAM Service Account Credentials API。

    启用 IAM Credentials API

  2. 通过验证集群是否设置了工作负载身份池,确保已在集群上启用 Workload Identity。

    gcloud container clusters describe CLUSTER_NAME \
        --format="value(workloadIdentityConfig.workloadPool)"
    
  3. 确保已在运行应用的节点池上配置 GKE 元数据服务器 (GKE_METADATA):

    gcloud container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --format="value(config.workloadMetadataConfig.mode)"
    
  4. 确保已正确注释 Kubernetes 服务帐号

    kubectl describe serviceaccount \
        --namespace K8S_NAMESPACE KSA_NAME
    

    注释应采用以下格式:

    iam.gke.io/gcp-service-account: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    
  5. 确保 Google 服务帐号正确配置

    gcloud iam service-accounts get-iam-policy \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    验证是否存在采用以下格式的绑定:

    - members:
      - serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]
      role: roles/iam.workloadIdentityUser
    
  6. 如果您制定了集群网络政策,请确保允许端口 988 上通向 127.0.0.1/32 的出站流量:

    kubectl describe networkpolicy NETWORK_POLICY_NAME
    

Pod 启动时发生超时错误

GKE 元数据服务器需要几秒钟的时间才能开始在新创建的 Pod 上接受请求。因此,对于配置了较短超时的应用和 Google Cloud 客户端库,尝试在 Pod 生命周期内的前几秒内使用 Workload Identity 进行身份验证可能会失败。

如果您遇到超时错误,可以更改应用代码以等待几秒钟并重试。或者,您也可以部署 initContainer,等待 GKE 元数据服务器运行完毕,然后再运行 Pod 的主容器。

以下是一个具有示例 initContainer 的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-initcontainer
spec:
  serviceAccountName: KSA_NAME
  initContainers:
  - image:  gcr.io/google.com/cloudsdktool/cloud-sdk:326.0.0-alpine
    name: workload-identity-initcontainer
    command:
    - '/bin/bash'
    - '-c'
    - |
      curl -s -H 'Metadata-Flavor: Google' 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token' --retry 30 --retry-connrefused --retry-max-time 30 > /dev/null || exit 1
  containers:
  - image: gcr.io/your-project/your-image
    name: your-main-application-container

Workload Identity 失败

如果 GKE 元数据服务器由于某种原因被阻止,则 Workload Identity 将失败。

如果您使用的是 Istio,则应将以下应用级注解添加到使用 Workload Identity 的所有工作负载:

"traffic.sidecar.istio.io/excludeOutboundIPRanges=169.254.169.254/32"

或者,您也可以更改 global.proxy.excludeIPRanges Istio ConfigMap 键来执行相同的操作。

在集群上停用 Workload Identity

您只能在 GKE Standard 集群上停用 Workload Identity。

  1. 在每个节点池上停用 Workload Identity:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --workload-metadata=GCE_METADATA
    

    对集群中的每个节点池重复此命令。

  2. 在集群中停用 Workload Identity:

    gcloud container clusters update CLUSTER_NAME --disable-workload-identity
    

    此操作需要集群的 container.clusters.update 权限。

在组织中停用 Workload Identity

从安全角度来看,Workload Identity 允许 GKE 声明可向 Google Cloud 资源进行身份验证并获得 Google Cloud 资源授权的 Kubernetes 服务帐号身份。对于已采取措施将工作负载与 Google Cloud 资源隔离(例如禁止创建服务帐号禁止创建服务帐号密钥)的管理员,可能还希望为组织停用 Workload Identity。

请参阅这些说明以了解如何为组织停用 Workload Identity

Workload Identity 的替代方案

您可以采用两种替代方法从 GKE 访问 Cloud API。不过在 Workload Identity 发布后,我们不再推荐使用这些方法,因为这些方法需要作出一定的妥协。

  1. 导出服务帐号密钥并将其存储为 Kubernetes Secret。Google 服务帐号密钥不会过期,并且需要手动轮替。如果有未被发现的安全漏洞,则导出服务帐号密钥可能会导致安全漏洞范围扩大。

  2. 使用节点的 Compute Engine 服务帐号。您可以项目中的任何 IAM 服务帐号身份运行节点池。如果您在创建节点池期间未指定服务帐号,则 GKE 将使用项目的 Compute Engine 默认服务帐号。Compute Engine 服务帐号由该节点上部署的所有工作负载共享。这会导致权限过度预配。

后续步骤