38、K8S-安全机制-RBAC之(cluster)role、(cluster)rolebinding
1、RBAC
1.1、基本简介
1.1.1、简介
RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 KubernetesAPI 动态配置策略。 Kubernetes的基本特性就是它的所有资源对象都是模型化的 API 对象,我们可以基于api-server对各种 资源进行增、删、改、查等操作,但是这些操作涉及到的不仅仅是资源本身和动作,而且还涉及到资源和动作 之间的内容,比如api的分组版本和资源和api的关联即权限授权等。
1.1.2、启用RBAC
要启用RBAC,需要在 apiserver 中添加参数--authorization-mode=RBAC, kubeadm安装的集群默认开启了RBAC,我们可以通过查看 Master 节点上 apiserver 的静态Pod定义文件: master1 ~]# cat /etc/kubernetes/manifests/kube-apiserver.yaml ... spec: containers: - command: - kube-apiserver - --advertise-address=192.168.10.26 - --allow-privileged=true - --authorization-mode=Node,RBAC - --client-ca-file=/etc/kubernetes/pki/ca.crt - --enable-admission-plugins=NodeRestriction - --enable-bootstrap-token-auth=true ...
2、授权
2.1、授权定义
授权指的是,将某些subject对象赋予执行某些资源动作的权限。我们有时候会将其称为
Group(权限组),而这个组其实是有两部分组成:组名和组关联(也称绑定)。
简单来说:所谓的授权,其实是为用户授予xx角色
2.2、RABC&ABAC流程图
2.3、Group(权限组)组成
2.3.1、组名
其实是附加在某些资源上的一系列权限,对于k8s来说,它主要有两类:Role和
clusterRole,其中Role主要是作用于namespace,而clusterRole主要作用于多个
namespace,它们之间是一对多的关系。
我们为了将权限应用和具体权限列表分开描述,我们一般称权限列表为规则-rules
2.3.2、组关联(绑定)
所谓的组关联其实是将我们之前定义的Subject和对应的权限组关联在一起,表示某个Subject具有执行某个资源的一系列动作权限。
它主要涉及到两个RoleBingding和ClusterRoleBingding。
2.4、属性解析
为了更好的解释这四个属性,我们按照其工作的范围将其划分为三类进行描述:namespace级别、cluster级别、混合级别。
2.4.1、namespace级别
术语 解析
rules 规则,是一组属于不同 API Group 资源上的权限操作的集合
role 表示在一个namespace中基于rules使用资源的权限,属于集群内部的 API 资源,主要涉及到操作和对象
RoleBingding 将Subject和Role绑定在一起,表示Subject可以在namespace中使用指定资源的role角色权限
2.4.2、cluster级别
术语 解析
ClusterRole 表示在一个cluster中基于rules使用资源的权限,属于集群内部的 API 资源,一个cluster有多个namespace即有多个role
ClusterRoleBingding 将Subject和ClusterRole绑定在一起,表示Subject可以在cluster中使用指定资源的ClusterRole角色权限
2.4.3、混合级别
术语:RoleBingding 解析:将Subject基于RoleBingding与ClusterRole绑定在一起,表示Subject可以使用 所有namespace中指定资源的role角色,从而避免了多次role和user的RoleBingding。 同样的操作,站在ClusterRole的角度,我们可以理解为,用户得到的权限仅是 ClusterRole的权限在Rolebinding所属的名称空间上的一个子集,也就是所谓的"权限降级"
2.4.4、场景举例
多个namespace中的role角色都一致,如果都使用内部的RoleBingding的话,每个namespace都必
须单独创建role,而使用ClusterRole的话,只需要一个就可以了,大大的减轻批量使用namespace中的RoleBingding 操作。
3、namespace级别-Role-实践
3.1、Role属性解析
3.1.1、查看role详细参数
master1 ~]# kubectl explain role apiVersion <string> kind <string> metadata <Object> rules <[]Object> apiGroups <[]string> nonResourceURLs <[]string> resourceNames <[]string> resources <[]string> verbs <[]string> -required 结果显示: 对于role来说,其核心的内容主要是rules的权限规则 在这么多rules属性中,最重要的是verbs就是权限条目,而且所有的属性都是可以以列表的形式累加存在。
3.1.2、通过命令生成role的yaml配置
# 查看pod角色具有get、list权限的role的资源定义文件格式 master1 ~]# kubectl create role pod-reader --verb=get,list --resource=pods --dry-run=client -o yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null # 创建的时间 name: pod-reader # role名字 rules: # 规则 - apiGroups: # api操作的对象 - "" # 默认所有 resources: # 资源对象 - pods verbs: # 资源的权限 - get # 获取-权限 - list # 查看-权限 一个role必备的rules来说,它主要有三部分组成:apiGroup、resources、verbs apiGroups 设定包含资源的api组,如果是多个,表示只要属于api组范围中的任意资源都可以操作 resources 位于apiGroup范围中的某些具体的资源对象 verbs 针对具体资源对象的一些具体操作 关于apiGroups的信息获取,参考官网:https://kubernetes.io/docs/reference/#api-reference
3.2、yaml创建一个role
3.2.1、定义资源配置清单
cat >security-myrole.yml<<'EOF' apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: myrole rules: - apiGroups: ["", "extensions", "apps"] resources: ["pods", "deployments", "replicasets"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] EOF 属性解析: apiGroups Pod属于 core 的 API Group,在YAML中用空字符就可以 Deployment 属于 apps 的 API Group ReplicaSets属于extensions这个 API Group,所以 rules 下面的 apiGroups 的内容:["", "extensions", "apps"] verbs 是可以对这些资源对象执行的操作,如果是所有动作,也可以使用["*"]来代替。
3.2.2、应用资源配置清单
master1 ]# kubectl apply -f security-myrole.yml role.rbac.authorization.k8s.io/myrole created master1 ]# kubectl get role NAME CREATED AT myrole 2023-03-30T12:51:09Z master1 ]# kubectl describe role myrole Name: myrole Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- deployments [] [] [get list watch create update patch delete] pods [] [] [get list watch create update patch delete] replicasets [] [] [get list watch create update patch delete] deployments.apps [] [] [get list watch create update patch delete] pods.apps [] [] [get list watch create update patch delete] replicasets.apps [] [] [get list watch create update patch delete] deployments.extensions [] [] [get list watch create update patch delete] pods.extensions [] [] [get list watch create update patch delete] replicasets.extensions [] [] [get list watch create update patch delete]
4、namespace级别-rolebinding-实践
4.1、rolebinding属性解析
4.1.1、查看rolebinding详细参数
通过explain的命令来看一下rolebinding的属性信息
master1 ]# kubectl explain rolebinding apiVersion <string> kind <string> metadata <Object> roleRef <Object> -required subjects <[]Object> 对于角色绑定来说,主要涉及到两点:subject和对应的role权限列表,其中roleRef是必选项。
4.1.2、使用命令将user与role绑定并且生成yaml的配置
# 这里cyc的subject来与myrole进行一次模拟绑定查看属性效果 master1 ~]# kubectl create rolebinding cyc-myrole --role=myrole --user=cyc -o yaml --dry-run=client apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: cyc-myrole roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: myrole subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: cyc # 对于roleRef和subjects分别写好其对应的资源属性信息即可
# 生成yml配置清单
master1]# kubectl create rolebinding cyc-myrole --role=myrole --user=cyc -o yaml --dry-run=client >security-rolebinding.yml
4.2、创建user与role绑定
4.2.1、使用命令创建关联
kubectl create rolebinding cyc-myrole --role=myrole --user=cyc
注意:如果是多个用户的话,可以多来几个 --user=subject 彼此间使用空格隔开即可
4.2.2、使用yaml创建关联
kubectl apply -f security-rolebinding.yml
注意:如果是多个用户的话,可以多来几个 --user=subject 彼此间使用空格隔开即可
4.2.3、rolebinding结果查询
master1 ]# kubectl get rolebindings NAME ROLE AGE cyc-myrole Role/myrole 62s master1 ]# kubectl describe rolebindings cyc-myrole Name: cyc-myrole Labels: <none> Annotations: <none> Role: Kind: Role Name: myrole Subjects: Kind Name Namespace ---- ---- --------- User cyc # 已经加入到 myrolebinding 角色绑定组中了,这里的namespace没有写,表示默认的default命名空间
4.2.4、验证权限是否生效
1、查看当前namespace:default中资源效果 master1 ]# kubectl get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE pod-sa-admin 1/1 Running 0 7h39m 2、查看default命名空间中,非pod、deployment、rs之外的资源 master1 ]# kubectl get secrets --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): secrets is forbidden: User "cyc" cannot list resource "secrets" in API group "" in the namespace "default" # 在我们role之外的内容我们都没有权限查看 3、查看非当前namespace中的资源 master1 security]# kubectl -n kube-system get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): pods is forbidden: User "cyc" cannot list resource "pods" in API group "" in the namespace "kube-system" # 在当前role权限范围内容,其它namespace中的资源,我们生效不了,因为role只是针对某个具体的ns
4.3、创建serviceaccounts(SA)与role绑定
4.3.1、命令格式介绍
# 查看SA的角色绑定格式 kubectl create rolebinding NAME --role=NAME [--serviceaccount=namespace:serviceaccountname] 属性解析:我们在基于服务账号进行关联的时候,需要关注一下该SA所属的namespace信息。
4.3.2、将sa与myrole进行绑定
# 相关的创建serviceaccount帐号教程: https://www.cnblogs.com/ygbh/p/17270653.html#_lab2_5_3 # 1、我们的自建的sa是admin而且是属于default空间 master1 ]# kubectl get sa admin -o yaml | grep namespace {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"admin","namespace":"default"}} namespace: default # 2、我们先将admin和myrole进行绑定,查看一下效果 master1 ]# kubectl create rolebinding myrolebinding-sa-admin --role=myrole --serviceaccount=default:admin rolebinding.rbac.authorization.k8s.io/myrolebinding-sa-admin created master1 ]# kubectl describe rolebindings myrolebinding-sa-admin Name: myrolebinding-sa-admin Labels: <none> Annotations: <none> Role: Kind: Role Name: myrole Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount admin default # 我们的admin加入到了myrolebinding1的绑定组中了,而且显示了特定的命名空间
5、集群绑定-clusterRole、ClusterRoleBingding-实践
5.1、简介
5.1.1、简介说明
所谓的cluster级别的实践主要涉及到clusterRole和ClusterRoleBingding之间的操作,也就是说我们可以操作多个namespace空间的资源。
5.1.2、属性解析
kubectl explain clusterrole aggregationRule <Object> apiVersion <string> kind <string> metadata <Object> rules <[]Object> apiGroups <[]string> nonResourceURLs <[]string> resourceNames <[]string> resources <[]string> verbs <[]string> -required结果显示:
clusterrole相对于role的属性多了一个集中控制器的属性aggregationRule,而这是一个可选的属性
5.1.3、创建clusterrole命令使用
master1 ~]# kubectl create clusterrole myclusterrole --verb=get,list --resource=pods -o yaml --dry-run=client apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: creationTimestamp: null name: myclusterrole rules: - apiGroups: - "" resources: - pods verbs: - get - list 单从模板的资源配置样式来说,他的配置信息与role的配置信息几乎一样
5.2、角色创建
5.2.1、创建资源配置清单
cat >security-myclusterrole.yml<<'EOF' apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: myclusterrole rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] EOF
5.2.2、应用资源配置清单
kubectl apply -f security-myclusterrole.yml master1 ]# kubectl get clusterrole | grep -E 'my|NAME' NAME CREATED AT myclusterrole 2023-03-30T14:25:20Z master1 ~]# kubectl describe clusterrole myclusterrole Name: myclusterrole Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get list watch] # 在myclasterrole仅仅有pod资源的三种权限
5.3、角色绑定
5.3.1、命令格式
命令格式 kubectl create clusterrolebinding NAME --clusterrole=NAME [--user=username] ...
属性解析 对于clusterrolebinding来说,仅仅允许集群角色进行和其进行绑定,对于普通的role来说就无效了
5.3.2、生成cyc用户和myclasterrole进行角色绑定的yaml【只做配置清单时用到】
master1 ~]# kubectl create clusterrolebinding myclusterrolebing --clusterrole=myclusterrole --user=cyc -o yaml --dry-run W0330 22:30:27.161658 107064 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: creationTimestamp: null name: myclusterrolebing roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: myclusterrole subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: cyc 属性解析: 这里的属性配置与我们之前的role和rolebinding的方法几乎一样 区别就是kind和--clusterrole的不同
5.3.3、确定cluserrolebinding绑定cyc用户
master1 ~]# kubectl create clusterrolebinding myclusterrolebing --clusterrole=myclusterrole --user=cyc
clusterrolebinding.rbac.authorization.k8s.io/myclusterrolebing created
5.3.4、查询绑定结果
master1 ~]# kubectl get clusterrolebindings.rbac.authorization.k8s.io | grep -E 'NAME|my' NAME ROLE AGE myclusterrolebing ClusterRole/myclusterrole 26s master1 ~]# kubectl describe clusterrolebindings myclusterrolebing Name: myclusterrolebing Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: myclusterrole Subjects: Kind Name Namespace ---- ---- --------- User cyc # 我们将cyc的账号,赋予了操作集群角色的权限
5.3.5、切换账号查看效果
master1 ~]# kubectl get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE pod-sa-admin 1/1 Running 0 9h master1 ~]# kubectl -n kube-system get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE coredns-75c9cf9bd7-55d6h 1/1 Running 0 7d7h ... kube-scheduler-master3 1/1 Running 5 (24h ago) 14d ... 对于clusterrolebinding来说,绑定后的user account不但可以看到当前namespace中的资源对象,还能看到其他namespace中的资源对象
6、RBAC-混合级别
6.1、基础知识
6.1.1、功能需求
所谓的cluster级别的实践主要涉及到clusterRole和rolebinding之间的操作,也就是说虽然我们可以
操作很大范围的权限,但是由于某个特殊的场景我们需要避免大的权限,采用rolebinding的方式来主动降
低可行的执行权限,即,在混合级别实践的场景中,无论我们的用户是哪一个,我们只需要关联同一个
clusterrole,那么这个用户只能在指定的namespace空间中进行响应的操作。
6.1.2、准备工作
# 还原环境 kubectl delete rolebinding myrolebinding kubectl delete rolebinding myrolebinding1 kubectl delete clusterrolebinding myclusterrolebinding 当前subject和clusterrole现状 ]$ kubectl get clusterrole | egrep 'NA|my' NAME CREATED AT myclasterrole 2021-10-06T23:28:08Z ]$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-admin@kubernetes kubernetes kubernetes-admin
6.2、命令介绍
kubectl create rolebinding NAME --clusterrole=NAME|--role=NAME [--user=username]
属性解析:
对于rolebinding来说,我可以基于clusterrole和role两种角色进行绑定操作。
6.3、user、rolebinding、clusterrole-角色绑定
6.3.1、命令生成资源配置清单
master1 ~]# kubectl create rolebinding merge-role --clusterrole=myclusterrole --user=cyc -o yaml --dry-run=client apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: merge-role roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: mycluster subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: cyc master1 ]# kubectl create rolebinding merge-role --clusterrole=myclusterrole --user=cyc -o yaml --dry-run=client >security-merge-binding.yml
6.3.2、修改资源配置清单
master1 ]# vi security-merge-binding.yml creationTimestamp: null apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: default name: merge-role roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: myclusterrole subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: cyc
# 我们将自动生成的配置文件中的时间戳删除,然后给其设定了一个namespace的权限范围属性
6.3.3、应用资源配置清单
master1 ]# kubectl apply -f security-merge-binding.yml rolebinding.rbac.authorization.k8s.io/merge-role created master1 ]# kubectl get rolebindings.rbac.authorization.k8s.io NAME ROLE AGE merge-role ClusterRole/mycluster 86s master1 ~]# kubectl describe rolebindings merge-role Name: merge-role Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: myclusterrole Subjects: Kind Name Namespace ---- ---- --------- User cyc # 我们已经将cyc采用rolebinding的方式赋予其clusterrole的角色权限
6.3.4、检查效果
master1 ]# kubectl -n default get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE pod-sa-admin 1/1 Running 0 9h master1 ]# kubectl -n kube-system get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): pods is forbidden: User "cyc" cannot list resource "pods" in API group "" in the namespace "kube-system" # 对于rolebinding的clusterrole来说,我们只能访问指定的default空间中的资源了
6.4、权限-实践
6.4.1、简介
# 我们知道对于自定义的myclusterrole来说,它对于pod只有查看的权限查询如下: master1 ~]# kubectl describe clusterrole myclusterrole Name: myclusterrole Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get list watch] # 没有删除的权限,我们无法对dafault命名空间的pod资源做权限之外的事情。 master1 ~]# kubectl delete pod pod-sa-admin --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): pods "pod-sa-admin" is forbidden: User "cyc" cannot delete resource "pods" in API group "" in the namespace "default"
6.4.2、隐患
我们知道官方也给default空间提供了很多权限,admin的权限就是极大,admin的clusterrole它是在default命名空间中的,而且对pod有各种操作权限
master1 ~]# kubectl get clusterrole admin -o yaml aggregationRule: clusterRoleSelectors: - matchLabels: rbac.authorization.k8s.io/aggregate-to-admin: "true" apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: "2023-03-16T12:07:00Z" labels: kubernetes.io/bootstrapping: rbac-defaults name: admin resourceVersion: "321" uid: 71822188-84e5-4783-b2d3-d8836134b47c rules: - apiGroups: - "" resources: - pods/attach - pods/exec - pods/portforward - pods/proxy - secrets - services/proxy verbs: - get - list - watch - apiGroups: - "" resources: - serviceaccounts verbs: - impersonate - apiGroups: - "" resources: - pods - pods/attach - pods/exec - pods/portforward - pods/proxy verbs: - create - delete - deletecollection - patch - update - apiGroups: - "" resources: - pods/eviction verbs: - create - apiGroups: - "" resources: - configmaps - events - persistentvolumeclaims - replicationcontrollers - replicationcontrollers/scale - secrets - serviceaccounts - services - services/proxy verbs: - create - delete - deletecollection - patch - update - apiGroups: - "" resources: - serviceaccounts/token verbs: - create - apiGroups: - apps resources: - daemonsets - deployments - deployments/rollback - deployments/scale - replicasets - replicasets/scale - statefulsets - statefulsets/scale verbs: - create - delete - deletecollection - patch - update - apiGroups: - autoscaling resources: - horizontalpodautoscalers verbs: - create - delete - deletecollection - patch - update - apiGroups: - batch resources: - cronjobs - jobs verbs: - create - delete - deletecollection - patch - update - apiGroups: - extensions resources: - daemonsets - deployments - deployments/rollback - deployments/scale - ingresses - networkpolicies - replicasets - replicasets/scale - replicationcontrollers/scale verbs: - create - delete - deletecollection - patch - update - apiGroups: - policy resources: - poddisruptionbudgets verbs: - create - delete - deletecollection - patch - update - apiGroups: - networking.k8s.io resources: - ingresses - networkpolicies verbs: - create - delete - deletecollection - patch - update - apiGroups: - coordination.k8s.io resources: - leases verbs: - create - delete - deletecollection - get - list - patch - update - watch - apiGroups: - "" resources: - configmaps - endpoints - persistentvolumeclaims - persistentvolumeclaims/status - pods - replicationcontrollers - replicationcontrollers/scale - serviceaccounts - services - services/status verbs: - get - list - watch - apiGroups: - "" resources: - bindings - events - limitranges - namespaces/status - pods/log - pods/status - replicationcontrollers/status - resourcequotas - resourcequotas/status verbs: - get - list - watch - apiGroups: - "" resources: - namespaces verbs: - get - list - watch - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - get - list - watch - apiGroups: - apps resources: - controllerrevisions - daemonsets - daemonsets/status - deployments - deployments/scale - deployments/status - replicasets - replicasets/scale - replicasets/status - statefulsets - statefulsets/scale - statefulsets/status verbs: - get - list - watch - apiGroups: - autoscaling resources: - horizontalpodautoscalers - horizontalpodautoscalers/status verbs: - get - list - watch - apiGroups: - batch resources: - cronjobs - cronjobs/status - jobs - jobs/status verbs: - get - list - watch - apiGroups: - extensions resources: - daemonsets - daemonsets/status - deployments - deployments/scale - deployments/status - ingresses - ingresses/status - networkpolicies - replicasets - replicasets/scale - replicasets/status - replicationcontrollers/scale verbs: - get - list - watch - apiGroups: - policy resources: - poddisruptionbudgets - poddisruptionbudgets/status verbs: - get - list - watch - apiGroups: - networking.k8s.io resources: - ingresses - ingresses/status - networkpolicies verbs: - get - list - watch - apiGroups: - authorization.k8s.io resources: - localsubjectaccessreviews verbs: - create - apiGroups: - rbac.authorization.k8s.io resources: - rolebindings - roles verbs: - create - delete - deletecollection - get - list - patch - update - watch
6.4.3、使用cyc用户具备命令空间:default 删除pod的权限
# 关联admin clusterrole master1 ~]# kubectl create rolebinding default-ns-admin --clusterrole=admin --user=cyc rolebinding.rbac.authorization.k8s.io/default-ns-admin created # 删除原来关联 master1 ~]# kubectl delete rolebindings merge-role rolebinding.rbac.authorization.k8s.io "merge-role" deleted # 查询设置 master1 ~]# kubectl describe rolebindings default-ns-admin Name: default-ns-admin Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: admin Subjects: Kind Name Namespace ---- ---- --------- User cyc # 使用cyc用户,获取pod master1 ~]# kubectl get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE pod-sa-admin 1/1 Running 0 10h # 使用cyc用户,删除pod master1 ~]# kubectl delete pod pod-sa-admin --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf pod "pod-sa-admin" deleted # 查询命令空间:kube-system,没有权限 master1 ~]# kubectl -n kube-system get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): pods is forbidden: User "cyc" cannot list resource "pods" in API group "" in the namespace "kube-system" # 我们只能管理当前命名空间的资源,其他命名空间的资源是管理不了的。
6.4.4、为什么绑定admin,只能管理default呢?
# 原因是rolebindings命令空间配置default,所以只能管理default master1 ~]# kubectl get rolebindings default-ns-admin -o yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-03-30T15:35:45Z" name: default-ns-admin namespace: default resourceVersion: "1001958" uid: 8e374dff-323a-4ab1-a848-e1281c8240ec roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: cyc
6.4.5、指定命名空间rolebinding
# 删原来的配置 kubectl delete rolebinding default-ns-admin; # 指定命令空间创建 kubectl create rolebinding default-ns-admin --clusterrole=admin --user=cyc --namespace=kube-system; # 此时cyc用户,可以的管理kube-system权限 master1 ~]# kubectl -n kube-system get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf NAME READY STATUS RESTARTS AGE coredns-75c9cf9bd7-55d6h 1/1 Running 0 7d9h #此时命令空间:default,也不能被cyc用户管理 master1 ~]# kubectl -n default get pod --context=cyc@mycluster --kubeconfig=/tmp/cyc.conf Error from server (Forbidden): pods is forbidden: User "cyc" cannot list resource "pods" in API group "" in the namespace "default"