本文永久链接: https://www.xtplayer.cn/kubernetes/unexpected-eof-during-watch-stream-event-decoding/

在 rke 部署的 k8s 集群架构中,只有 worker 角色的节点,会在节点上以 host 网络模式运行一个 nginx-proxy 容器,这个容器代理到 apiserver 服务然后保留 6443 端口以供节点上的 k8s 组件连接(比如 kubelet、kube-proxy)。节点上的 kubelet 容器等 k8s 组件,会直接通过连接 https://127.0.0.1:6443 的方式来了解 apiserver。

因此在 kubelet 或者 kube-proxy 组件中可以看到类似如下的信息。

I0806 14:27:53.862021    5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:27:53.863139 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:03.870957 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:03.871023 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:03.871036 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:08.874773 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:08.874922 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:08.875439 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:15.396979 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:15.397267 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:15.397481 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF
I0806 14:28:20.649280 5166 streamwatcher.go:103] Unexpected EOF during watch stream event decoding: unexpected EOF

kubelet 通过 nginx-proxy 代理连接 apiserver,如果网络连接缓慢超时等问题,就会导致nginx 代理到 apiserver 的连接端口,从而 kubelet 抛出了异常信息。这个信息虽然是 info,不影响组件运行,但是它可能对 kubelet 的网络性能会有一定影响。

临时解决方法

因为这个问题不是所有环境都会出现,因此可以临时通过自定义镜像修改配置参数的方式来解决。

找到集群中当前使用的 rancher/rke-tools 镜像,然后修改 dockerfile。

FROM xxxxxxxx/rancher/rke-tools:<tag>
RUN sed -i 's/proxy_timeout.*;/proxy_timeout 60;/' /etc/confd/templates/nginx.tmpl
RUN sed -i 's/proxy_connect_timeout.*;/proxy_connect_timeout 5s;/' /etc/confd/templates/nginx.tmpl

重新构建相同的镜像和版本以覆盖原来的镜像

docker build -t xxxxxxxx/rancher/rke-tools:<tag> .