kubernetes-RBAC介绍

一、概述

RBAC: Role-Based Access Control,基于角色的权限控制。

从kubernetes1.6版本起,RBAC成为kubernetes默认的访问控制策略。

RBAC主要包含以下概念:

Role:角色,角色定义了一组权限的集合,例如只读权限,读写权限

Subject:主体,主体是角色,可以是用户,也可以是ServiceAccount,在实际使用中,主体通常是ServiceAccount。

RoleBinding:定义了角色和主体之间的绑定关系。

关系图:

 

二、Role & ClusterRole

kubernetes有role以及clusterrole两种角色,简单来说就是role是受namespace制约的,role的作用仅在指定的namespace中生效,而clusterrole是定义到整个集群作用域上,不受namespace的制约,也就是clusterrole是对整个k8s集群生效的。

我们来定义一个role:

准备role的yaml文件---nginx_role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: scm-tools
  name: nginx-pod-reader
rules:
# 表示对核心api group中的pod资源有只读的权限
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
# 表示对"batch"以及"extensions" api group中的job资源有读写权限
- apiGroups: ["batch", "extensions"]
  resources: ["jobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

创建role:

kubectl apply -f nginx_role.yaml

我们定义了一个role,名称是nginx-pod-reader,属于scm-tools这个namespace,对核心api组下的pod资源拥有 get、list、watch操作权限,对batch和extensions api组中的job资源拥有["get", "list", "watch", "create", "update", "patch", "delete"] 一系列读写权限。

查看刚刚创建的role:

[root@scm-master nginx]# kubectl get role -n scm-tools | grep nginx-pod-reader
nginx-pod-reader                        70m

再来看看clusterrole,clusterrole和role的区别在于作用域不同。

准备ClusterRole的yaml文件---cluster_role.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # ClusterRole不受namespace的制约,这里不需要指定namespace
  name: secrets-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

创建ClusterRole:

kubectl apply -f cluster_role.yaml

查看创建的ClusterRole:

[root@scm-master nginx]# kubectl get clusterrole | grep secrets-reader
secrets-reader                                                         52m

 

三、ServiceAccount

ServiceAccount是提供给服务使用的一个账号,创建比较简单,我们来看看它的yaml文件:

apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: scm-tools
  name: nginx-svc-acc

创建ServiceAccount:

kubectl apply -f nginx_svc_acc.yaml

查看创建的ServiceAccount:

[root@scm-master nginx]# kubectl get sa -n scm-tools | grep nginx
nginx-svc-acc            1         5m58s

四、RoleBinding & ClusterRoleBinding

RoleBinding和ClusterRoleBinding 是将 Role、ClusterRole和相应的ServiceAccount绑定起来,使得ServiceAccount具有Role中描述的相关权限来访问k8s集群中对应的资源

准备RoleBinding的yaml文件---role_binding.yaml

apiVersion: rbac.authorization.k8s.io/v1
# 这个角色绑定允许 "scm-nginx" 服务账号在 "scm-tools" 命名空间中有读取pod 的权限。
kind: RoleBinding
metadata:
  name: read-pods
  namespace: scm-tools # 这里只授予 "scm-tools" 命名空间的权限。
subjects:
- kind: ServiceAccount
  name: nginx-svc-acc
  apiGroup: ""
roleRef:
  kind: Role
  name: nginx-pod-reader
  apiGroup: rbac.authorization.k8s.io

创建rolebinding:

kubectl apply -f role_binding.yaml

查看创建的rolebinding:

[root@scm-master nginx]# kubectl get rolebinding -n scm-tools | grep read-pods
read-pods                               21s

同理创建ClusterRoleBinding也是类似的,ClusterRoleBinding的yaml文件:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-pods-cluster-role
subjects:
- kind: ServiceAccount
  name: nginx-svc-acc
  namespace: scm-tools
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: secrets-reader
  apiGroup: rbac.authorization.k8s.io

 

五、为pod分配ServiceAccount

上面的步骤都完成之后,我们就要为pod分配已经完成角色绑定的ServiceAccount了,使得pod能够使用ServiceAccount中拥有的对k8s资源的操作权限, 这里以nginx的deployment.yaml为例,可能nginx并不需要设置RBAC策略,仅仅是在此处作为示例展示。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
  namespace: scm-tools
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      serviceAccountName: nginx-svc-acc

创建deployment之后,我们查看nginx的pod:

kubectl edit po nginx-deployment-5c9786c4dd-54v7d -n scm-tools

可以看到ServiceAccount已经添加到pod中了,ServiceAccount具备的权限也随之生效了。

参考资料:

https://www.kubernetes.org.cn/4062.html

https://www.cnblogs.com/chenqionghe/p/11685529.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值