问题现象
输入:
kubectl logs --tail 200 -f -n xxx pod-name-xxxx.
复制代码
返回结果:
error: You must be logged in to the server (the server has asked for the client to provide credentials (get nodes))
复制代码
已知信息
- kubernetes版本:1.17.2
- 证书前不久已更新
排查过程
看到这个报错,很直观的信息,锁定在证书问题上。 我立即执行了kubectl get nodes 。能够返回节点信息。问题到这里,那我们基本锁定了应用是kube-apiserver与kubelet交互过程中出现了证书问题。 难道是证书过期?这个应该不太可能,前不久我才更新了master的证书!秉承严谨的态度,我还是登陆到master节点,输入命令
kubeadm alpha certs check-expiration
ls /etc/kubernetes
复制代码
没有问题,证书没有过期,kubelet的证书也自动轮转过。 为了确认证书没问题,我使用curl配合证书直接调用kubelet的接口。
curl -k --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key https://xxx.xxx.xx.xx:10250/metrics
复制代码
没有问题,能够正常返回监控度量数据。 既然证书本身没有问题,那大概就是apiserver使用上的问题了。再次抱着严谨的态度,输入命令:
ps -ef|grep kube-apiserver
ps -ef|grep kubelet
复制代码
没有问题,kube-apiserver和kubelet配置的证书路径都是正确的。 那这就很神奇了,既然配置目前看都没有问题,那我开始怀疑是不是kube-apiserver证书没生效? 索性使用重启大法。
## 选择一个kube-apiserver的pod
kubectl delete pod -n kube-system kube-apiserver-xxxxx
复制代