背景
某客户kubernetes集群新加了一个节点,新节点部署应用后,应用会间歇性unavaliable
,用户访问报503,没有事件消息,主机状态也正常。
排查
初步怀疑是新节点问题,在系统日志/var/log/message
和dmesg
中都未发现相关错误信息,在kubelet中发现以下日志
kubernetes集群时通过rke进行安装,可以在节点上直接执行命令docker logs -f --tail=30 kubelet
查看kubelet日志
E0602 03:18:27.766726 1301 controller.go:136] failed to ensure node lease exists, will retry in 7s, error: an error on the server ("") has prevented the request from succeeding (get leases.coordination.k8s.io k8s-node-dev-6)
E0602 03:18:34.847254 1301 reflector.go:178] k8s.io/client-go/informers/factory.go:135: Failed to list *v1.CSIDriver: an error on the server ("") has prevented the request from succeeding (get csidrivers.storage.k8s.io)
I0602 03:18:39.176996 1301 streamwatcher.go:114] Unexpected EOF during watch stream event decoding: unexpected EOF
E0602 03:18:43.771023 1301 controller.go:136] failed to ensure node lease exists, will retry in 7s, error: an error on the server ("") has prevented the request from succeeding (get leases.coordination.k8s.io k8s-node-dev-6)
其中比较关注failed to ensure node lease exists
这个错误信息,从字面上理解应该就是无法注册主机信息,但是kubectl get nodes
得到的状态都是Ready
。联想到应用间歇性的不可用,怀疑可能是短时间节点不可用然后快速恢复,因此可能在执行命令的时候是正常的,为了验证猜想,在后台一直执行kubectl get nodes
命令,终于捕捉到NotReady
状态
并且也捕捉到不可用时的详细信息
根据kubelet stopped posting node status
作为关键字搜索,在stackoverflow上找到类似的问题,高赞回答建议设置kube-apiserver参数--http2-max-streams-per-connection
,因为最近集群部署了prometheus,并且增加了多个节点,对apiserver的请求量突然变大可能导致apiserver的连接数不够,该参数可以增加连接数,由于集群是通过rke进行安装,因此需要更改rke配置文件后重新执行rke up
命令,更改如下
kube-api:
service_node_port_range: "1-65535"
extra_args:
http2-max-streams-per-connection: 1000
重新执行rke up
后进行集群更新,更新完毕有重启kubelet,问题解决
如果是rke安装可以在节点上执行命令docker restart kubelet
重启kubelet
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。