K8S1.18版本kube-proxy报错parseIP Error的处理

故障现象

故障现象为服务IP可以PING通,但应用不能访问,查看kube-proxy组件报错(见下日志内容)。搜索报错内容可知这个问题升级到kubernetes 1.18 版本才出现的,在Kubernetes Github已有相关问题上报,Kubernetes 维护人员讨论分析出问题的原因可能是IPVS模块由于是比较新,需要系统内核版本支持,我在Centos7的最新版本上遇到这个问题,yum update kernel解决不了。
先讲结论:用Centos8.2替代Centos7.x即可解决,我已经试过了。
下面是这个问题的分析和生产环境解决建议。

分析过程

日志内容如下:

[root@node1 logs]# tail -20 kube-proxy.WARNING
E0703 13:49:39.609152    1393 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[192 168 50 65 0 0 0 0 0 0 0 0 0 0 0 0]
E0703 13:49:39.609230    1393 proxier.go:1192] Failed to sync endpoint for service: 10.244.0.1:443/TCP, err: parseIP Error ip=[192 168 50 65 0 0 0 0 0 0 0 0 0 0 0 0]
E0703 13:49:39.609564    1393 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[172 30 1 75 0 0 0 0 0 0 0 0 0 0 0 0]
E0703 13:49:39.609621    1393 proxier.go:1192] Failed to sync endpoint for service: 10.244.75.157:80/TCP, err: parseIP Error ip=[172 30 1 75 0 0 0 0 0 0 0 0 0 0 0 0]

挑出几个关键的词:

  • IPVS
  • Failed to list IPVS destinations
  • Failed to sync endpoint for service
  • parseIP Error
    首先尝试确认问题范围,日志是在kube-proxy应用IPVS模块报出来的,分别是“列出IPVS目标”、“同步端点给服务”功能出现错误,原因都是一样的“parseIP Error”,日志中的不管是172开头的还是192开头IP都一样会出错,所以跟某个网段无关,现在主要关注parseIP这个关键功能点。
    在github上找到这段代码:
func parseIP(ip []byte, family uint16) (net.IP, error) {

	var resIP net.IP

	switch family {
	case syscall.AF_INET:
		resIP = (net.IP)(ip[:4])
	case syscall.AF_INET6:
		resIP = (net.IP)(ip[:16])
	default:
		return nil, fmt.Errorf("parseIP Error ip=%v", ip)

	}
	return resIP, nil
}

调用parseIP函数的代码:

// parse Address after parse AddressFamily incase of parseIP error
	if addressBytes != nil {
		ip, err := parseIP(addressBytes, d.AddressFamily)
		if err != nil {
			return nil, err
		}
		d.Address = ip
	}

还好有kubernetes的工程师重现问题,并分析给出了结论。

netlink will try to get d.AddressFamily attribute, but I find the kernel just does not support it...in /usr/include/linux/ip_vs.h (kernel 3.10) No IPVS_DEST_ATTR_ADDR_FAMILY attribute is defined!
But in new kernel version, the Destination Attributes is defined...That is why kube-proxy works well on systems with a higher version of the kernel.

解决建议

  • 新搭环境和实验环境,升级操作系统版本到Centos8.x。
  • 生产环境,可以考虑master升级1.18但node不升级到1.18,这一点在官方发行版本说明中有提到,apiserver是向后兼容的。

参考文档

  • 文档1
    https://github.com/kubernetes/kubernetes/issues/89520
  • 文档2:parseIP函数源码(ipvs/netlink.go)
    https://github.com/moby/ipvs/blob/8f137da6850a975020f4f739c589d293dd3a9d7b/netlink.go#L260-L274
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页