云容器引擎 CCE-命名空间权限(Kubernetes RBAC授权):自定义命名空间权限(kubectl)

时间:2024-05-31 08:37:53

自定义命名空间权限(kubectl)

kubectl访问CCE集群是通过集群上生成的配置文件(kubeconfig.json)进行认证,kubeconfig.json文件内包含用户信息,CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件,kubeconfig.json就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。而用户拥有的权限就是集群权限( IAM 授权)与命名空间权限(Kubernetes RBAC授权)的关系所示的权限。

除了使用cluster-admin、admin、edit、view这4个最常用的clusterrole外,您还可以通过定义Role和RoleBinding来进一步对命名空间中不同类别资源(如Pod、Deployment、Service等)的增删改查权限进行配置,从而做到更加精细化的权限控制。

Role的定义非常简单,指定namespace,然后就是rules规则。如下面示例中的规则就是允许对default命名空间下的Pod进行GET、LIST操作。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default                          # 命名空间
  name: role-example
rules:
- apiGroups: [""]
  resources: ["pods"]                         # 可以访问pod
  verbs: ["get", "list"]                      # 可以执行GET、LIST操作
  • apiGroups表示资源所在的API分组。
  • resources表示可以操作哪些资源:pods表示可以操作Pod,其他Kubernetes的资源如deployments、configmaps等都可以操作
  • verbs表示可以执行的操作:get表示查询一个Pod,list表示查询所有Pod。您还可以使用create(创建), update(更新), delete(删除)等操作词。

详细的类型和操作请参见使用 RBAC 鉴权

有了Role之后,就可以将Role与具体的用户绑定起来,实现这个的就是RoleBinding了。如下所示。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: RoleBinding-example
  namespace: default
  annotations:
    CCE.com/IAM: 'true'
roleRef:
  kind: Role
  name: role-example
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
  name: 0c97ac3cb280f4d91fa7c0096739e1f8    # user-example的用户ID
  apiGroup: rbac.authorization.k8s.io

这里的subjects就是将Role与IAM用户绑定起来,从而使得IAM用户获取role-example这个Role里面定义的权限,如下图所示。

图4 RoleBinding绑定Role和用户

subjects下用户的类型还可以是用户组,这样配置可以对用户组下所有用户生效。

subjects:
- kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7    # 用户组ID
  apiGroup: rbac.authorization.k8s.io

使用IAM用户user-example连接集群,获取Pod信息,发现可获取到Pod的信息。

# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
deployment-389584-2-6f6bd4c574-2n9rk   1/1     Running   0          4d7h
deployment-389584-2-6f6bd4c574-7s5qw   1/1     Running   0          4d7h
deployment-3895841-746b97b455-86g77    1/1     Running   0          4d7h
deployment-3895841-746b97b455-twvpn    1/1     Running   0          4d7h
nginx-658dff48ff-7rkph                 1/1     Running   0          4d9h
nginx-658dff48ff-njdhj                 1/1     Running   0          4d9h
# kubectl get pod nginx-658dff48ff-7rkph
NAME                     READY   STATUS    RESTARTS   AGE
nginx-658dff48ff-7rkph   1/1     Running   0          4d9h

然后查看Deployment和Service,发现没有权限;再查询kube-system命名空间下的Pod信息,发现也没有权限。这就说明IAM用户user-example仅拥有default这个命名空间下GET和LIST Pod的权限,与前面定义的没有偏差。

# kubectl get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default"
# kubectl get svc
Error from server (Forbidden): services is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "services" in API group "" in the namespace "default"
# kubectl get pod --namespace=kube-system
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"
support.huaweicloud.com/usermanual-cce/cce_10_0189.html