时间:2025-06-08 12:57
人气:
作者:admin
官方文档:
Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。
在K8S中,当我们试图通过API与集群资源交互时,必定经过集群资源管理对象入口kube-apiserver。显然不是随随便便来一个请求它都欢迎的,每个请求都需要经过合规检查,包括Authentication(身份验证)、Authorization(授权)和Admission Control(准入控制)。通过一系列验证后才能完成交互。

在K8S体系中有两种账号类型:
这两种账号都可以访问 API server,都需要经历认证、授权、准入控制等步骤
当然,除了上面两种之外,还有一个组的概念,这就是Group,主要是用于将用户或服务账号(ServiceAccount)分组,以便可以对整个组应用统一的权限策略。

Kubernetes集群安全的最关键点在于如何识别并认证客户端身份,它提供了3种客户端身份认证方式:
这种方式通过通过用户名+密码的方式认证。把“用户名:密码”用BASE64算法进行编码后的字符串放在HTTP请求中的Header Authorization域里发送给服务端。服务端收到后进行解码,获取用户名及密码,然后进行用户身份认证的过程。
这种认证方式是用一个很长的难以被模仿的字符串--Token来表明客户身份的一种方式。每个Token对应一个用户名,当客户端发起API调用请求时,需要在HTTP Header里放入Token,API Server接到Token后会跟服务器中保存的token进行比对,然后进行用户身份认证的过程。
基于CA根证书签名的双向数字证书认证方式,这种认证方式是安全性最高的一种方式,也是生产环境中最常用的一种。但是同时也是操作起来最麻烦的一种方式。
授权发生在认证成功之后,通过认证就可以知道请求用户是谁, 然后Kubernetes会根据事先定义的授权策略来决定用户是否有权限访问,这个过程就称为授权。
每个发送到ApiServer的请求都带上了用户和资源的信息:比如发送请求的用户、请求的路径、请求的动作等,授权就是根据这些信息和授权策略进行比较,如果符合策略,则认为授权通过,否则会返回错误。
API Server目前支持以下几种授权策略:
RBAC(Role-Based Access Control) 基于角色的访问控制,主要是在描述一件事情:给哪些对象授予了哪些权限
其中涉及到了下面几个概念:

RBAC引入了4个顶级资源对象:
Role:普通角色,只能对命名空间内的资源进行授权,需要指定nameapce,可以指定一组权限
ClusterRole:集群角色,可以对集群范围内资源、跨namespaces的范围资源、非资源类型进行授权
RoleBinding:将 Role 中定义的权限绑定到特定命名空间内的用户、组或服务账户。只能引用同一命名空间中的 Role。若需在多个命名空间使用相同权限,需为每个命名空间创建单独的 RoleBinding。
ClusterRoleBinding:将 ClusterRole 中定义的权限绑定到集群范围内的用户、组或服务账户。
RoleBinding和ClusterRoleBinding区别
RoleBinding
将 Role 中定义的权限绑定到特定命名空间内的用户、组或服务账户。
只能引用同一命名空间中的 Role。
若需在多个命名空间使用相同权限,需为每个命名空间创建单独的 RoleBinding。
ClusterRoleBinding
将 ClusterRole 中定义的权限绑定到集群范围内的用户、组或服务账户。
绑定的 ClusterRole 可以是集群级资源(如 Nodes)或非资源型 URL(如/healthz)。
可用于授予跨命名空间的权限(如查看所有命名空间的 Pods)。
ClusterRole 与 RoleBinding 的组合
虽然 ClusterRoleBinding 只能绑定 ClusterRole,但RoleBinding 可以绑定 ClusterRole,此时权限会被限制在 RoleBinding 所在的命名空间内。
在 Kubernetes 中,Role 是一种用于定义命名空间(Namespace)内权限的资源对象,属于 RBAC(基于角色的访问控制)系统的核心组件之一。通过 Role,你可以精确控制用户或服务账户对命名空间内资源的操作权限,遵循最小权限原则(Least Privilege Principle)。
示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
# 可选,默认为当前命名空间,对应某个空间的操作权限
namespace: default
name: develop-role
rules:
# 规则1:操作核心组和 apps 组的 pods、deployments,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["pods","deployments"]
verbs: ["get", "list"]
# 规则2:操作核心组和 apps 组的 configmaps、secrets、daemonsets,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["configmaps","secrets","daemonsets"]
verbs: ["get", "list"]
# 规则3:操作核心组的 secrets,允许 delete 和 create
- apiGroups: [""]
resources: ["secrets"]
verbs: ["delete","create"]
作用
取值规则:
[""](空字符串),对应 Kubernetes API 中的 v1 版本资源。示例:
作用
取值规则:
- apiGroups: [""]
resources: ["pods"]
resourceNames: ["web-pod"] # 仅操作名为 "web-pod" 的 Pod
verbs: ["get"]
作用
常见 verbs 分类
基础操作:
kubectl get pod <name>kubectl list podskubectl create podkubectl apply 或 kubectl editkubectl delete pod <name>高级操作:
kubectl patch pod <name> -p '{"spec": {...}}')kubectl get pods --watchkubectl exec -it <pod> /bin/shkubectl port-forward特殊操作:
*:允许所有操作(需谨慎使用)。
list 和 watch 通常配合使用,用于实现资源监控(如 Dashboard 或控制器)。
示例:
# 定义Role
[root@master ~/role]# cat role-default.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: custom-role
rules:
# 规则1:操作核心组和 apps 组的 pods、deployments,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["pods","deployments"]
verbs: ["get", "list"]
# 规则2:操作核心组和 apps 组的 configmaps、secrets、daemonsets,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["configmaps","secrets","daemonsets"]
verbs: ["get", "list"]
# 规则3:操作核心组的 secrets,允许 delete 和 create
- apiGroups: [""]
resources: ["secrets"]
verbs: ["delete","create"]
# 创建Role
[root@master ~/role]# kubectl apply -f role-default.yaml
role.rbac.authorization.k8s.io/custom-role created
查看Role
# 查看Role
[root@master ~/role]# kubectl get role -o wide
NAME CREATED AT
custom-role 2025-06-07T06:34:52Z
[root@master ~/role]# kubectl describe role custom-role
Name: custom-role
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
secrets [] [] [get list delete create]
configmaps [] [] [get list]
daemonsets [] [] [get list]
deployments [] [] [get list]
pods [] [] [get list]
configmaps.apps [] [] [get list]
daemonsets.apps [] [] [get list]
deployments.apps [] [] [get list]
pods.apps [] [] [get list]
secrets.apps [] [] [get list]
在 Kubernetes 中,ClusterRole 是一种用于定义集群级别权限的资源对象,属于 RBAC(基于角色的访问控制)系统的核心组件之一。与只能作用于单个命名空间的 Role 不同,ClusterRole 可以跨命名空间授权,或用于集群级资源(如节点、命名空间)的访问控制。
ClusterRole 是一个 集群级别的资源,用于定义对 集群范围资源 或 非资源 URL 的操作权限。
可以用于以下场景:
ClusterRole资源清单文件和上述Role是一致的
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: <clusterrole-name> # ClusterRole 的名称
rules:
- apiGroups: [""] # API 组列表
resources: ["nodes"] # 资源类型列表(集群级资源)
verbs: ["get", "list", "watch"] # 操作权限
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["*"] # 所有操作权限
resourceNames: ["backend"] # 可选,限定特定资源名称
- nonResourceURLs: ["/healthz", "/metrics"] # 非资源 URL(仅 ClusterRole 支持)
verbs: ["get"]
# 定义ClusterRole
[root@master ~/role]# cat ClusterRole-1.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-clusterrole
rules:
# 规则1:操作核心组和 apps 组的 pods、deployments,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["pods","deployments"]
verbs: ["get", "list"]
# 规则2:操作核心组和 apps 组的 configmaps、secrets、daemonsets,仅允许 get 和 list
- apiGroups: ["","apps"]
resources: ["configmaps","secrets","daemonsets"]
verbs: ["get", "list"]
# 规则3:操作核心组的 secrets,允许 delete 和 create
- apiGroups: [""]
resources: ["secrets"]
verbs: ["delete","create"]
# 创建Role
[root@master ~/role]# kubectl apply -f ClusterRole-1.yaml
clusterrole.rbac.authorization.k8s.io/custom-clusterrole created
查看ClusterRole
# 查看Role
[root@master ~/role]# kubectl get clusterrole custom-clusterrole
NAME CREATED AT
custom-clusterrole 2025-06-07T06:44:54Z
[root@master ~/role]# kubectl describe clusterrole custom-clusterrole
Name: custom-clusterrole
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
secrets [] [] [get list delete create]
configmaps [] [] [get list]
daemonsets [] [] [get list]
deployments [] [] [get list]
pods [] [] [get list]
configmaps.apps [] [] [get list]
daemonsets.apps [] [] [get list]
deployments.apps [] [] [get list]
pods.apps [] [] [get list]
secrets.apps [] [] [get list]
[root@master ~/role]# kubectl get clusterrole | grep -v system
NAME CREATED AT
admin 2025-05-24T05:57:58Z
calico-cni-plugin 2025-05-24T05:58:41Z
calico-crds 2025-05-24T05:59:30Z
calico-extension-apiserver-auth-access 2025-05-24T05:59:30Z
calico-kube-controllers 2025-05-24T05:58:41Z
calico-node 2025-05-24T05:58:41Z
calico-typha 2025-05-24T05:58:40Z
calico-webhook-reader 2025-05-24T05:59:30Z
cluster-admin 2025-05-24T05:57:57Z
custom-clusterrole 2025-06-07T06:44:54Z
edit 2025-05-24T05:57:58Z
kubeadm:get-nodes 2025-05-24T05:57:59Z
tigera-operator 2025-05-24T05:58:37Z
view 2025-05-24T05:57:58Z
其中主要关注这四个
在 Kubernetes(K8s)中,RoleBinding 是实现权限控制(RBAC,Role-Based Access Control)的核心资源之一,用于将角色(Role)与用户、服务账户或组关联起来,从而赋予其对特定资源的操作权限。
RoleBinding 仅在单个命名空间内生效,用于授予对命名空间内资源的访问权限(如 Pod、Service 等)。
若需跨命名空间或集群级权限(如管理节点、命名空间本身),需使用 ClusterRoleBinding(关联 ClusterRole)。
将 Role(角色)定义的权限授予 主体(Subjects),主体可以是:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-rolebinding # RoleBinding 名称
namespace: dev-namespace # 作用的命名空间
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role # 引用的角色类型(必须是 Role 或 ClusterRole)
name: developer # 引用的角色名称
subjects: # 被授权的主体列表
- kind: User # 主体类型(User/ServiceAccount/Group)
name: alice # 主体名称
apiGroup: "" # User 和 Group 的 apiGroup 为空
- kind: ServiceAccount
name: my-app-sa
namespace: dev-namespace # 服务账户所在的命名空间(若与 RoleBinding 同命名空间可省略)
- kind: Group
name: my-group # 组名
apiGroup: ""
虽然 RoleBinding 通常绑定 Role,但也可以绑定 ClusterRole,前提是该 ClusterRole 的规则适用于命名空间内的资源。例如:
# 使用 ClusterRole 定义命名空间内权限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: namespace-pod-reader
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
resourceNames: [] # 不限制具体资源名称,作用于整个命名空间
# 通过 RoleBinding 将 ClusterRole 绑定到命名空间
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: clusterrole-binding
namespace: dev-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole # 引用集群级角色
name: namespace-pod-reader
subjects:
- kind: User
name: charlie
apiGroup: ""
在 Kubernetes(K8s)中,ClusterRoleBinding 是实现集群级权限控制的核心资源,用于将集群级角色(ClusterRole)与用户、服务账户或组关联,从而赋予其跨命名空间或集群级资源的访问权限。
ClusterRoleBinding 不局限于单个命名空间,而是对整个集群生,可用于授权对集群级资源(如 Nodes、Namespaces、PersistentVolumes)或所有命名空间资源(如所有 Pod、ConfigMaps)的访问。
将 ClusterRole 定义的权限授予 主体(Subjects),主体可以是:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding # ClusterRoleBinding 名称
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole # 必须是 ClusterRole
name: cluster-admin # 引用的 ClusterRole 名称
subjects:
- kind: User # 主体类型
name: admin-user # 用户名
apiGroup: ""
- kind: Group
name: system:serviceaccounts # 所有服务账户所在的组
apiGroup: ""
| 特性 | Role | ClusterRole |
|---|---|---|
| 作用范围 | 单个命名空间内 | 集群范围(所有命名空间或集群级资源) |
| 定义位置 | 属于命名空间资源(需指定 namespace) | 集群级资源(无需 namespace 字段) |
| 可授权的资源类型 | 命名空间内资源(如 Pod、Service) | 1. 集群级资源(如 Nodes、Namespaces) 2. 所有命名空间的资源(如所有 Pod) 3. 非资源端点(如 /healthz、/metrics) |
| 绑定方式 | 通过 RoleBinding 绑定到主体 | 1. 通过 RoleBinding 绑定到单个命名空间(需角色规则适用于命名空间资源) 2. 通过 ClusterRoleBinding 绑定到整个集群 |
| 典型场景 | 授权命名空间内的操作(如开发人员管理自己命名空间的资源) | 1. 集群管理员权限 2. 跨命名空间操作 3. 访问集群级资源 |
| 特性 | RoleBinding | ClusterRoleBinding |
|---|---|---|
| 作用范围 | 单个命名空间内 | 集群范围(所有命名空间或集群级资源) |
| 绑定的角色类型 | 1. Role(命名空间内角色) 2. ClusterRole(需角色规则适用于命名空间资源) |
仅 ClusterRole(集群级角色) |
| 定义位置 | 属于命名空间资源(需指定 namespace) | 集群级资源(无需 namespace 字段) |
| 典型场景 | 授权用户/服务账户操作特定命名空间内的资源(如开发人员管理 dev 命名空间的 Pod) | 1. 集群管理员权限 2. 跨命名空间操作 3. 访问集群级资源(如 Nodes) |
本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18908560,微信Vac6666666,欢迎交流
上一篇:Helm仓库管理
下一篇:K8s新手系列之CronJob
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)