k8s基于role创建指定命名空间下的账户和config管理文件

之前我们学习了创建基于集群级别的账号和管理配置的方法,具体可以查看这个笔记: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 加密后的内容

微信截图_20231207200257.png

最后我们将修改好的config文件放置到~/.kube目录下,然后执行命令进行测试

微信截图_20231207200159.png

可以看到orion命名空间下的POD可以查看到,但是其他命名空间,或者全局的POD资源提示没有权限。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/940.html