Kubernetes RBAC 怎么配置和使用?

文章导读
Previous Quiz Next 想象一下管理一个繁忙的 Kubernetes 集群,其中多个团队部署应用程序、监控服务并排查问题。如果没有适当的访问控制,就会出现混乱,导致开发者意外修改关键资源,或未经授权的用户访问敏感数据。为了防止此类情况,Kubern
📋 目录
  1. A 什么是 RBAC?
  2. B 为什么我们需要 RBAC?
  3. C 检查 RoleBindings
  4. D 删除 Role 或 RoleBinding
  5. E 总结
A A

Kubernetes 中的基于角色的访问控制 (RBAC)



Previous
Quiz
Next

想象一下管理一个繁忙的 Kubernetes 集群,其中多个团队部署应用程序、监控服务并排查问题。如果没有适当的访问控制,就会出现混乱,导致开发者意外修改关键资源,或未经授权的用户访问敏感数据。为了防止此类情况,Kubernetes 提供了基于角色的访问控制 (RBAC),这是一种基于用户角色的访问调控机制。

在本章中,我们将探索 Kubernetes 中的 RBAC,了解其组件,并学习如何使用 YAML 配置实现它。到最后,我们将能够定义角色、分配权限,并维护一个安全的集群环境。

什么是 RBAC?

RBAC 是一种安全机制,帮助我们根据用户的角色管理权限。它确保只有授权用户才能访问或修改 Kubernetes 中的资源。它基于四个关键组件运行:

  • Role − 定义可以在哪些资源上执行哪些操作。
  • RoleBinding − 将 Role 分配给用户或组。
  • ClusterRole − 适用于整个集群的 Role。
  • ClusterRoleBinding − 将 ClusterRole 授予用户或组。

为什么我们需要 RBAC?

没有 RBAC,任何有权访问集群的用户都可以删除 pods、修改配置,甚至关闭服务。这是一个安全噩梦!

有了 RBAC,我们可以:

  • 限制对敏感数据的访问。
  • 防止意外或恶意操作。
  • 根据团队职责组织权限。

步骤 1:启用 RBAC

大多数现代 Kubernetes 发行版默认启用了 RBAC。要验证其状态,请运行:

kubectl api-versions | grep rbac.authorization.k8s.io

如果 RBAC 已启用,将看到以下输出:

rbac.authorization.k8s.io/v1

如果未启用,您可以在 Kubernetes API server 中使用 --authorization-mode=RBAC 标志简单启用它。

步骤 2:创建 Role

Kubernetes 中的 Role 定义特定 namespace 内的权限。假设我们想授予开发团队在 development namespace 中列出和获取 pods 的权限。

创建 Namespace

在定义 Role 之前,我们首先确保 development namespace 存在:

$ kubectl create namespace development

输出

namespace/development created

创建 Role 定义

使用编辑器,创建一个名为 role.yaml 的文件并添加以下内容:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
  name: developer-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

应用 Role:

$ kubectl apply -f role.yaml

输出

role.rbac.authorization.k8s.io/developer-role created

这确保了 Role 在 development namespace 中成功创建。

步骤 3:将 Role 绑定到用户

RoleBinding 将 Role 链接到用户或组。让我们将 developer-role 分配给名为 alice 的用户。

使用编辑器,创建以下名为 rolebinding.yaml 的文件并添加以下内容:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-rolebinding
  namespace: development
subjects:
- kind: User
  name: alice
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io

应用 RoleBinding:

$ kubectl apply -f rolebinding.yaml

输出

role.rbac.authorization.k8s.io/developer-role created

现在,Alice 可以在 development namespace 中列出和获取 pods,但无法进行更改。

步骤 4:创建 ClusterRole

如果我们需要一个跨所有 namespace 应用的 role,我们可以简单地创建 ClusterRole。例如,让 Alice 查看集群中的所有 pods。

使用编辑器,创建以下名为 clusterrole.yaml 的文件并添加以下内容:

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

应用 ClusterRole:

$ kubectl apply -f clusterrole.yaml

输出

clusterrole.rbac.authorization.k8s.io/cluster-viewer created

步骤 5:绑定 ClusterRole

由于此 role 应用于整个集群,我们可以使用 ClusterRoleBinding 授予 Alice 这些权限。

使用编辑器,创建以下名为 clusterrolebinding.yaml 的文件并添加以下内容:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-viewer-binding
subjects:
- kind: User
  name: alice
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-viewer
  apiGroup: rbac.authorization.k8s.io

应用 ClusterRoleBinding:

kubectl apply -f clusterrolebinding.yaml

输出

clusterrolebinding.rbac.authorization.k8s.io/cluster-viewer-binding created

现在,Alice 可以在任何 namespace 中列出 pods。

步骤 6:验证 RBAC 权限

要确认 Alice 的权限,请使用 kubectl auth can-i

kubectl auth can-i list pods --namespace=development --as=alice

如果权限设置正确,将看到以下输出:

yes

如果 Alice 尝试未经授权的操作,例如删除 pod:

kubectl auth can-i delete pods --namespace=development --as=alice

输出将是:

no

步骤 7:管理和审计 RBAC

列出现有 Roles

要查看 namespace 中的所有 roles:

$ kubectl get roles -n development

输出

NAME             CREATED AT
developer-role   2025-03-06T17:13:24Z

对于 ClusterRoles:

$ kubectl get clusterroles

输出

NAME                                                                   CREATED AT
admin                                                                  2025-02-25T10:07:12Z
argocd-application-controller                                          2025-02-27T11:38:34Z
argocd-applicationset-controller                                       2025-02-27T11:38:34Z
argocd-server                                                          2025-02-27T11:38:34Z
calico-cni-plugin                                                      2025-02-26T13:55:30Z
calico-kube-controllers                                                2025-02-26T13:55:30Z
calico-node                                                            2025-02-26T13:55:30Z
cluster-admin                                                          2025-02-25T10:07:11Z
cluster-viewer                                                         2025-03-06T17:25:05Z
edit                                                                   2025-02-25T10:07:12Z
kubeadm:get-nodes                                                      2025-02-25T10:07:18Z
system:aggregate-to-admin                                              2025-02-25T10:07:12Z
system:aggregate-to-edit                                               2025-02-25T10:07:12Z
system:aggregate-to-view                                               2025-02-25T10:07:12Z
system:auth-delegator                                                  2025-02-25T10:07:13Z
system:basic-user                                                      2025-02-25T10:07:12Z
system:certificates.k8s.io:certificatesigningrequests:nodeclient       2025-02-25T10:07:13Z
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient   2025-02-25T10:07:13Z
system:certificates.k8s.io:kube-apiserver-client-approver              2025-02-25T10:07:13Z
system:certificates.k8s.io:kube-apiserver-client-kubelet-approver      2025-02-25T10:07:14Z
system:certificates.k8s.io:kubelet-serving-approver                    2025-02-25T10:07:13Z
system:certificates.k8s.io:legacy-unknown-approver                     2025-02-25T10:07:13Z
system:controller:attachdetach-controller                              2025-02-25T10:07:14Z
system:controller:certificate-controller                               2025-02-25T10:07:15Z
system:controller:clusterrole-aggregation-controller                   2025-02-25T10:07:14Z
system:controller:cronjob-controller                                   2025-02-25T10:07:14Z
system:controller:daemon-set-controller                                2025-02-25T10:07:14Z

检查 RoleBindings

要在某个 namespace 中查看 RoleBindings:

$ kubectl get rolebindings -n development

输出

NAME                    ROLE                  AGE
developer-rolebinding   Role/developer-role   13m

对于 ClusterRoleBindings:

$ kubectl get clusterrolebindings

输出

NAME                                                            ROLE                                                                               AGE
argocd-application-controller                                   ClusterRole/argocd-application-controller                                          7d5h
argocd-applicationset-controller                                ClusterRole/argocd-applicationset-controller                                       7d5h
argocd-server                                                   ClusterRole/argocd-server                                                          7d5h
calico-cni-plugin                                               ClusterRole/calico-cni-plugin                                                      8d
calico-kube-controllers                                         ClusterRole/calico-kube-controllers                                                8d
calico-node                                                     ClusterRole/calico-node                                                            8d
cluster-admin                                                   ClusterRole/cluster-admin                                                          9d
cluster-viewer-binding                                          ClusterRole/cluster-viewer                                                         9m52s
kubeadm:cluster-admins                                          ClusterRole/cluster-admin                                                          9d
kubeadm:get-nodes                                               ClusterRole/kubeadm:get-nodes                                                      9d
kubeadm:kubelet-bootstrap                                       ClusterRole/system:node-bootstrapper                                               9d

删除 Role 或 RoleBinding

要删除一个 Role:

$ kubectl delete role developer-role -n development

输出

role.rbac.authorization.k8s.io "developer-role" deleted

要删除一个 RoleBinding:

$ kubectl delete rolebinding developer-rolebinding -n development

输出

rolebinding.rbac.authorization.k8s.io "developer-rolebinding" deleted

总结

在 Kubernetes 中实现基于角色的访问控制 (RBAC) 是保护集群安全并确保对资源具有适当访问权限的基础。

定期审计和管理 RBAC 配置可以确保您的访问控制适应不断演变的团队结构和项目需求。随着 Kubernetes 环境的增长,良好实施的 RBAC 策略对于维护安全高效的基础设施变得不可或缺。

通过遵循本章概述的步骤,您可以自信地在 Kubernetes 集群中设置和管理 RBAC。