使用不记名令牌进行身份验证
本页面介绍如何使用不记名令牌设置身份验证,以登录 Google Cloud 外部的已注册集群。设置完成后,集群管理员可以从 Google Cloud 控制台登录集群。 支持 Kubernetes 身份验证中指定的多种不记名令牌。最简单的方法是在集群中创建 Kubernetes 服务账号 (KSA),并使用其不记名令牌登录。
其他身份验证方法
作为使用不记名令牌设置身份验证的替代方案,您可以根据组织的需要设置以下身份验证方法之一:
Google Identity,允许用户使用 Google Cloud 身份登录。如果您的用户已有权使用 Google Identity 访问 Google Cloud,请使用此选项。
如果您的集群配置为使用 OIDC 身份提供商,则可以使用此身份从 Google Cloud 控制台向集群进行身份验证。您可以参考以下指南,了解如何为 GKE 集群设置 OIDC:
- 使用 OIDC 为 GKE Identity Service 配置集群。 本指南介绍如何为所有 GKE 集群类型逐个集群地设置 OIDC 身份验证。
- 为舰队设置 GKE Identity Service。通过此选项,您可以在集群级层为受支持的集群类型设置 OIDC。Google Cloud 上的 GKE 集群、所有 GKE 集群类型以及 AWS 上的 EKS 关联集群支持舰队级设置。
如果 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 和存储类别的 get
、list
和 watch
权限,从而允许他们查看这些资源的详细信息。
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 并对其绑定权限,请按以下步骤操作:
创建 KSA 和
ClusterRoleBinding
资源,将view
和cloud-console-reader
Kubernetes RBACClusterRoles
绑定到 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
资源选择的名称;您还可以随意为其命名
根据服务账号应具有的访问权限,为 KSA 绑定额外的角色。如需了解选项,请参阅 Kubernetes 默认角色。
例如,如果要从 Cloud Marketplace 部署 Kubernetes 应用,您必须将
cluster-admin
角色绑定到 KSA:kubectl create clusterrolebinding BINDING_NAME \ --clusterrole cluster-admin --serviceaccount default:KSA_NAME
将
BINDING_NAME
替换为服务账号的集群角色绑定的名称。
授权其他账号
kubectl
对于获得集群访问权限的其他所有用户或服务账号,请创建 ClusterRoleBinding
资源以将 view
和 cloud-console-reader
角色绑定到它们的账户:
绑定
view
和cloud-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
资源选择的名称;您还可以随意为其命名
绑定其他角色,具体取决于账号应拥有的访问权限。如需了解选项,请参阅 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 控制台。