前言

42a2b1c95b06e61eea0dbbb840f9f990.png

K8S

kubernetes应用越来越广泛,我们kubernetes集群中也会根据业务来划分不同的命名空间,随之而来的就是安全权限问题,我们不可能把集群管理员账号分配给每一个人,有时候可能需要限制某用户对某些特定命名空间的权限,比如开发和测试人员也可能需要登录集群,了解应用的运行情况,查看pod的日志,甚至是修改某些配置。这时候,我们可以通过创建受限的kubeconfig文件,将该config分发给有需要的人员,让他们能通过kubectl命令实现一些允许的操作。

创建集群级别的角色 ClusterRole

clusterrole.dev-log.yaml 用于提供对pod的完全权限和其它资源的查看权限。

# 提供基本权限apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata:  name: dev-logrules:- apiGroups:  - ""  resources:  - pods  - pods/exec  verbs:  - create  - get  - list  - watch- apiGroups:  - ""  resources:  - pods  verbs:  - delete- apiGroups:  - ""  resources:  - endpoints  - services  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:  - apps  resources:  - deployments  - deployments/rollback  - deployments/scale  - statefulsets  verbs:  - get  - list  - watch- apiGroups:  - autoscaling  resources:  - horizontalpodautoscalers  verbs:  - get  - list  - watch- apiGroups:  - batch  resources:  - cronjobs  - jobs  - scheduledjobs  verbs:  - get  - list  - watch- apiGroups:  - extensions  resources:  - daemonsets  - deployments  - ingresses  - replicasets  verbs:  - get  - list  - watch

在default命名空间应用配置文件:

$ kubectl apply -f clusterrole.dev-log.yaml -n default$ kubectl get ClusterRole -n default

在default命名空间创建 ServiceAccount

创建ServiceAccount后,会自动创建一个绑定的 secret ,后面在kubeconfig文件中,会用到该secret中的token。

$ kubectl create serviceaccount dev -n default$ kubectl get serviceaccount -n default

对ServiceAccount和集群角色建立绑定关系

对需要的namespace进行授权,以下示例为对app命名空间授权。

$ kubectl create rolebinding rbd-dev --clusterrole=dev-log --serviceaccount=default:dev --namespace=app

获取ServiceAccount的secret中的token

$ kubectl get serviceaccounts dev -o yamlapiVersion: v1kind: ServiceAccountmetadata:  creationTimestamp: "2020-06-03T06:36:29Z"  name: dev  namespace: app  resourceVersion: "2633621"  selfLink:xxx  uid: xxsecrets:- name: dev-token-v97rh

对应的secret名称为:dev-token-v97rh。

$ kubectl get secrets dev-token-v97rh -o yamlapiVersion: v1data:  ca.crt: xxxnamespace: aGFkb29wtoken:  xxxkind: Secretmetadata:  annotations:    kubernetes.io/service-account.name: dev    kubernetes.io/service-account.uid: xxx  creationTimestamp: "2020-06-03T06:36:29Z"  name: dev-token-v97rh  namespace: app  resourceVersion: "2633620"  selfLink: xxx  uid:xxxtype: kubernetes.io/service-account-token

该secret的token为:token=xxx

该token是经过base64处理的,需要进行解码处理。

$ echo $token | base64 -dxxx

组装config文件

将token填充到以下的config配置中:

# configapiVersion: v1kind: Configclusters:- cluster:    server: K8S集群地址    certificate-authority-data: "ca.crt后的内容"  name: k8s-devusers:- name: "devlog"  user:    token: "解码后的token字符串"contexts:- context:    cluster: dev    user: "dev"  name: devpreferences: {}current-context: dev

将该文件保存为config 并放入 $HOME/.kube/ 目录下即可。

至此,k8s限制用户在多个namespace上的访问权限操作完成。

后记

K8S权限控制是很复杂的,本文只是最简单的一种,因为工作需要,做个记录。后面有其他的需求再做补充。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐