查看当前用户和所属组
| root@master01:~ |
| ATTRIBUTE VALUE |
| Username kubernetes-admin |
| Groups [system:masters system:authenticated] |
用于验证该sa 是否有指定权限。举例:
| kubectl auth can-i list endpointslices --as=system:serviceaccount:kube-system:coredns |
RBAC (role base access control),基于角色的访问控制。如果希望使用RBAC功能,需要在api-server启动命令中增加如下配置:
--authorization-mode=RBAC
- 用户分为 user 和serviceAccount 和group
- 角色分为 Role和 ClusterRole
- 角色和用户的绑定分为 rolebinding 和 clusterrolebinding
三者关系:
用户/角色 |
Role |
ClusterRole |
user |
rolebinding |
rolebinding/clusterrolebinding |
serviceAccount |
rolebinding |
rolebinding/clusterrolebinding |
group |
rolebinding |
rolebinding/clusterrolebinding |
user
user 不是真正意义上k8s资源,常用于从集群外部连接kube-apiserver。 可以通过openssl创建证书,通过CluserRoleBinding/RoleBinding 绑定权限。
例如 kubectl 连接k8s 集群的权限就是其中应用
| openssl genrsa -out user01.key 1024 |
| |
| |
| |
| openssl req -new -key user01.key -out user01.csr -subj /CN=user01 |
| openssl x509 -req -CA ca.pem -CAkey ca-key.pem -in user01.csr -out user01.crt -days 3650 -CAcreateserial |
| openssl x509 -in user01.crt -text |
| kubectl create rolebinding user01-binding --clusterrole=cluster-admin --user=user01 -n default |
创建认证文件
| |
| kubectl config set-cluster test01 \ |
| --certificate-authority=./ca.pem \ |
| --embed-certs=true \ |
| --server=https://10.4.7.250:6443 \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config set-credentials user01 \ |
| --client-certificate=./user01.crt \ |
| --client-key=./user01.key \ |
| --embed-certs=true \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config set-context user01-context \ |
| --cluster=test01 \ |
| --user=user01 \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config use-context user01-context \ |
| --kubeconfig=kubelet.kubeconfig |
测试权限
| |
| kubectl --kubeconfig ./kubelet.kubeconfig get pod |
| |
| |
| |

serviceAccount
serviceAccount 是k8s资源,常用于内部pod 连接kube-apiServer。dashboard的授权管理就是其中应用
| kubectl create serviceaccount test-dashboard \ |
| --dry-run=client -o yaml |
| kubectl create rolebinding test-dashboard \ |
| --clusterrole=cluster-admin \ |
| --serviceaccount=default:test-dashboard \ |
| -n default \ |
| --dry-run=client -o yaml |
| |
| token=kubectl describe secret test-dashboard-token-jnrzl |awk '/^token/{print $NF}' |
| |
| kubectl config set-cluster test01 \ |
| --certificate-authority=./ca.pem \ |
| --embed-certs=true \ |
| --server=https://10.4.7.250:6443 \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config set-credentials user02 \ |
| --token=${token} \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config set-context user02-context \ |
| --cluster=test01 \ |
| --user=user02 \ |
| --kubeconfig=kubelet.kubeconfig |
| |
| kubectl config use-context user02-context \ |
| --kubeconfig=kubelet.kubeconfig |
测试权限
| |
| kubectl --kubeconfig ./kubelet.kubeconfig get pod |
| |
Role
- Role 总是用来在某个名称空间内设置访问权限;在你创建 Role 时,你必须指定该 Role 所属的名字空间。
ClusterRole 则是集群资源,如果你希望定义集群范围的角色,应该使用 ClusterRole。
- "get", "post","list", "watch", "create", "update", "patch", "delete"
示例:
| |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: Role |
| metadata: |
| namespace: default |
| name: pod-reader |
| rules: |
| - apiGroups: [""] |
| resources: ["pods"] |
| verbs: ["get", "watch", "list"] |
对子资源的授权
| kubectl get --raw /api/v1/namespaces/default/pods/web-server/log |
| |
| |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: Role |
| metadata: |
| name: pod-reader |
| rules: |
| - apiGroups: |
| - "" |
| resources: |
| - pods |
| - pods/log |
| verbs: |
| - get |
| - watch |
| - list |
指定资源名称
[info]
你不能使用资源名字来限制 create
或者 deletecollection
请求。 对于 create
请求而言,这是因为在鉴权时可能还不知道新对象的名字
| |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: Role |
| metadata: |
| name: test |
| rules: |
| - apiGroups: |
| - networking.k8s.io |
| resourceNames: |
| - http-80 |
| resources: |
| - ingresses |
| verbs: |
| - list |
也可以使用 *
号模糊匹配
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: Role |
| metadata: |
| namespace: default |
| name: example.com-superuser |
| rules: |
| - apiGroups: ["example.com"] |
| resources: ["*"] |
| verbs: ["*"] |
ClusterRole
clusterrole 在授权时支持role 所有的操作,同时增加了一下资源的控制:
- 集群范围资源(比如 节点(Node))
- 非资源端点(比如
/healthz
)
- 支持权限聚合(可以将若干clusterrole 聚合起来),Role不支持
示例:
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: ClusterRole |
| metadata: |
| |
| name: secret-reader |
| rules: |
| - apiGroups: [""] |
| |
| resources: ["secrets"] |
| verbs: ["get", "watch", "list"] |
| |
| kubectl get clusterrole |
| |
| kubectl get clusterrole system:node -o yaml |
clusterRole权限聚合
[info]
| |
| |
| |
| |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: ClusterRole |
| metadata: |
| name: test |
| aggregationRule: |
| clusterRoleSelectors: |
| - matchLabels: |
| rbac.example.com/aggregate-to-monitoring: "true" |
| rules: [] |
RoleBinding
- rolebinding 在名称空间级别中授权,clusterrolebinding 在集群级别授权
示例:
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: RoleBinding |
| metadata: |
| name: user01-binding |
| namespace: default |
| |
| roleRef: |
| apiGroup: rbac.authorization.k8s.io |
| kind: ClusterRole |
| name: cluster-admin |
| subjects: |
| |
| - apiGroup: rbac.authorization.k8s.io |
| kind: User |
| name: user01 |
RoleBinding 也可以引用 ClusterRole,这种引用使得你可以跨整个集群定义一组通用的角色, 之后在多个名字空间中复用。
| apiVersion: rbac.authorization.k8s.io/v1 |
| |
| |
| kind: RoleBinding |
| metadata: |
| name: read-secrets |
| |
| |
| namespace: development |
| subjects: |
| |
| - kind: User |
| name: dave |
| apiGroup: rbac.authorization.k8s.io |
| |
| roleRef: |
| kind: ClusterRole |
| name: secret-reader |
| apiGroup: rbac.authorization.k8s.io |
Clusterrolebinding
| apiVersion: rbac.authorization.k8s.io/v1 |
| |
| kind: ClusterRoleBinding |
| metadata: |
| name: read-secrets-global |
| subjects: |
| - kind: Group |
| name: manager |
| apiGroup: rbac.authorization.k8s.io |
| - kind: User |
| name: jane |
| apiGroup: rbac.authorization.k8s.io |
| |
| roleRef: |
| kind: ClusterRole |
| name: secret-reader |
| apiGroup: rbac.authorization.k8s.io |
| |
| root@master01:~# kubectl get clusterrolebinding -o=jsonpath='{range .items[*]}{.subjects[0].kind}{"\t"}{.metadata.name}{"\n"}{end}'|grep -i group |
| Group cluster-admin |
| Group kubeadm:get-nodes |
| Group kubeadm:kubelet-bootstrap |
| Group kubeadm:node-autoapprove-bootstrap |
| Group kubeadm:node-autoapprove-certificate-rotation |
| Group system:basic-user |
| Group system:discovery |
| Group system:monitoring |
| Group system:public-info-viewer |
| Group system:service-account-issuer-discovery |
OpenShift用户与组的管理功能如何在Kubernetes上实现 - 简书 (jianshu.com)
默认的clusterrole
clusterrole |
binding |
权限 |
cluster-admin |
system:masters 组 |
集群所有权限 |
admin |
无 |
管理员权限,此角色不允许对资源配额或者名字空间本身进行写操作 |
edit |
无 |
允许对名字空间的大多数对象进行读/写操作。此角色不允许查看或者修改role或rolebinding |
view |
无 |
允许对名字空间的大多数对象有只读权限。 它不允许查看role或rolebinding。 |
system:monitoring |
system:monitoring 组 |
允许对控制平面监控端点的读取访问(例如:kube-apiserver 存活和就绪端点(/healthz、/livez、/readyz), 各个健康检查端点(/healthz/、/livez/、/readyz/*)和 /metrics)。 请注意,各个运行状况检查端点和度量标准端点可能会公开敏感信息。 |
dashboard 基于用户角色的实践
| [root@hdss7-22 ~] |
| apiVersion: v1 |
| kind: ServiceAccount |
| metadata: |
| labels: |
| k8s-app: kubernetes-dashboard |
| addonmanager.kubernetes.io/mode: Reconcile |
| name: kubernetes-dashboard |
| namespace: kube-system |
| --- |
| kind: Role |
| apiVersion: rbac.authorization.k8s.io/v1 |
| metadata: |
| labels: |
| k8s-app: kubernetes-dashboard |
| addonmanager.kubernetes.io/mode: Reconcile |
| name: kubernetes-dashboard-minimal |
| namespace: kube-system |
| rules: |
| |
| - apiGroups: [""] |
| resources: ["secrets"] |
| resourceNames: ["kubernetes-dashboard-key-holder","kubernetes-dashboard-certs"] |
| verbs: ["get","update","delete"] |
| |
| - apiGroups: [""] |
| resources: ["secrets"] |
| resourceNames: ["kubernetes-dashboard-settings"] |
| verbs: ["get","update"] |
| |
| - apiGroups: [""] |
| resources: ["services"] |
| resourceNames: ["heapster"] |
| verbs: ["proxy"] |
| - apiGroups: [""] |
| resources: ["services/proxy"] |
| resourceNames: ["heapster", "http:heapster:","https:heapster:"] |
| verbs: [ "get"] |
| --- |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: RoleBinding |
| metadata: |
| name: kubernetes-dashboard-minima1 |
| namespace: kube-system |
| labels: |
| k8s-app: kubernetes-dashboard |
| addonmanager.kubernetes.io/mode: Reconcile |
| roleRef: |
| apiGroup: rbac.authorization.k8s.io |
| kind: Role |
| name: kubernetes-dashboard-minimal |
| subjects: |
| - kind: ServiceAccount |
| name: kubernetes-dashboard |
| namespace: kube-system |
rbac授权示例:
| kubectl -n kube-system create sa admin |
| kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=kube-system:admin |
| kubectl -n kube-system describe secret $(kubectl -n kube-system get sa admin -ojsonpath='{.secrets[0].name}' ) |grep token |
| |
| |
| TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get sa admin -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode) |
| |
| |
| curl -k -H "Authorization: Bearer $TOKEN" https://<KUBERNETES_API_SERVER>/api/v1/nodes |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏