之前我们学习了创建基于集群级别的账号和管理配置的方法,具体可以查看这个笔记:https://sulao.cn/post/939.html。
实际在k8s的使用过程中,我们通常以命名空间来隔离项目或者团队,那么这个时候就有一些需求,就是通过k8s RBAC创建的账户只用于某一个命名空间下,那么这样的账户创建和之前基于集群的创建是稍有区别的,那么我们一起来看看创建过程和创建方法
前面的操作也是一样,需要创建一个私钥和证书签名请求
openssl genrsa -out sulao.key 2048 openssl req -new -key sulao.key -out sulao.csr -subj "/CN=sulao"
接着就是使用k8s集群证书签署用户的证书
openssl x509 -req -in sulao.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out sulao.crt -days 365
接下来我们就需要基于k8s的RBAC来授权这个用户
主要使用的是Role和RoleBinding,而基于集群的用户授权需要使用ClusterRole和ClusterRoleBinding,这个也是我们之前学习过的。
我们首先创建Role
cat test-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: orion name: test-role rules: - apiGroups: ["","apps"] resources: ["pods"] verbs: ["get", "watch", "list"]
复制以上内容到test-role.yaml文件,然后apply创建
接着我们创建RoleBinding
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: test-role-binding namespace: orion subjects: - kind: User name: sulao #之前使用证书创建的授权用户名 apiGroup: "" roleRef: kind: Role #Role name: test-role #需要绑定的Role名字 apiGroup: ""
复制以上文件到test-role-binding.yaml然后apply创建
上面的都处理好以后,我们依然是需要使用原有的config文件做修改,并通过下面命令获取证书签名请求的base64和私钥的base64
cat sulao.crt | base64 --wrap=0 cat sulao.key | base64 --wrap=0
contexts中的user改为创建的readonly
contexts中的name改为readonly@kubernetes
current-context中的kubernetes-admin@kubernetes改为readonly@kubernetes
users中的name改为readonly
users中的client-certificate-data字段改为readonly.crt base64加密后的内容
users中的client-key-data 改为readonly.key base64 加密后的内容
最后我们将修改好的config文件放置到~/.kube目录下,然后执行命令进行测试
可以看到orion命名空间下的POD可以查看到,但是其他命名空间,或者全局的POD资源提示没有权限。