使用 OIDC 和 Google 进行身份验证

本页面介绍如何将 OpenID Connect (OIDC) 与 GKE On-Prem 搭配使用。要使用 OIDC,您必须指定 OpenID 提供方。本主题介绍如何将 GKE On-Prem 配置为使用 Google 作为 OpenID 提供方。

如需简要了解身份验证流程,请参阅身份验证。如需简要了解如何将 OpenID 提供方与 GKE On-Prem 搭配使用,请参阅使用 OpenID Connect 进行身份验证

限制

Google OpenID 提供方不支持群组。当您使用 Kubernetes 基于角色的访问权限控制 (RBAC) 向经过身份验证的用户授予角色时,必须向单个用户(而非群组)授予角色。

概览

GKE On-Prem 支持使用 OpenID Connect (OIDC) 作为与用户集群的 Kubernetes API 服务器进行交互的身份验证机制之一。借助 OIDC,您可以按照组织中创建、启用和停用员工帐号的标准过程来管理对 Kubernetes 集群的访问权限。

员工可以通过两种方式使用 OIDC 身份验证流程:

  • 员工可以使用 kubectl 启动 OIDC 流程。为了实现此流程的自动化,GKE On-Prem 提供适用于 Kubectl 的 Anthos 插件,这是一个 kubectl 插件

  • 员工可以使用 Google Cloud Console 启动 OIDC 身份验证流程。

在本练习中,您将配置两个选项:kubectl 和 Google Cloud 控制台。

准备工作

在阅读本主题之前,您应该先熟悉 OAuth 2.0OpenID Connect。您还应该熟悉 OpenID 范围声明

角色

本主题涉及三个角色:

  • 组织管理员:此角色选择 OpenID 提供方,并向提供方注册客户端应用。

  • 集群管理员:此角色创建一个或多个用户集群,并为使用这些集群的开发者创建身份验证配置文件。

  • 开发者:此角色在一个或多个集群上运行工作负载,并使用 OIDC 进行身份验证。

为适用于 Kubectl 的 Anthos 插件创建重定向网址

本部分面向组织管理员

作为将 Google 配置为您的 OpenID 提供方的一部分,您必须指定一个重定向网址,以便 Google 使用此网址将 ID 令牌返回到适用于 Kubectl 的 Anthos 插件。适用于 Kubectl 的 Anthos 插件在每个开发者的本地机器上运行,并侦听您选择的端口。选择适合此用途且大于 1024 的端口号。然后,重定向网址为:

http://localhost:[PORT]/callback

其中,[PORT] 是您的端口号。

配置 Google OpenID 提供商时,请将 http://localhost:[PORT]/callback 指定为您的重定向网址之一。

为 Google Cloud 控制台配置重定向网址

本部分面向组织管理员

除了拥有适用于 Kubectl 的 Anthos 插件的重定向网址之外,您还需要一个 Google Cloud 控制台重定向网址。Google Cloud 控制台的重定向网址为:

https://console.cloud.google.com/kubernetes/oidc

配置 Google OpenID 提供商时,请将 https://console.cloud.google.com/kubernetes/oidc 指定为您的重定向网址之一。

在此部分中,您将配置 Google 的 OAuth 同意屏幕。当您组织中的开发者向用户集群启动身份验证时,系统会转到此同意屏幕。届时,他们会向 Google 证明自己的身份,并授权 Google 创建令牌,以向 OAuth 客户端提供识别信息。在本主题的上下文中,OAuth 客户端是适用于 Kubectl 的 Anthos 插件或 Google Cloud 控制台。

  1. 转到 Google Cloud 控制台中的 OAuth 权限请求屏幕页面。

    配置 OAuth 权限请求屏幕

  2. 选择内部,然后点击创建

  3. 对于应用类型,选择内部

  4. 对于应用名称,输入您选择的名称。建议使用 GKE on-prem

  5. 授权网域下,添加 google.com

  6. 根据需要填写其他字段。

  7. 点击保存

向 Google 注册客户端应用

在本部分中,您将向 Google 注册 GKE On-Prem,以便 Google 可以充当贵组织中开发者的 OpenID 提供方。作为注册的一部分,您必须提供您之前创建的两个重定向网址。

  1. 转到 Google Cloud Console 中的凭据页面。

    转到“凭据”页面

  2. 点击创建凭据并选择 OAuth 客户端 ID

  3. 对于应用类型,选择 Web 应用

  4. 对于名称,输入您选择的名称。

  5. 已获授权的重定向 URI 下,添加两个重定向网址。回想一下,您已经创建了适用于 Kubectl 的 Anthos 插件的重定向网址,以及 Google Cloud 控制台的重定向网址

  6. 点击创建

  7. 系统会为您提供客户端 ID 和客户端密钥。保存这些内容以备日后使用。

在 GKE On-Prem 配置文件中填充 oidc 规范

本部分面向集群管理员

在创建用户集群之前,可使用 gkectl create-config 生成 GKE On-Prem 配置文件。配置包括以下 oidc 规范。您可使用特定于您的提供方的值来填充 oidc

oidc:
  issuerurl:
  kubectlredirecturl:
  clientid:
  clientsecret:
  username:
  usernameprefix:
  group:
  groupprefix:
  scopes:
  extraparams:
  usehttpproxy:
  capath:
  • issuerurl:将此项设置为 "https://accounts.google.com"。客户端应用(如适用于 Kubectl 的 Anthos 插件和 Google Cloud 控制台)会向此网址发送授权请求。Kubernetes API 服务器使用此网址来发现用于验证令牌的公钥。
  • kubectlredirecturl:您之前为适用于 Kubectl 的 Anthos 插件配置的重定向网址
  • clientid:向 OpenID 提供商发出身份验证请求的客户端应用的 ID。适用于 Kubectl 的 Anthos 插件和 Google Cloud 控制台都使用此 ID。 当您通过 Google 注册客户端应用时,系统会向您提供此 ID。
  • clientsecret:客户端应用的密钥。适用于 Kubectl 的 Anthos 插件和 Google Cloud 控制台都使用此 Secret。当您通过 Google 注册客户端应用时,系统会向您提供此 ID。
  • username:将此项设置为 "email"
  • usernameprefix:可选。附加到用户名声明前面的前缀,以防止与现有名称冲突。如果您未提供此字段,并且 usernameemail 以外的值,则前缀默认为 issuerurl#。您可以使用值 - 停用所有前缀。
  • group:将此项留空。
  • groupprefix:将此项留空。
  • scopes:将此项设置为 "email"
  • extraparams:将此项设置为 "prompt=consent,access_type=offline"
  • usehttpproxy:将此项设置为 "false"
  • capath:将此项留空。

为您的用户集群创建 RBAC 政策

本部分面向集群管理员

创建集群后,请使用 Kubernetes 基于角色的访问权限控制 (RBAC) 向经过身份验证的集群用户授予访问权限。要授予对特定命名空间中的资源的访问权限,请创建 RoleRoleBinding。要授予对整个集群的资源的访问权限,请创建 ClusterRoleClusterRoleBinding

使用 Google 作为 OpenID 提供方时,您必须向单个用户授予访问权限。授予群组访问权限无效。这是因为 Google OpenID 提供商返回的令牌不包含有关单个用户所属群组的任何信息。

例如,假设您希望 jane@example.com 可以查看集群中的所有 Secret 对象。

以下是名为 secret-viewer 的 ClusterRole 的清单。被授予此角色的人可以获取、查看和列出集群中的任何 Secret。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-viewer
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

以下是名为 people-who-view-secrets 的 ClusterRoleBinding 的清单。绑定会将 secret-viewer 角色授予名为 jane@example.com 的用户。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: people-who-view-secrets
subjects:
- kind: User
  name: jane@example.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-viewer
  apiGroup: rbac.authorization.k8s.io

要创建 ClusterRole,请将清单保存到名为 secret-viewer-cluster-role.yaml 的文件中,然后输入以下命令:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f secret-viewer-cluster-role.yaml

其中,[USER_CLUSTR_KUBECONFIG] 是用户集群的 kubeconfig 文件。

要创建 ClusterRoleBinding,请将清单保存到名为 secret-viewer-cluster-role-binding.yaml 的文件中,然后输入以下命令:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f secret-viewer-cluster-role-binding.yaml

创建您的首个身份验证配置文件

本部分面向集群管理员

创建用户集群后,请为集群创建身份验证配置文件:

gkectl create-login-config --kubeconfig [USER_CLUSTER_KUBECONFIG]

其中,[USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件的路径。创建用户集群后,gkectl create cluster 会为集群生成一个 kubeconfig 文件。

上述命令会在当前目录中创建一个名为 kubectl-anthos-config.yaml 的文件。

将其他集群添加到您的身份验证配置文件中

本部分面向集群管理员

您可以将多个集群的身份验证配置存储在一个文件中。然后,您可以将该文件分发给应该有权访问所有集群的开发者。

从现有身份验证配置文件开始。然后,使用以下命令将该文件与其他集群的配置合并:

gkectl create-login-config --kubeconfig [USER_CLUSTER_KUBECONFIG] \
    --merge-from [IN_AUTH_CONFIG_FILE] --output [OUT_AUTH_CONFIG_FILE]

其中

  • [USER_CLUSTER_KUBECONFIG] 是其他集群的 kubeconfig 文件。

  • [IN_AUTH_CONFIG_FILE] 是现有身份验证配置文件的路径。

  • [OUT_AUTH_CONFIG_FILE] 是您要保存包含合并配置的文件的路径。它可以与 [IN_AUTH_CONFIG_FILE] 相同。

分发身份验证配置文件

本部分面向集群管理员

您分发给开发者的身份验证配置文件必须命名为 kubectl-anthos-config.yaml。您可以通过多种方式分发身份验证配置文件:

  • 手动将文件提供给每个开发者。

  • 将文件托管在某个网址,以便开发者可以下载该文件。

  • 将文件推送到每个开发者的机器上。

无论您使用哪种分发方法,身份验证配置文件都必须放在每个开发者所用机器的以下位置:

Linux

$HOME/.config/google/anthos/kubectl-anthos-config.yaml

macOS

$HOME/Library/Preferences/google/anthos/kubectl-anthos-config.yaml

Windows

%APPDATA%\google\anthos\kubectl-anthos-config.yaml

放置身份验证配置文件

本部分面向开发者

身份验证配置文件包含您可以进行身份验证的所有集群的详细信息。请勿修改此文件的内容。

如果您的集群管理员为您提供了身份验证配置文件,请将该文件放在正确的目录中。如果您的集群管理员已将配置放到您的机器上,您可以跳过此部分。

将您的身份验证配置文件复制到其默认位置:

Linux

mkdir -p  $HOME/.config/google/anthos/
cp [AUTH_CONFIG_FILE] $HOME/.config/google/anthos/kubectl-anthos-config.yaml

其中,[AUTH_CONFIG_FILE] 是您的身份验证配置文件的名称。

macOS

mkdir -p  $HOME/Library/Preferences/google/anthos/
cp [AUTH_CONFIG_FILE] $HOME/Library/Preferences/google/anthos/kubectl-anthos-config.yaml

其中,[AUTH_CONFIG_FILE] 是您的身份验证配置文件的名称。

Windows

md "%APPDATA%\google\anthos"
copy [AUTH_CONFIG_FILE] "%APPDATA%\google\anthos\kubectl-anthos-config.yaml"

其中,[AUTH_CONFIG_FILE] 是您的身份验证配置文件的名称。

获取适用于 Kubectl 的 Anthos 插件

本部分面向集群管理员

适用于 Kubectl 的 Anthos 插件位于管理员工作站中的以下位置:

Linux

/usr/bin/kubectl_anthos/v1.0beta/linux_amd64/kubectl-anthos

macOS

/usr/bin/kubectl_anthos/v1.0beta/darwin_amd64/kubectl-anthos

Windows

/usr/bin/kubectl_anthos/v1.0beta/windows_amd64/kubectl-anthos

您可以将插件分发给开发者,也可以让他们直接下载插件。

下载适用于 Kubectl 的 Anthos 插件

本部分面向集群管理员和开发者

每个开发者都需要在自己的机器上安装适用于 Kubectl 的 Anthos 插件。开发者可以自行下载插件,也可以由集群管理员下载插件,然后将其分发给开发者。

开发者注意事项:请询问您的集群管理员,您应该使用哪个版本的插件。

下载适用于 Kubectl 的 Anthos 插件:

Linux

gsutil cp gs://gke-on-prem-release/kubectl-anthos/v1.0beta/linux_amd64/kubectl-anthos ./
chmod +x kubectl-anthos

macOS

gsutil cp gs://gke-on-prem-release/kubectl-anthos/v1.0beta/darwin_amd64/kubectl-anthos ./
chmod +x kubectl-anthos

Windows

gsutil cp gs://gke-on-prem-release/kubectl-anthos/v1.0beta/windows_amd64/kubectl-anthos ./
rename kubectl-anthos kubectl-anthos.exe.

安装适用于 Kubectl 的 Anthos 插件

本部分面向开发者

您的集群管理员可能会向您提供适用于 Kubectl 的 Anthos 插件。您的集群管理员也可能会告诉您自行下载插件

要安装适用于 Kubectl 的 Anthos 插件,请将可执行文件移到路径上的任意位置。可执行文件必须命名为 kubectl-anthos。如需了解详情,请参阅安装 kubectl 插件

验证是否安装了适用于 Kubectl 的 Anthos 插件:

kubectl plugin list
kubectl anthos version

列出可用的集群

本部分面向开发者

如果您的身份验证配置文件位于默认路径中,请输入以下命令来列出您可以进行身份验证的集群:

kubectl anthos listclusters

如果您的身份验证配置文件没有位于默认路径中,请输入以下命令来列出集群:

kubectl anthos listclusters --loginconfig [AUTH_CONFIG_FILE]

其中,[AUTH_CONFIG_FILE] 是您的身份验证配置文件的路径。

使用适用于 Kubectl 的 Anthos 插件进行身份验证

本部分面向开发者

登录到用户集群:

kubectl anthos login --cluster [CLUSTER_NAME] --user [USER_NAME] \
    --loginconfig [AUTH_CONFIG_FILE] --kubeconfig [USER_CLUSTER_KUBECONFIG]

其中:

  • [CLUSTER_NAME] 是您的用户集群的名称。您必须从 kubectl anthos listclusters 命令提供的列表中选择此名称。

  • [USER_NAME] 是一个可选参数,用于指定存储在 kubeconfig 文件中的凭据的用户名。默认值为 [CLUSTER_NAME]-anthos-default-user

  • [AUTH_CONFIG_FILE] 是您的身份验证配置文件的路径。如果您的身份验证配置文件位于默认位置,则可以省略此参数。

  • [USER_CLUSTER_KUBECONFIG] 是用户集群的 kubeconfig 文件的路径。如果 kubeconfig 文件不存在,该命令会从身份验证配置文件生成新的 kubeconfig 文件,并将集群详细信息和令牌添加到 kubeconfig 文件。

kubectl anthos login 会启动浏览器,您可以在其中输入凭据。

现在提供的 kubeconfig 文件包含一个 ID 令牌,kubectl 可使用该令牌向用户集群上的 Kubernetes API 服务器进行身份验证。

kubectl anthos login 命令有一个可选的 --dry-run 标志。如果您添加了 --dry-run 标志,则该命令会输出 kubectl 命令,后者会将令牌添加到 kubeconfig 文件中,但不会真正将该令牌保存到 kubeconfig 文件中。

通过输入 kubectl 命令验证身份验证是否成功。例如:

kubectl get nodes --kubeconfig [USER_CLUSTER_KUBECONFIG]

将 OIDC 与 Google Cloud Console 搭配使用

本部分面向开发者

  1. 验证您的集群是否已针对 OIDC 进行了配置

  2. 验证您的集群是否已向 Google Cloud 注册(无论是在创建集群时自动注册还是手动注册)。

  3. 访问 Google Cloud 控制台中的 Kubernetes 集群页面。

    访问 Kubernetes 集群页面

  4. 在集群列表中,找到您的 GKE On-Prem 集群,然后点击登录

  5. 选择使用为集群配置的身份提供商服务执行身份验证,然后点击登录

    系统会将您重定向到您的身份提供商,您可能需要登录或同意 Google Cloud 控制台访问您的帐号。然后,系统会将您重定向回 Google Cloud 控制台中的 Kubernetes 集群页面。

自定义配置

默认情况下,适用于 Kubectl 的 Anthos 插件要求身份验证配置文件位于特定位置。如果您不想将身份验证配置文件置于默认位置,可以使用 --login-config 标志手动将身份验证配置文件的路径传递给插件命令。如需查看示例,请参阅使用适用于 Kubectl 的 Anthos 插件进行身份验证

排查 GKE On-Prem 中的 OIDC 问题

配置无效

如果 Google Cloud 控制台无法从集群中读取 OIDC 配置,则登录按钮将被停用。

提供商配置无效

如果您的身份提供方配置无效,点击登录后,身份提供方将显示错误屏幕。按照特定于提供方的说明正确配置提供方或您的集群。

权限无效

如果您完成了身份验证流程,但仍看不到集群的详细信息,请确保您已向与 OIDC 搭配使用的帐号授予了正确的 RBAC 权限。请注意,此帐号可能与您用于访问 Google Cloud 控制台的帐号不同。

Error: missing 'RefreshToken' field in 'OAuth2Token' in credentials struct

如果授权服务器提示是否同意,但您未提供所需的身份验证参数,则可能会遇到此错误。向 GKE On-Prem 配置文件的 oidc: extraparams 字段提供 prompt=consent 参数,并使用 --extra-params prompt=consent 标志重新生成客户端身份验证文件。

后续步骤