Kubernetes RBAC 怎么配置和使用?

张开发
2026/4/16 4:19:25 15 分钟阅读

分享文章

Kubernetes RBAC 怎么配置和使用?
想象一下管理一个繁忙的 Kubernetes 集群其中多个团队部署应用程序、监控服务并排查问题。如果没有适当的访问控制就会出现混乱导致开发者意外修改关键资源或未经授权的用户访问敏感数据。为了防止此类情况Kubernetes 提供了基于角色的访问控制 (RBAC)这是一种基于用户角色的访问调控机制。在本章中我们将探索 Kubernetes 中的 RBAC了解其组件并学习如何使用 YAML 配置实现它。到最后我们将能够定义角色、分配权限并维护一个安全的集群环境。什么是 RBACRBAC 是一种安全机制帮助我们根据用户的角色管理权限。它确保只有授权用户才能访问或修改 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-modeRBAC标志简单启用它。步骤 2创建 RoleKubernetes 中的 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应用 ClusterRoleBindingkubectl apply -f clusterrolebinding.yaml输出clusterrolebinding.rbac.authorization.k8s.io/cluster-viewer-binding created现在Alice 可以在任何 namespace 中列出 pods。步骤 6验证 RBAC 权限要确认 Alice 的权限请使用kubectl auth can-ikubectl auth can-i list pods --namespacedevelopment --asalice如果权限设置正确将看到以下输出yes如果 Alice 尝试未经授权的操作例如删除 podkubectl auth can-i delete pods --namespacedevelopment --asalice输出将是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。

更多文章