Workload Identity 集群身份验证

本文档介绍了如何为 Google Distributed Cloud on Bare Metal(纯软件)设置和使用 Workload Identity 集群身份验证。Workload Identity 集群身份验证使用短期令牌和工作负载身份联合来创建集群并确保其安全,而不是使用服务账号密钥。服务账号的短期凭证采用 OAuth 2.0 访问令牌的形式。默认情况下,访问令牌会在 1 小时后过期。同样,映像拉取令牌也会在 1 小时后过期(默认)。

相比之下,“密钥模式”是用于创建和保护集群的标准方法,它使用下载的服务账号密钥。创建自行管理(管理员、混合或独立)集群时,您需要指定所下载密钥的路径。然后,密钥会以 Secret 的形式存储在集群和任何受管理的用户集群中。默认情况下,服务账号密钥永不过期,但如果未正确管理,则会带来安全风险。 如需了解如何为服务账号密钥设置过期时间,请参阅用户管理的密钥的过期时间

与使用服务账号密钥相比,Workload Identity 集群身份验证有以下两个主要优势:

  • 提高安全性:如果服务账号密钥管理不当,则会带来安全风险。OAuth 2.0 令牌和工作负载身份联合被视为服务账号密钥的最佳实践替代方案。如需详细了解服务账号令牌,请参阅短期有效的服务账号凭据。如需详细了解工作负载身份联合,请参阅工作负载身份联合

  • 减少维护工作:服务账号密钥需要更多维护工作。定期轮替和保护这些密钥可能会带来巨大的管理负担。

Workload Identity 集群身份验证在 1.30 版中作为预览版引入,已在 1.33 及更高版本中正式发布。仅当创建新集群时才能启用 Workload Identity 集群身份验证。您无法在更新或升级期间将现有集群配置为使用 Workload Identity 集群身份验证。如需了解其他限制,请参阅限制

本页面适用于负责设置、监控和管理底层技术基础架构生命周期的管理员、架构师和运维人员。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

准备工作

在以下部分中,您将创建服务账号并授予 Workload Identity 集群身份验证所需的角色。本文档中的设置说明并不能取代设置 Google Cloud资源中的说明,而是在标准 Google Distributed Cloud(纯软件)安装前提条件之外额外需要执行的操作。Workload Identity 集群身份验证所需的服务账号与设置Google Cloud 资源中所述的服务账号类似,但它们具有唯一的名称,因此不会干扰使用默认服务账号密钥的集群。

Workload Identity 集群身份验证所需的账号因预览版和正式版产品而异,如下表所述:

1.33 及更高版本

服务账号 用途 角色
admin-sa 您可以使用此服务账号生成令牌。每个令牌都具有与服务账号角色相关联的特权。 roles/gkehub.admin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountTokenCreator
roles/logging.admin
roles/monitoring.admin
roles/resourcemanager.projectIamAdmin
baremetal-gcr Google Distributed Cloud 使用此服务账号从 Artifact Registry 下载容器映像。

1.30-1.32

服务账号 用途 角色
admin-sa 您可以使用此服务账号生成令牌。每个令牌都具有与服务账号角色相关联的特权。 roles/gkehub.admin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountTokenCreator
roles/logging.admin
roles/monitoring.admin
baremetal-controller Connect Agent 使用此服务账号来维护集群与 Google Cloud 之间的连接,并向舰队注册集群。此服务账号还会为 baremetal-gcr 服务账号刷新令牌。 roles/gkehub.admin
roles/monitoring.dashboardEditor
roles/serviceusage.serviceUsageViewer
baremetal-cloud-ops Stackdriver 代理使用此服务账号将日志和指标从集群导出到 Cloud LoggingCloud Monitoring roles/kubernetesmetadata.publisher
roles/logging.logWriter
roles/monitoring.dashboardEditor
roles/monitoring.metricWriter
roles/monitoring.viewer
roles/opsconfigmonitoring.resourceMetadata.writer
roles/serviceusage.serviceUsageViewer
roles/stackdriver.resourceMetadata.writer
baremetal-gcr Google Distributed Cloud 使用此服务账号从 Artifact Registry 下载容器映像。

设置服务账号

以下部分包含有关如何创建所需的服务账号以及向其授予 Workload Identity 集群身份验证所需角色的说明。如需查看服务账号及其所需角色的列表,请参阅上一部分中的表格。

创建服务账号

如需为 Workload Identity 集群身份验证创建服务账号,请按以下步骤操作:

  1. 在管理员工作站上,登录 Google Cloud CLI:

    gcloud auth login
    
  2. 为 Workload Identity 集群身份验证创建所需的服务账号:

    admin-sa 服务账号名称可以是任意的。如果该名称导致项目出现冲突,您可以更改该名称。Workload Identity 集群身份验证的其他服务账号具有预先确定的名称,如果需要,可以自定义

    1.33 及更高版本

    gcloud iam service-accounts create admin-sa \
        --project=PROJECT_ID
    
    gcloud iam service-accounts create baremetal-gcr \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的Google Cloud 项目的 ID。

    1.30-1.32

    gcloud iam service-accounts create admin-sa \
        --project=PROJECT_ID
    
    gcloud iam service-accounts create baremetal-controller \
        --project=PROJECT_ID
    
    gcloud iam service-accounts create baremetal-cloud-ops \
        --project=PROJECT_ID
    
    gcloud iam service-accounts create baremetal-gcr \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的Google Cloud 项目的 ID。

为服务账号添加 Identity and Access Management 政策绑定

请按以下步骤将所需的 Identity and Access Management 政策绑定应用于新的服务账号:

1.33 及更高版本

  1. admin-sa 服务账号添加所需角色的 IAM 政策绑定:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/resourcemanager.projectIamAdmin
    

1.30-1.32

  1. admin-sa 服务账号添加所需角色的 IAM 政策绑定:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.admin
    
  2. baremetal-controller 服务账号添加所需角色的 IAM 政策绑定:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.dashboardEditor
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/serviceusage.serviceUsageViewer
    
  3. baremetal-cloud-ops 服务账号添加所需角色的 IAM 政策绑定:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/kubernetesmetadata.publisher
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.logWriter
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.dashboardEditor
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.metricWriter
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/opsconfigmonitoring.resourceMetadata.writer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/serviceusage.serviceUsageViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/stackdriver.resourceMetadata.writer
    
  4. baremetal-controller 服务账号授予代表 baremetal-gcr 服务账号生成访问令牌的权限:

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-gcr@PROJECT_ID.iam.gserviceaccount.com \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    

设置身份验证

以下步骤用于设置身份验证流程,该流程使用短期令牌对集群操作进行身份验证:

  1. 在管理员工作站上,登录 Google Cloud CLI:

    gcloud auth login
    
  2. 在管理员工作站上,为 admin-sa 服务账号创建并下载密钥:

    此密钥用于向 admin-sa 服务账号授予访问权限。

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    TMP_KEY_FILE_PATH 替换为所下载密钥文件的路径(包括文件名)。

  3. 在管理员工作站上,创建一个 GOOGLE_APPLICATION_CREDENTIALS 环境变量,并将其值设为下载的服务账号密钥:

    export GOOGLE_APPLICATION_CREDENTIALS=TMP_KEY_FILE_PATH
    
  4. 在管理员工作站上,创建一个 GCP_ACCESS_TOKEN 环境变量,并将其值设为由 admin-sa 服务账号创建的访问令牌:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    默认情况下,访问令牌的生命周期为 1 小时。

  5. 验证令牌是否由 admin-sa 服务账号生成,且过期时间正确:

    curl "https://oauth2.googleapis.com/tokeninfo?access_token=$GCP_ACCESS_TOKEN"
    

    响应应包含类似于以下内容的行:

    ...
    "exp": "1759512810",
    "expires_in": "3589",
    ...
    

    过期值以秒为单位,并且应小于 3600,表示令牌将在不到一个小时内过期。

为集群配置工作负载身份联合

如需使用 Workload Identity Federation for GKE 提供 Google Cloud 访问权限,您需要创建 IAM 允许政策,向与应用身份对应的主账号授予对特定Google Cloud 资源的访问权限。在这种情况下,工作负载身份联合会授予对集群中特定操作员的访问权限。如需详细了解 Workload Identity Federation for GKE,请参阅 IAM 文档中的工作负载身份联合

1.33 及更高版本

对于 Workload Identity 集群身份验证处于正式版阶段的集群版本,您可以使用 bmctl configure projects 命令为集群配置工作负载身份联合。此命令已纳入创建管理员集群创建用户集群的步骤中。

1.30-1.32

对于 Workload Identity 集群身份验证处于预览版阶段的集群版本,您必须按照以下部分中的说明,手动为集群配置工作负载身份联合。

为集群运维人员添加 IAM 政策绑定

以下命令可向 anthos-cluster-operator Kubernetes 服务账号授予模拟 baremetal-controller 服务账号并代表集群与 Google Cloud 资源进行交互的权限:

  1. 对于已针对 Workload Identity 集群身份验证进行了配置(或计划使用 Workload Identity 集群身份验证)的每个集群(包括引导集群),请向集群中的 anthos-cluster-operator 授予模拟 baremetal-controller 服务账号的权限:

    在以下命令中,principalSet 由工作负载身份池和 kube-system 命名空间中的 Kubernetes 服务账号 anthos-cluster-operator 组成。

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/anthos-cluster-operator \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    

    替换以下内容:

  2. 验证 baremetal-controller 服务账号的政策绑定:

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

    响应应类似如下所示:

    bindings:
    - members:
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/anthos-cluster-operator
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/anthos-cluster-operator
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/anthos-cluster-operator
      role: roles/iam.workloadIdentityUser
    etag: BwYoN3QLig0=
    version: 1
    

为 Google Cloud Observability 运维人员添加 IAM 政策绑定

以下命令会向以下 Google Cloud Observability Kubernetes 服务账号授予模拟 baremetal-cloud-ops 服务账号并代表集群与 Google Cloud 资源进行交互的权限:

  • cloud-audit-logging
  • gke-metrics-agent
  • kubestore-collector
  • metadata-agent
  • stackdriver-log-forwarder
  1. 对于已针对 Workload Identity 集群身份验证进行了配置(或计划使用 Workload Identity 集群身份验证)的每个集群(包括引导集群),请向集群中的 Google Cloud Observability Operator 授予模拟 baremetal-cloud-ops 服务账号的权限:

    在以下各个命令中,principalSet 由工作负载身份池和 kube-system 命名空间中的 Kubernetes 服务账号(例如 cloud-audit-logging)组成。

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/cloud-audit-logging \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/gke-metrics-agent \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/kubestore-collector \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/metadata-agent \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/stackdriver-log-forwarder \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
  2. 验证 baremetal-cloud-ops 服务账号的政策绑定:

    gcloud iam service-accounts get-iam-policy \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com
    

    响应应类似如下所示:

    bindings:
    - members:
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/stackdriver-log-forwarder
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/stackdriver-log-forwarder
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/stackdriver-log-forwarder
      role: roles/iam.workloadIdentityUser
    etag: BwYhT4gL-dY=
    version: 1
    

创建管理员集群

对于预览版(版本 1.30-1.32)和正式版(版本 1.33 及更高版本),创建管理员集群的步骤略有不同。正式版步骤使用 bmctl configure projects 命令为集群配置工作负载身份联合。

1.33 及更高版本

对于使用 Workload Identity 集群身份验证的集群,最明显的集群配置差异在于,您无需指定下载的服务账号密钥的路径。

  1. 在配置文件中填写集群设置时,请将凭证部分中的服务账号密钥路径留空,如以下示例所示:

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  2. 向集群配置文件 baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true" 添加注解:

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
      annotations:
        baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  3. 在管理员工作站上,使用新检索到的访问令牌更新 GCP_ACCESS_TOKEN 环境变量:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    默认情况下,访问令牌的生命周期为 3600 秒(1 小时)。使用 Workload Identity 集群身份验证时,bmctl 会检查令牌过期时间。如果令牌过期时间在 1800 秒(30 分钟)内,bmctl 会报告错误并退出。

  4. 为要创建的集群配置工作负载身份联合:

    bmctl configure projects --project-id=PROJECT_ID \
        --admin-cluster=ADMIN_CLUSTER_NAME
    
  5. 运行 bmctl create cluster 命令以创建管理员集群。

1.30-1.32

对于使用 Workload Identity 集群身份验证的集群,最明显的集群配置差异在于,您无需指定下载的服务账号密钥的路径。

  1. 在配置文件中填写集群设置时,请将凭证部分中的服务账号密钥路径留空,如以下示例所示:

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  2. 在管理员工作站上,为 admin-sa 服务账号创建并下载密钥:

    此密钥用于向 admin-sa 服务账号授予访问权限,您需要在服务账号获得授权后立即将其删除。

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    TMP_KEY_FILE_PATH 替换为所下载密钥文件的路径(包括文件名)。

  3. admin-sa 服务账号授予 Google Cloud 访问权限:

    gcloud auth activate-service-account admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --key-file=TMP_KEY_FILE_PATH
    
  4. 删除下载的 JSON 密钥文件:

    rm TMP_KEY_FILE_PATH
    

    访问令牌在短期内有效,因此您通常需要在运行 bmctl 命令来执行集群操作(例如创建、升级或重置集群)之前重新生成该令牌。

  5. 在管理员工作站上,创建一个 GCP_ACCESS_TOKEN 环境变量,并将其值设为由 admin-sa 服务账号创建的访问令牌:

    export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \
        --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)
    

    默认情况下,访问令牌的生命周期为 3600 秒(1 小时)。

  6. 运行 bmctl create cluster 命令以创建管理员集群。

创建用户集群

对于预览版(版本 1.30-1.32)和正式版(版本 1.33 及更高版本),创建管理员集群的步骤略有不同。正式版步骤使用 bmctl configure projects 命令为集群配置工作负载身份联合。

1.33 及更高版本

  1. 向集群配置文件 baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true" 添加注解:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-USER_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: USER_CLUSTER_NAME
      namespace: cluster-USER_CLUSTER_NAME
      annotations:
        baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    

    访问令牌在短期内有效,因此您通常需要在运行 bmctl 命令来执行集群操作(例如创建、升级或重置集群)之前重新生成该令牌。

  2. 在管理员工作站上,使用新检索到的访问令牌更新 GCP_ACCESS_TOKEN 环境变量:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    默认情况下,访问令牌的生命周期为 3600 秒(1 小时)。

  3. 为要创建的集群配置工作负载身份联合:

    bmctl configure projects --project-id=PROJECT_ID \
        --user-clusters=USER_CLUSTER_NAME
    
  4. 使用 kubectl 部署用户集群清单:

    kubectl apply -f USER_CLUSTER_CONFIG \
        --kubeconfig ADMIN_KUBECONFIG
    

替换以下内容:

  • USER_CLUSTER_CONFIG:用户集群配置文件的路径。

  • ADMIN_KUBECONFIG:管理员集群的 kubeconfig 文件的路径。

1.30-1.32

  1. 在管理员工作站上,为 admin-sa 服务账号创建并下载密钥:

    此密钥用于向 admin-sa 服务账号授予访问权限,您需要在服务账号获得授权后立即将其删除。

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    TMP_KEY_FILE_PATH 替换为所下载密钥文件的路径(包括文件名)。

  2. admin-sa 服务账号授予 Google Cloud 访问权限:

    gcloud auth activate-service-account admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --key-file=TMP_KEY_FILE_PATH
    
  3. 删除下载的 JSON 密钥文件:

    rm TMP_KEY_FILE_PATH
    

    访问令牌在短期内有效,因此您通常需要在运行 bmctl 命令来执行集群操作(例如创建、升级或重置集群)之前重新生成该令牌。

  4. 在管理员工作站上,创建一个 GCP_ACCESS_TOKEN 环境变量,并将其值设为由 admin-sa 服务账号创建的访问令牌:

    export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \
        --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)
    

    默认情况下,访问令牌的生命周期为 3600 秒(1 小时)。

  5. 运行 bmctl create cluster 命令以创建用户集群。

其他集群操作

对于使用 Workload Identity 集群身份验证的集群,以下 bmctl 命令要求将 GCP_ACCESS_TOKEN 环境变量设置为有效的活跃访问令牌:

  • bmctl configure projects
  • bmctl create cluster
  • bmctl reset cluster
  • bmctl upgrade cluster

如果 bmctl 检测到已设置 GCP_ACCESS_TOKEN 环境变量,则会执行令牌验证:

  • 如果令牌有效,bmctl 会将其用于集群操作。

  • 如果令牌无效,请检索新令牌:

    访问令牌在短期内有效,因此您通常需要在运行 bmctl 命令来执行集群操作(例如创建、升级或重置集群)之前重新生成该令牌。在管理员工作站上,使用新检索到的访问令牌更新 GCP_ACCESS_TOKEN 环境变量:

    1.33 及更高版本

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    1.30-1.32

    export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \
        --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)
    

    默认情况下,访问令牌的生命周期为 3600 秒(1 小时)。使用 Workload Identity 集群身份验证时,bmctl 会检查令牌过期时间。如果令牌过期时间在 1800 秒(30 分钟)内,bmctl 会报告错误并退出。

自定义

只要服务账号具有用于所需角色的绑定,您便可以将具有唯一名称的服务账号用于 Workload Identity 集群身份验证。

1.33 及更高版本

默认情况下,对于 1.33 及更高版本的集群,Workload Identity 集群身份验证仅使用 baremetal-gcr 服务账号。因此,这是唯一可以自定义的服务账号。

  1. 确保您要使用的服务账号具有准备工作中的表格中列出的角色。

  2. 对集群配置文件添加注释,以指定 Workload Identity 集群身份验证服务账号的自定义名称:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
      annotations:
        ...
        baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_AR_GSA"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    

CUSTOM_AR_GSA 替换为 Google Distributed Cloud 用于从 Artifact Registry 下载容器映像的服务账号的电子邮件名称。

1.30-1.32

  1. 确保您要使用的服务账号具有准备工作中的表格中列出的角色。

  2. 为集群配置文件添加注释,以指定 Workload Identity 集群身份验证服务账号的自定义名称:

    通过指定自定义名称,您可以使用现有服务账号。请确保您指定的自定义服务账号名称彼此不同。我们不支持使用单个服务账号来替换两个或更多默认服务账号。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
      annotations:
        ...
        baremetal.cluster.gke.io/controller-service-account: "CUSTOM_CONTROLLER_GSA"
        baremetal.cluster.gke.io/cloud-ops-service-account: "CUSTOM_CLOUD_OPS_GSA"
        baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_AR_GSA"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.30.0-gke.1930
      ...
    

替换以下内容:

  • CUSTOM_CONTROLLER_GSA:Connect Agent 使用的服务账号的电子邮件名称,用于维护集群与 Google Cloud之间的连接,以及注册集群。

  • CUSTOM_CLOUD_OPS_GSA:Stackdriver Agent 用于将日志和指标从集群导出到 Cloud Logging 和 Cloud Monitoring 的服务账号的邮箱名称。

  • CUSTOM_AR_GSA:Google Distributed Cloud 用于从 Artifact Registry 下载容器映像的服务账号的电子邮件名称。

限制

当您为 Google Distributed Cloud on Bare Metal(纯软件)使用 Workload Identity 集群身份验证时,不支持以下功能:

  • 使用代理服务器
  • VPC Service Controls
  • 将现有的密钥模式集群更新为使用 Workload Identity 集群身份验证
  • 使用 GKE On-Prem API 客户端(例如 Google Cloud CLI、Terraform 或 Google Cloud 控制台)进行集群生命周期管理

后续步骤