内容纲要
概要描述
问题描述
TDH6.x和TOS1.9.x版本上kubelet目前没有配置自动更新证书,导致一年时间证书会过期,进而导致节点状态NotReady(正常节点执行kubectl get nodes
查看),服务不可用;
kubelet日志报错信息:
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: E1219 12:43:15.809165 90772 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:492: Failed to list *v1.Node: Unauthorized
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.809432 90772 reflector.go:240] Listing and watching *v1.ConfigMap from k8s.io/kubernetes/pkg/kubelet/kubelet.go:500
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.809937 90772 round_trippers.go:436] GET https://127.0.0.1:6443/api/v1/pods?fieldSelector=spec.nodeName%3Dkm4-hcb-compute-01&limit=500&resourceVersion=0 401 Unauthorized in 1 milliseconds
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: E1219 12:43:15.810063 90772 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: Failed to list *v1.Pod: Unauthorized
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.810517 90772 reflector.go:240] Listing and watching *v1.Service from k8s.io/kubernetes/pkg/kubelet/kubelet.go:483
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.810933 90772 round_trippers.go:436] GET https://127.0.0.1:6443/api/v1/namespaces/kube-system/configmaps?limit=500&resourceVersion=0 401 Unauthorized in 1 milliseconds
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: E1219 12:43:15.811035 90772 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:500: Failed to list *v1.ConfigMap: Unauthorized
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.811850 90772 round_trippers.go:436] GET https://127.0.0.1:6443/api/v1/services?limit=500&resourceVersion=0 401 Unauthorized in 1 milliseconds
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: E1219 12:43:15.812001 90772 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:483: Failed to list *v1.Service: Unauthorized
12月 19 12:43:15 km4-hcb-compute-01 hyperkube[90772]: I1219 12:43:15.822999 90772 volume_host.go:218] using default mounter/exec for kubernetes.io/secret
影响版本
TDH 6.X,TOS 1.9.X
详细说明
workround方案
重启kubelet
所有节点执行 systemctl restart kubelet
。
永久解决方案
注意: 以下步骤需要在集群中所有节点(正常节点操作是为了防止后续出现证书过期问题)执行。
- 查看起止时间
[root@jiujiu-tdh-70 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -text | grep 'Not'
Not Before: Sep 29 16:36:48 2020 GMT
Not After : Sep 29 16:36:48 2021 GMT
- 停止kubelet;
systemctl stop kubelet
- 修改 kubelet 配置文件
在节点上找到 /usr/lib/systemd/system/kubelet.service
文件,在文件里面加上--rotate-certificates \
和 --feature-gates=
后面加上 RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true,
,使之可以自动更新证书;
修改的地方,如下图
- 备份和删除
/var/lib/kubelet/pki
# 备份到tmp目录下:
cp -r /var/lib/kubelet/pki /tmp/
# 删除
rm -rf /var/lib/kubelet/pki
- 重启kubelet
systemctl daemon-reload && systemctl restart kubelet(若启动失败,跳到步骤7)
- 验证
# 验证参数是否添加成功
systemctl status kubelet -l | grep rotate-certificates
# 在未修改的节点执行下面命令,查看修改的节点状态是否正常(是否为ready,如果不是则看步骤7)
kubectl get nodes -owide
# 是否可以查看证书起止时间(如果报错,请参见后面步骤7)
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -text | grep 'Not'
- 其他情况
如果节点not ready 并且使用步骤1的查看证书命令报错 No such file or directory
例如, 修改了 jiujiu-tdh-72的配置,在正常的jiujiu-tdh-70节点执行 kubectl get nodes
命令看到 72节点 not ready,执行查看证书的起止时间的命令,报错如下图。
此问题解决方案:
-
在故障节点获取Pending状态的csr name
kubectl get csr
-
手动 approve CSR 请求
kubectl certificate approve <上一步获取的csr name>
-
获取node的状态
kubectl get nodes
-
approve 后 查看证书时间(与步骤6的不同)
openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text | grep 'Not'
其他问题说明
一. 部分TOS版本还会一直产生pending状态的csr
问题原因
大概率是集群的rcba权限缺失导致的。
解决方案
- 将kubelet.tar 放到节点上解压, 在解压的目录下执行下面3个命令将三个配置文件apply到kubelet里面。在TOS1.9.X-TOS2.1.X都有效。
kubectl apply -f clusterrolebinding-rbac.yaml
kubectl apply -f clusterrole-rbac.yaml
kubectl apply -f system-node-proxier.yaml
- 重启kubelet
systemctl daemon-reload && systemctl restart kubelet
- 按照 永久解决方案 中的步骤7 , 将pending的csr 全部 approve掉, 并通过
kubectl get nodes
命令检查节点状态。 - 检查
/var/lib/kubelet/pki
下有没有生成kubelet-server-
和.pem kubelet-server-current.pem
两个证书文件;如果没有, 多尝试几次本问题的步骤2和3。
二.回退步骤
-
停止kubelet;
systemctl stop kubelet
-
修改 kubelet 配置文件
将/usr/lib/systemd/system/kubelet.service
文件中的--rotate-certificates \
和--feature-gates=
后面的RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true,
删掉;
需要删掉的地方,如下图
-
备份和删除
/var/lib/kubelet/pki
# 备份到tmp目录下: cp -ru /var/lib/kubelet/pki /tmp/bak
# 删除 rm -rf /var/lib/kubelet/pki
-
重启kubelet, 重新生成证书文件
systemctl daemon-reload && systemctl restart kubelet
-
查看node状态
kubectl get nodes