说明
这里简单记录一下如何通过k8s集群创建clusterrole配合serviceaccount实现权限控制,并且使用kubectl生成kubeconfig文件用于实现人员权限管理。
操作步骤
创建ClusterRole
这里参考了kube-apiserver初始化时生成的clusterrole.views权限设定
1 | apiVersion: rbac.authorization.k8s.io/v1 |
如果需要有Pod的exec权限可以创建一个ClusterRole
1 | apiVersion: rbac.authorization.k8s.io/v1 |
创建用户
1 | apiVersion: v1 |
创建ClusterRoleBinding
这里创建的ClusterRoleBinding是整个集群级别的
1 | apiVersion: rbac.authorization.k8s.io/v1 |
创建RoleBinding
这里创建的RoleBinding可以具体到某一个namespace
这里创建一个default命名空间的RoleBinding
1 | apiVersion: rbac.authorization.k8s.io/v1 |
获取ServiceAccount对应的Secret
1 | SECRET=$(kubectl -n default get serviceaccount cluster-readonly -o go-template='{{range .secrets}}{{.name}}{{end}}') |
定义Kube-APIServer
1 | API_SERVER="https://192.168.1.100:6443" |
获取集群CA证书
1 | kubectl -n default get secret ${SECRET} -o yaml | awk '/ca.crt:/{print $2}' | base64 -d > ca.crt |
获取ServiceAccount对应的Token
1 | TOKEN=$(kubectl -n default get secret ${SECRET} -o go-template='{{.data.token}}') |
定义kubeconfig文件名
1 | KUBECONFIG="cluster-readonly.kubeconfig" |
创建kubeconfig
- 设置kubeconfig集群信息
1 | kubectl config \ |
- 设置kubeconfig使用用户名+token认证
1 | kubectl config \ |
- 设置kubeconfig的context
1 | kubectl config \ |
- 将context设置为kubeconfig默认值
1 | kubectl config \ |
验证权限
有权限的操作
获取Pod
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i get pod --all-namespaces |
获取Pod日志
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i get pod --subresource=log --all-namespaces |
获取ingress
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i get ingress --all-namespaces |
返回结果
1 | yes |
无权限的操作
创建容器
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i create pods --all-namespaces |
删除容器
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i delete pods --all-namespaces |
获取Secret
1 | kubectl --kubeconfig=${KUBECONFIG} auth can-i get secrets -n kube-system |
返回结果
1 | no - no RBAC policy matched |