生产环境对于业务的稳定性要求是相当高的,为了防止误操作,通常是通过不同的账号与权限来进行限制的。对于k8s集群而言,部署的时候通常是以linux root用户的身份进行部署的,k8s的安全机制是,认证、鉴权、准入控制;意味着除root用户外,其他普通用户不具备请求k8s集群资源的权限。普通用户访问k8s资源需要做认证与授权操作。
1、查看
认证之前首先查看普通用户(自定义的普通用户zs)访问k8s集群报什么错
[root@master01 ~]# su - zs
[zs@master01 ~]$ kubectl get nodes
报错提示:连接到本机8080端口的服务被拒绝了,是否指明了正确的主机或者端口。即不能与apiserver交互。
2、创建证书(切回root用户)
[root@master01 ~]# cd /etc/kubernetes/pki/
[root@master01 pki]# openssl genrsa -out zs.key 2048
[root@master01 pki]# openssl req -new -key zs.key -out zs.csr -subj "/CN=zs/O=zs"
[root@master01 pki]# openssl x509 -req -in zs.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zs.crt -days 3650
3、查看、设置集群、用户、上下文信息
查看集群信息、因为我之前做高可用,所以监听的端口是16443而不是6443,正常情况下默认是6443。
[zs@master01 ~]$ kubectl cluster-info
设置名为kubernetes集群
[root@master01 pki]# kubectl config set-cluster kubernetes --embed-certs=true --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.11.200:16443
设置用户
[root@master01 pki]# kubectl config set-credentials zs --embed-certs=true --client-certificate=/etc/kubernetes/pki/zs.crt --client-key=/etc/kubernetes/pki/zs.key
设置上下文信息
[root@master01 pki]# kubectl config set-context zs@kubernetes --cluster=kubernetes --user=zs
4、拷贝证书文件即集群文件至普通用户家目录,并更改归属关系
[root@master01 pki]# mkdir /home/zs/.kube
[root@master01 pki]# cp zs.key zs.crt zs.csr /home/zs/
[root@master01 pki]# cp /root/.kube/config /home/zs/.kube/
[root@master01 pki]# chown -R zs:zs /home/zs/
此时认证已经完成,但是认证完成并不代表你有任何权限访问集群资源
授权即创建角色,并将角色与对象绑定
1、创建Clusterrole与Clusterrolebinding,即用户与权限绑定实现用户对资源的请求操作
[root@master01 test]# kubectl apply -f zs.clusterrrole.clusterrolebind.yml
[root@master01 test]# cat zs.clusterrole.clusterrolebind.yml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: zsclusterrole
rules:
- apiGroups: ["*"] # "" 表示所有api组
resources: ["*"] #*表示所有资源
verbs: ["list","watch","get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: zsclusterrolebinding
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: User
name: zs # "name" 是区分大小写的
apiGroup: rbac.authorization.k8s.io
roleRef:
# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: ClusterRole # 此字段必须是 Role 或 ClusterRole
name: zsclusterrole # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: rbac.authorization.k8s.io
此时已经完成角色创建及绑定,即可以访问哪些资源,对哪些资源有什么操作权限。
2、验证操作
切换到zs用户,查看当前所处的上下文,并非zs用户的,切换到zs用户的上下文
[root@master01 ~]# su - zs
[zs@master01 ~]$ kubectl config get-contexts
[zs@master01 ~]$ kubectl config use-context zs@kubernetes
验证鉴权操作,因为上面设置的权限是对所有资源有查看权限,这里使用删除作为验证。集群中有一个我自定义的deployment与service
[zs@master01 ~]$ kubectl get svc,deployment
[zs@master01 ~]$ kubectl delete deployments.apps nginx-deployment
[zs@master01 ~]$ kubectl delete svc define
最终,发现所有资源都可以看,因为上面设置的权限是看,但是不能删除。权限即角色的创建与修改可以根据需要自行查看。