kubelet证书过期问题

  其他常见问题
内容纲要

概要描述


问题描述

TDH6.x和TOS1.9.x版本上kubelet目前没有配置自动更新证书,导致一年时间证书会过期,进而导致节点状态NotReady(正常节点执行kubectl get nodes查看),服务不可用;

file
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

file

影响版本

TDH 6.X,TOS 1.9.X

详细说明


workround方案

重启kubelet

所有节点执行 systemctl restart kubelet

永久解决方案

注意: 以下步骤需要在集群中所有节点(正常节点操作是为了防止后续出现证书过期问题)执行。
  1. 查看起止时间
[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
  1. 停止kubelet;
systemctl stop kubelet
  1. 修改 kubelet 配置文件

在节点上找到 /usr/lib/systemd/system/kubelet.service 文件,在文件里面加上--rotate-certificates \--feature-gates= 后面加上 RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true, ,使之可以自动更新证书
修改的地方,如下图
file

  1. 备份和删除/var/lib/kubelet/pki
# 备份到tmp目录下:
cp -r /var/lib/kubelet/pki  /tmp/
# 删除
rm -rf /var/lib/kubelet/pki
  1. 重启kubelet
systemctl daemon-reload && systemctl restart kubelet(若启动失败,跳到步骤7)
  1. 验证
# 验证参数是否添加成功
systemctl status kubelet -l | grep rotate-certificates

file

# 在未修改的节点执行下面命令,查看修改的节点状态是否正常(是否为ready,如果不是则看步骤7)
kubectl get nodes -owide
# 是否可以查看证书起止时间(如果报错,请参见后面步骤7)
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -text | grep 'Not'
  1. 其他情况

如果节点not ready 并且使用步骤1的查看证书命令报错 No such file or directory
例如, 修改了 jiujiu-tdh-72的配置,在正常的jiujiu-tdh-70节点执行 kubectl get nodes命令看到 72节点 not ready,执行查看证书的起止时间的命令,报错如下图。
file
file

此问题解决方案:

  1. 在故障节点获取Pending状态的csr name

    kubectl get csr

    file

  2. 手动 approve CSR 请求

    kubectl certificate approve <上一步获取的csr name>

    file

  3. 获取node的状态

    kubectl get nodes
  4. approve 后 查看证书时间(与步骤6的不同)

    openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text | grep 'Not'

其他问题说明


一. 部分TOS版本还会一直产生pending状态的csr

file

问题原因

大概率是集群的rcba权限缺失导致的。

解决方案

  1. 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

    file

  2. 重启kubelet
    systemctl daemon-reload && systemctl restart kubelet
  3. 按照 永久解决方案 中的步骤7 , 将pending的csr 全部 approve掉, 并通过kubectl get nodes 命令检查节点状态。
  4. 检查 /var/lib/kubelet/pki下有没有生成kubelet-server-.pem kubelet-server-current.pem两个证书文件;如果没有, 多尝试几次本问题的步骤2和3。

二.回退步骤

  1. 停止kubelet;

    systemctl stop kubelet
  2. 修改 kubelet 配置文件
    /usr/lib/systemd/system/kubelet.service 文件中的--rotate-certificates \--feature-gates= 后面的 RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true, 删掉;
    需要删掉的地方,如下图
    file
  3. 备份和删除/var/lib/kubelet/pki

    # 备份到tmp目录下:
    cp -ru /var/lib/kubelet/pki  /tmp/bak
    # 删除
    rm -rf /var/lib/kubelet/pki
  4. 重启kubelet, 重新生成证书文件

    systemctl daemon-reload && systemctl restart kubelet
  5. 查看node状态

    kubectl get nodes

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。