问题现象
部署在麒麟V10SP03
环境上的K8S
集群,kube-proxy
组件使用conntrack
命令删除表项失败。
1 2
| [root@node1 ~] conntrack v1.4.5 (conntrack-tools): Operation failed: Operation not supported
|
原因分析
考虑到问题场景是使用的docker
镜像带的conntrack
工具,为了排除docker
相关影响,在宿主机上安装conntrack
工具并执行命令:
1 2
| [root@node1 ~] conntrack v1.4.5 (conntrack-tools): Operation failed: Operation not supported
|
验证结果报错,再排除conntrack
工具层面的影响,直接使用如下c++
程序调用libnetfilter_conntrack
库构造删除:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
int main(void) { int ret; struct nfct_handle *h; struct nf_conntrack *ct;
ct = nfct_new(); if (!ct) { perror("nfct_new"); return 0; }
nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET); nfct_set_attr_u32(ct, ATTR_IPV4_SRC, inet_addr("1.1.1.1")); nfct_set_attr_u32(ct, ATTR_IPV4_DST, inet_addr("2.2.2.2")); nfct_set_attr_u8(ct, ATTR_L4PROTO, IPPROTO_TCP); nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(20)); nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(10));
h = nfct_open(CONNTRACK, 0); if (!h) { perror("nfct_open"); nfct_destroy(ct); return -1; }
ret = nfct_query(h, NFCT_Q_DESTROY, ct);
printf("TEST: delete conntrack "); if (ret == -1) printf("(%d)(%s)\n", ret, strerror(errno)); else printf("(OK)\n");
nfct_close(h);
nfct_destroy(ct);
ret == -1 ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS); }
|
验证结果依然报错:
1 2
| [root@single ~] TEST: delete conntrack (-1)(Operation not supported)
|
通过gdb
查看,问题出在调用libnetfilter_conntrack.so
库,初步判断跟内核有关。
1 2 3 4
| (gdb) b nfct_query Breakpoint 3 at 0x7ffff7fa6a34 (gdb) s Breakpoint 3, 0x00007ffff7fa6a34 in nfct_query () from /lib64/libnetfilter_conntrack.so.3
|
之后查看了麒麟官网的内核版本列表,未发现相关bug
,通过更新到最新内核4.19.90-52.39
测试,问题依然存在。
回退到麒麟V10SP02
的环境(内核版本是4.19.90-24.4
),测试没有该问题。
基本确认,是SP03
版本的内核引入的bug
,提交issue
后,官方计划在4.19.90-52.40
内核版本里解决。
解决方案
更新内核版本到4.19.90-52.40
。
参考资料
https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/x86_64/Packages/
https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/updates/x86_64/Packages/