为确保安全,`kubernetes` 系统各组件需要使用 `x509` 证书对通信进行加密和认证。
当我执行 kubectl exec 命令来登陆到 Pod 里面进行操作。遇到以下问题:
[root@k97 work]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dnsutils-ds-bd9pz 1/1 Running 0 26s 172.16.176.4 k99 <none> <none>
dnsutils-ds-p4d2x 1/1 Running 0 26s 172.16.120.4 k97 <none> <none>
dnsutils-ds-pfhzs 1/1 Running 0 26s 172.16.232.4 k98 <none> <none>
my-nginx-86575b68dc-8s44j 1/1 Running 0 8m4s 172.16.176.3 k99 <none> <none>
my-nginx-86575b68dc-q89h4 1/1 Running 0 8m4s 172.16.120.3 k97 <none> <none>
nginx-ds-jgnqw 1/1 Running 0 18h 172.16.176.2 k99 <none> <none>
nginx-ds-ks4cf 1/1 Running 0 18h 172.16.232.2 k98 <none> <none>
nginx-ds-z6d2h 1/1 Running 0 18h 172.16.120.2 k97 <none> <none>
[root@k97 work]# kubectl -it exec dnsutils-ds-p4d2x cat /etc/resolv.conf
error: unable to upgrade connection: Forbidden (user=kubernetes-master, verb=create, resource=nodes, subresource=proxy)
[root@k97 work]#
分析解决问题:
在执行 kubectl exec、run、logs 等命令时,apiserver 会将请求转发到 kubelet 的 https 端口,并且我使用的 Kubernetes 集群启用了 RBAC。
这里定义 RBAC 规则,授权 apiserver 使用的证书(kubernetes.pem)用户名(CN:kuberntes-master)访问 kubelet API 的权限:
[root@k97 work]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes-master
clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created
授予 kube-apiserver 访问 kubelet API 的权限
完成后再执行:
[root@k97 work]# kubectl -it exec dnsutils-ds-p4d2x cat /etc/resolv.conf
nameserver 10.254.0.2
search default.svc.cluster.local svc.cluster.local cluster.local mayocase.com
options ndots:5
[root@k97 work]#
网上找到的另一个办法(不推荐):
解决办法2:
为 system:anonymous 临时绑定一个 cluster-admin 的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
这个权限放太松了,很危险。 可以只对 anonymous 用户绑定必要权限即可,修改为:
kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user=system:anonymous