起因
这是一个同事遇到的问题,他说他用kubeadm初始化一个集群后,一切看着正常,但pod网络之间不通,不知道哪里出错了。我其实是有点害怕解决这样的问题的,因为k8s的绝大部分问题都是网络问题,而且还不好定位解决,也就是说可能你花了很长时间也未必找到问题,所以我通常建议要不就重新初始化。但同事说初始化好几回了,问题依旧存在,听到这里我觉得不得不直面问题了。
找到可疑
一顿排查,发现IPVS没有相关的规则,为什么没有相关规则呢?顺着问题接着排查,最后看到kube-proxy有这样一段可疑的信息
E0220
00:57:44.072955
1 server_others.go:4911
"Detect-local-node set to ClusterCIDR, but no IPv6 cluster CIDR defined,
1 proxier.go:3791
"Can't set sysctl, kernel versiondoesnt satisfy mind Version requirements systEmet/ no-s/ de-re-Seende mi
sysctl="net/ipv4/vs/conn_reuse_mode" minimumKernelVersion="4.1"
I0220 00:57:44.073054
1 proxier.go: 438]
IPVS scheduler not specified, use rr by default"
E0220 00:57:44.073186
1 proxier.go:379]
"Can't set sysctl, kernel version doesn't satisfy minimum version requirements" sysctl="net/ipv4/vs/conn_reuse_mode" minimumKernelVersion="4.1"
10220 00:57:44.073259
1 proxier.go:4381
10220
00:57:44.073283
IPVS scheduler not specified, use rr by default
首先这是Error级别,另外这个报错似乎跟目前遇到的问题有很大的关联,因为k8s的网络转发规则都是依赖IPVS或者Iptable,根据这个错误我尝试升级了一下所有node的内核版本,然后重新初始化一下,问题解决。
最后
其实官方文档有给各个版本对于Linux内核版本最低的要求,但确实很少在第一时间就怀疑内核太老的原因,除非有特殊的原因,否则一般也不会用一个非常老旧的Linux版本安装k8s,然而这回我还是遇到了。
所以以后k8s有网络问题,也可以尝试升级下Linux内核。