本主题介绍了如何在 Tanzu Kubernetes Grid 中配置基于角色的访问控制 (RBAC)。
如果要使用标准的非管理员 kubeconfig 文件访问集群,则必须在启用并配置身份管理后配置 RBAC 授权。有关 kubeconfig 文件的详细信息,请参见下面的管理员和非管理员 kubeconfig 文件。
要配置 RBAC 授权,请为要使用标准的非管理员 kubeconfig 文件的每个管理集群和工作负载集群创建一个或多个角色绑定:
有关角色绑定的详细信息,请参见下面的角色和角色绑定。
kubeconfig 文件要授予用户对管理集群或工作负载集群的访问权限,需要生成一个 kubeconfig 文件,然后与这些用户共享该文件。如果您向他们提供集群的管理员 kubeconfig,则他们需要具有集群的完全访问权限,而无需进行身份验证。但是,如果您为用户提供标准的非管理员 kubeconfig,则他们必须在 OIDC 或 LDAP 身份提供程序中具有用户帐户,并且您必须在集群上配置 RBAC 以向指定的用户授予访问权限。
要为管理集群或工作负载集群生成 kubeconfig 文件,请针对管理集群运行 tanzu mc kubeconfig get,或针对工作负载集群运行 tanzu cluster kubeconfig get。使用或不使用 --admin 选项运行上述任一命令时,命令的运行方式如下:
--admin,该命令将生成包含嵌入式凭据的管理员 kubeconfig。通过此 admin 版本的 kubeconfig,您与之共享该证书的任何用户都将具有集群的完全访问权限,并且将绕过身份提供程序 (IdP) 身份验证。--admin,该命令将生成一个标准的非管理员 kubeconfig,提示用户使用外部身份提供程序进行身份验证。然后,身份提供程序先验证用户的身份,然后用户才能访问集群的资源。有关这些命令的详细信息,请参见:
一个角色定义一组权限。您可以通过创建 Role 在特定命名空间中定义角色,或者通过创建 ClusterRole 来定义集群范围的角色。要将该角色中定义的权限授予用户或用户组,您必须创建角色绑定。
| 资源 | 适用范围 | 描述 |
|---|---|---|
Role |
命名空间 | 定义可在命名空间特定的 RoleBinding 中使用的权限。 |
ClusterRole |
集群 | 定义可在 ClusterRoleBinding 或特定于命名空间的 RoleBinding 中使用的权限。 |
RoleBinding |
命名空间 | 授予特定命名空间内的权限。可以引用 Role 或 ClusterRole。 |
ClusterRoleBinding |
集群 | 授予集群中所有命名空间的权限。只能引用 ClusterRole。 |
默认用户角色包括:
cluster-admin:对集群的完全访问权限。在 RoleBinding 中使用时,此角色授予对绑定中指定的命名空间中的任何资源的完全访问权限。admin:对命名空间中大多数资源的管理员访问权限。可以在命名空间中创建和修改角色和角色绑定。edit:对命名空间中大多数对象(如部署、服务和 Pod)的读写访问权限。无法查看、创建或修改角色和角色绑定。view:对命名空间中大多数对象的只读访问权限。无法查看、创建或修改角色和角色绑定。有关这些角色的详细信息,请参见 Kubernetes 文档中的使用 RBAC 授权。
本节介绍了如何:
kubeconfig 文件如果运行 tanzu 和 kubectl 命令的计算机上存在浏览器,则此过程允许您测试身份验证过程的登录步骤。如果计算机没有浏览器,请参见在不使用浏览器的计算机上对用户进行身份验证。
将管理集群的标准 kubeconfig 导出到本地文件,例如 /tmp/id_mgmt_test_kubeconfig。请注意,该命令不包含 --admin 选项,因此导出的 kubeconfig 是标准 kubeconfig,而不是 admin 版本。
tanzu mc kubeconfig get --export-file /tmp/id_mgmt_test_kubeconfig
您会看到确认信息 You can now access the cluster by specifying '--kubeconfig /tmp/id_mgmt_test_kubeconfig' flag when using 'kubectl' command。
使用新创建的 kubeconfig 文件连接到管理集群:
kubectl get pods -A --kubeconfig /tmp/id_mgmt_test_kubeconfig
身份验证过程要求用户在连接到集群的计算机上具有浏览器,因为运行 kubectl 命令会自动打开 IdP 登录页面,以便用户可以登录到集群。浏览器应打开并显示 OIDC 提供程序的登录页面或 LDAPS 登录页面。
LDAPS:

OIDC:

输入 OIDC 或 LDAP 服务器中存在的用户帐户的凭据。成功登录后,浏览器应显示以下内容:

返回到运行 tanzu 和 kubectl 命令的终端:
如果已在集群上为经过身份验证的用户配置了角色绑定,则会显示 kubectl get pods -A 的输出,其中显示 pod 信息。
如果未在集群上配置角色绑定,您将看到一条拒绝用户帐户访问 Pod 的消息:Error from server (Forbidden): pods is forbidden: User "[email protected]" cannot list resource "pods" in API group "" at the cluster scope。发生这种情况的原因是,用户已成功通过身份验证,但他们尚未获得访问集群上任何资源的授权。要授权用户访问集群资源,您必须在管理集群上创建角色绑定,如下所述。
要向非管理员用户授予管理集群的访问权限,请生成并分发 kubeconfig 文件,如上面的为管理集群生成和测试非管理员 kubeconfig 文件。要使此 kubeconfig 正常工作,必须先通过在管理集群上创建角色绑定来设置 RBAC。此角色绑定会将基于角色的权限分配给经过身份验证的单个用户或用户组。
要创建角色绑定,请执行以下操作:
确保您使用的是管理集群的 admin 上下文:
kubectl config current-context
如果上下文不是管理集群 admin 上下文,请将 kubectl 设置为使用该上下文。例如:
kubectl config use-context id-mgmt-test-admin@id-mgmt-test
列出现有角色:
要查看命名空间范围的角色的完整列表,请运行:
kubectl get roles --all-namespaces
要查看集群范围的角色的完整列表,请运行:
kubectl get clusterroles
要将给定用户与角色相关联,请创建角色绑定。
RoleBinding 可以引用 Role 或 ClusterRole。ClusterRoleBinding 只能引用 ClusterRole。以下示例创建了一个名为 id-mgmt-test-rb 的集群角色绑定,其将集群角色 cluster-admin 绑定到用户[email protected]:
kubectl create clusterrolebinding id-mgmt-test-rb --clusterrole cluster-admin --user [email protected]
对于 --user,请指定用户的 OIDC 或 LDAP 用户名。您已在 Tanzu Kubernetes Grid 安装程序界面的 Identity Management 部分中或通过设置 LDAP_* 或 OIDC_* 变量配置用户名属性和其他身份提供程序详细信息:
OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM 配置变量的 OIDC 身份管理源下的用户名声明字段中设置。LDAP_USER_SEARCH_USERNAME 配置变量的 LDAPS 身份管理源 –> 用户搜索属性下的用户名字段中设置。例如,对于 OIDC,用户名通常是用户的电子邮件地址。对于 LDAPS,它是 LDAP 用户名,而不是电子邮件地址。
尝试使用您在上一过程中创建的 kubeconfig 文件再次连接到管理集群:
kubectl get pods -A --kubeconfig /tmp/id_mgmt_test_kubeconfig
这一次,由于用户已绑定到此管理集群上的 cluster-admin 角色,因此应显示 pod 列表。您可以与在管理集群上为其配置角色绑定的所有用户共享生成的 kubeconfig 文件。
本节介绍了如何:
kubeconfig 文件如果运行 tanzu 和 kubectl 命令的计算机上存在浏览器,则此过程允许您测试身份验证过程的登录步骤。如果计算机没有浏览器,请参见在不使用浏览器的计算机上对用户进行身份验证。
要对工作负载集群上的用户进行身份验证,请执行以下步骤:
获取工作负载集群的标准非管理员 kubeconfig 并将其导出到文件。以下示例将集群 my-cluster 的 kubeconfig 导出到文件 my-cluster-kubeconfig。
tanzu cluster kubeconfig get my-cluster --export-file /tmp/my-cluster-kubeconfig
使用生成的文件尝试在集群上运行操作。例如,运行:
kubectl get pods -A --kubeconfig /tmp/my-cluster-kubeconfig
您应重定向到身份提供程序的登录页面。使用身份提供程序中的用户帐户成功登录后,如果已在集群上为经过身份验证的用户配置了角色绑定,则输出将显示 pod 信息。
如果尚未在集群上配置角色绑定,则会看到以下消息 Error from server (Forbidden): pods is forbidden: User "<user>" cannot list resource "pods" in API group "" at the cluster scope。发生这种情况的原因是,该用户在集群上还没有任何权限。要授权用户访问集群资源,您必须在工作负载集群上创建角色绑定。
要完成工作负载集群的身份管理配置,必须为使用在上一步中生成的 kubeconfig 的用户创建角色绑定。
将 kubectl 上下文设置为工作负载集群的 admin kubeconfig。您需要切换到工作负载集群的 admin 上下文,才能创建角色绑定。例如,运行以下两个命令以更改为 admin 上下文:
获取 kubeconfig:
tanzu cluster kubeconfig get my-cluster --admin
切换上下文:
kubectl config use-context my-cluster-admin@my-cluster
要查看现有角色,请运行以下命令:
要查看命名空间范围的角色的完整列表,请运行:
kubectl get roles --all-namespaces
要查看集群范围的角色的完整列表,请运行:
kubectl get clusterroles
要将给定用户与角色相关联,请创建角色绑定。
RoleBinding 可以引用 Role 或 ClusterRole。ClusterRoleBinding 只能引用 ClusterRole。以下示例创建了一个名为 workload-test-rb 的集群角色绑定,其将集群角色 cluster-admin 绑定到用户[email protected]:
kubectl create clusterrolebinding workload-test-rb --clusterrole cluster-admin --user [email protected]
对于 --user,请指定用户的 OIDC 或 LDAP 用户名。您已在 Tanzu Kubernetes Grid 安装程序界面的 Identity Management 部分中或通过设置 LDAP_* 或 OIDC_* 变量配置用户名属性和其他身份提供程序详细信息:
OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM 配置变量的 OIDC 身份管理源下的用户名声明字段中设置。LDAP_USER_SEARCH_USERNAME 配置变量的 LDAPS 身份管理源 –> 用户搜索属性下的用户名字段中设置。例如,对于 OIDC,用户名通常是用户的电子邮件地址。对于 LDAPS,它是 LDAP 用户名,而不是电子邮件地址。
使用上面生成的标准 kubeconfig 文件尝试再次在集群上运行操作。例如,运行:
kubectl get pods -A --kubeconfig /tmp/my-cluster-kubeconfig
此时,您应该会看到工作负载集群中运行的 Pod 列表。这是因为 my-cluster-kubeconfig 文件的用户已通过身份提供程序的身份验证,并在集群上具有必要的权限。您可以与在集群上为其配置角色绑定的所有用户共享 my-cluster-kubeconfig 文件。
与其他用户共享生成的 kubeconfig 文件,以允许他们访问集群。