使用不记名令牌进行身份验证

本页面介绍如何使用不记名令牌设置身份验证,以登录 Google Cloud 外部的已注册集群。设置完成后,集群管理员可以从 Google Cloud 控制台登录集群。 支持 Kubernetes 身份验证中指定的多种不记名令牌。最简单的方法是在集群中创建 Kubernetes 服务账号 (KSA),并使用其不记名令牌登录。

其他身份验证方法

作为使用不记名令牌设置身份验证的替代方案,您可以根据组织的需要设置以下身份验证方法之一:

  • Google Identity,允许用户使用 Google Cloud 身份登录。如果您的用户已有权使用 Google Identity 访问 Google Cloud,请使用此选项。

  • 如果您的集群配置为使用 OIDC 身份提供商,则可以使用此身份从 Google Cloud 控制台向集群进行身份验证。您可以参考以下指南,了解如何为 GKE 集群设置 OIDC:

如果 Google 提供的这些身份验证方法不适合您的组织,请按照本页面上的说明使用不记名令牌设置身份验证。

授予通过 Google Cloud 控制台进行访问的 IAM 角色

想要使用 Google Cloud 控制台查看已连接集群的用户至少需要具有以下 IAM 角色:

  • roles/container.viewer。此角色允许用户在 Google Cloud 控制台中查看容器资源,包括“GKE 集群”页面。如需详细了解此角色具备的权限,请参阅 IAM 文档中的 Kubernetes Engine 角色

  • roles/gkehub.viewer。此角色允许用户在 Google Cloud 控制台中查看 Google Cloud 外部的集群。如果您的舰队不包含 Google Cloud 外部的集群,则用户不需要此角色。如需详细了解此角色具备的权限,请参阅 IAM 文档中的 GKE Hub 角色

运行以下命令以授予这些角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:EMAIL_ADDRESS' \
    --role=roles/container.viewer
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:EMAIL_ADDRESS' \
    --role=roles/gkehub.viewer

替换以下内容:

  • PROJECT_ID:舰队宿主项目的 ID。

  • EMAIL_ADDRESS:与用户的 Google Cloud 账号关联的电子邮件地址。

如需详细了解如何授予 IAM 角色,请参阅 IAM 文档中的管理对项目、文件夹和组织的访问权限

配置基于角色的访问控制

对集群的访问权限使用 Kubernetes 基于角色的访问控制 (RBAC) 进行控制。

建议您或集群管理员为登录集群的每个用户创建一个 KSA。使用不记名令牌就像使用密码,因此每个用户都应该有自己的令牌。使用 KSA 的不记名令牌登录会导致所有操作都以 KSA 身份执行,且受 KSA 拥有的 RBAC 角色的限制。

KSA 至少需要在集群中具有以下 RBAC 角色才能通过控制台访问集群:

创建并应用 cloud-console-reader RBAC 角色

想要在 Google Cloud 控制台中访问集群资源并且经过身份验证的用户需要具备相关的 Kubernetes 权限。如果您不想向这些用户授予更广泛的权限(例如集群管理员的权限),则可以创建一个包含查看集群节点、永久性卷、pod 和存储类别的最低权限的自定义 RBAC 角色。您可以通过在集群中创建 ClusterRole RBAC 资源 cloud-console-reader 来定义这组权限。

cloud-console-reader 会向用户授予针对集群的节点、永久性卷、pod 和存储类别的 getlistwatch 权限,从而允许他们查看这些资源的详细信息。

kubectl

要创建 cloud-console-reader ClusterRole 并将其应用于集群,请运行以下命令:

cat <<EOF > cloud-console-reader.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cloud-console-reader
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes", "pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
EOF
kubectl apply -f cloud-console-reader.yaml

然后,您可以向 KSA 授予此角色,如下一部分所述。

创建和授权 KSA

kubectl

如要创建 KSA 并对其绑定权限,请按以下步骤操作:

  1. 创建 KSA 和 ClusterRoleBinding 资源,将 viewcloud-console-reader Kubernetes RBAC ClusterRoles 绑定到 KSA。

    KSA_NAME=KSA_NAME
    kubectl create serviceaccount ${KSA_NAME}
    kubectl create clusterrolebinding VIEW_BINDING_NAME \
       --clusterrole view --serviceaccount default:${KSA_NAME}
    kubectl create clusterrolebinding CLOUD_CONSOLE_READER_BINDING_NAME \
       --clusterrole cloud-console-reader --serviceaccount default:${KSA_NAME}
    

    替换以下内容:

    • KSA_NAME:您为 KSA 选择的名称
    • VIEW_BINDING_NAME:您为 view ClusterRoleBinding 资源选择的名称;您可以随意为其命名,但以 KSA 为其命名最简单。
    • CLOUD_CONSOLE_READER_BINDING_NAME:您为 cloud-console-reader ClusterRoleBinding 资源选择的名称;您还可以随意为其命名
  2. 根据服务账号应具有的访问权限,为 KSA 绑定额外的角色。如需了解选项,请参阅 Kubernetes 默认角色

    例如,如果要从 Cloud Marketplace 部署 Kubernetes 应用,您必须将 cluster-admin 角色绑定到 KSA:

    kubectl create clusterrolebinding BINDING_NAME \
       --clusterrole cluster-admin --serviceaccount default:KSA_NAME
    

    BINDING_NAME 替换为服务账号的集群角色绑定的名称。

授权其他账号

kubectl

对于获得集群访问权限的其他所有用户或服务账号,请创建 ClusterRoleBinding 资源以将 viewcloud-console-reader 角色绑定到它们的账户:

  1. 绑定 viewcloud-console-reader ClusterRoles

    ACCOUNT_NAME=ACCOUNT_NAME
    kubectl create clusterrolebinding VIEW_BINDING_NAME \
       --clusterrole view --serviceaccount default:${ACCOUNT_NAME}
    kubectl create clusterrolebinding CLOUD_CONSOLE_READER_BINDING_NAME \
       --clusterrole cloud-console-reader --serviceaccount default:${ACCOUNT_NAME}
    

    替换以下内容:

    • ACCOUNT_NAME:Kubernetes 服务账号
    • VIEW_BINDING_NAME:您为 view ClusterRoleBinding 资源选择的名称;您可以随意为其命名,但以用户或服务账号为其命名最简单。
    • CLOUD_CONSOLE_READER_BINDING_NAME:您为 view ClusterRoleBinding 资源选择的名称;您还可以随意为其命名
  2. 绑定其他角色,具体取决于账号应拥有的访问权限。如需了解选项,请参阅 Kubernetes 默认角色

    例如,如需绑定 cluster-admin 角色,请运行以下命令:

    kubectl create clusterrolebinding BINDING_NAME \
       --clusterrole cluster-admin --serviceaccount default:ACCOUNT_NAME
    

    BINDING_NAME 替换为服务账号的集群角色绑定的名称。

获取 KSA 的不记名令牌

kubectl

要获取 KSA 的不记名令牌,请运行以下命令:

SECRET_NAME=KSA_NAME-token

kubectl apply -f - << __EOF__
apiVersion: v1
kind: Secret
metadata:
  name: "${SECRET_NAME}"
  annotations:
    kubernetes.io/service-account.name: "${KSA_NAME}"
type: kubernetes.io/service-account-token
__EOF__

until [[ $(kubectl get -o=jsonpath="{.data.token}" "secret/${SECRET_NAME}") ]]; do
  echo "waiting for token..." >&2;
  sleep 1;
done

kubectl get secret ${SECRET_NAME} -o jsonpath='{$.data.token}' | base64 --decode

KSA_NAME 替换为您为 KSA 选择的名称。

在此命令的输出中,复制令牌并进行保存,以便用户使用该令牌登录 Google Cloud 控制台