K8S入门篇-权限控制管理
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/16840868.html
目录
一、RBAC-基于角色的权限控制
1.1 Aggregate
1.2 rolebinding
二、RBAC企业实战
2.1 如何授权
2.2 授权最佳实现
2.3 实战
一、RBAC-基于角色的权限控制
1.1 Aggregate
范例1:聚合的权限 Aggregate
创建一个clusterrole
1 2 3 4 5 6 7 8 9 | kind: ClusterRole apiVersion: rbac.authorization.k8s.io /v1 metadata: name: c-role aggregationRule: clusterRoleSelectors: - matchLabels: rbac.example.com /aggregate-to-monitoring : "true" rules: [] |
创建一个sa
1 | kubectl create sa c-role |
查看sa对应的token:
kubectl describe secret c-role-token-98ztq
同时,我们创建一个clusterrolebinding关系test-c-role:把刚刚创建的sa和前面创建的clusterrole:c-role关系绑定起来。
1 | kubectl create clusterrolebinding test -c-role --clusterrole=c-role --serviceaccount=default:c-role |
验证:
此时通过c-role这个sa去登录dashboard,发现是什么权限都没有的。
创建一个aggregate对c-role进行权限添加
1 2 3 4 5 6 7 8 9 10 11 12 | cat cluster-role-aggregate.yaml kind: ClusterRole apiVersion: rbac.authorization.k8s.io /v1 metadata: name: c-role-endpoint labels: rbac.example.com /aggregate-to-monitoring : "true" #通过这个lable进行匹配,匹配上后进行权限添加 # These rules will be added to the "monitoring" role. rules: - apiGroups: [ "" ] resources: [ "services" , "endpoints" , "pods" , "namespaces" ] verbs: [ "get" , "list" , "watch" ] |
创建之后,再次查看权限:
1.2 rolebinding
需求:
1. 创建一个名为deployment-clusterrole的clusterrole
a) 该clusterrole只允许创建Deployment、Daemonset、Statefulset的create操作
2. 在app-team1的namespace下创建一个名为cicd-token的serviceAccount,并且将步骤1中创建clusterrole的权限绑定到该serviceAccount
创建clusterrole,名称为deployment-clusterrole,具备deployment、daemonset、statefulset的create权限;
1 2 3 4 5 6 7 8 9 10 | apiVersion: rbac.authorization.k8s.io /v1 kind: ClusterRole metadata: # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制 name: deployment-clusterrole rules: - apiGroups: [ "apps" ] # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets" resources: [ "deployments" , "daemonsets" , "statefulsets" ] verbs: [ "create" ] |
创建namespace和sa:
1 2 | kubectl create ns app-team1 kubectl create sa cicd-token -n app-team1 |
绑定权限到sa账户,并且固定在app-team1的namespace下面:
1 | kubectl create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1 |
验证:
1.无法查看deployment
2、创建一个deployment
3.查看
二、RBAC企业实战
2.1 如何授权
常用的、通用的权限,我们做成clusterrole,然后通过clusterrolebinding把role绑定到对应的namespace下面,即可实现。
2.2 授权最佳实现
2.3 实战
需求:
- 用户tencent可以查看default、kube-system下Pod的日志
- 用户alibaba可以在default下的Pod中执行命令,并且可以删除Pod
第一步,定义权限。定义一个可以查看所有namespace的clusterrole,用于后续role进行不同命名空间切换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | apiVersion: rbac.authorization.k8s.io /v1 kind: ClusterRole metadata: name: namespace- readonly rules: - apiGroups: - "" resources: - namespaces verbs: - get - list - watch - apiGroups: - metrics.k8s.io resources: - pods verbs: - get - list - watch |
第二步,通用权限定义
Pod删除权限
1 2 3 4 5 6 7 8 9 10 11 12 13 | apiVersion: rbac.authorization.k8s.io /v1 kind: ClusterRole metadata: name: pod-delete rules: - apiGroups: - "" resources: - pods verbs: - get - list - delete |
Pod执行权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | apiVersion: rbac.authorization.k8s.io /v1 kind: ClusterRole metadata: name: pod- exec rules: - apiGroups: - "" resources: - pods verbs: - get - list - apiGroups: - "" resources: - pods /exec verbs: - create |
Pod的log查看权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | apiVersion: rbac.authorization.k8s.io /v1 kind: ClusterRole metadata: name: pod-log rules: - apiGroups: - "" resources: - pods - pods /log verbs: - get - list - watch |
第三步,创建用户管理的命名空间,后面所有用户都放到这个命名空间下。
1 | kubectl create ns kube- users |
第四步,把kube-users这个组绑定namespace-readonly的权限,也就是kube-users下面的所有用户都可以读取所有命名空间。
1 | kubectl create clusterrolebinding namespace- readonly --clusterrole=namespace- readonly --serviceaccount=system:serviceaccounts:kube- users |
第五步,创建用户tencent,alibaba
1 | kubectl create sa tencent alibaba -n kube- users |
第六步,对用户tencent、alibaba授权
tencent对default和kube-system下有读取pod log的权限
1 2 | kubectl create rolebinding tencent-pod-log --clusterrole=pod-log --serviceaccount=kube- users :tencent --namespace=kube-system kubectl create rolebinding tencent-pod-log --clusterrole=pod-log --serviceaccount=kube- users :tencent --namespace=default |
alibaba可以对default命名空间下的pod具有执行和删除权限
1 2 | kubectl create rolebinding alibaba-pod- exec --clusterrole=pod- exec --serviceaccount=kube- users :alibaba --namespace=default kubectl create rolebinding alibaba-pod-delete --clusterrole=pod-delete --serviceaccount=kube- users :alibaba --namespace=default |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理