0%

K8S问题排查-麒麟系统下Conntrack工具删除命令无法使用问题

问题现象

部署在麒麟V10SP03环境上的K8S集群,kube-proxy组件使用conntrack命令删除表项失败。

1
2
[root@node1 ~]# docker run --privileged --net=host --rm  kube-proxy conntrack -D -p icmp -s 192.168.1.2
conntrack v1.4.5 (conntrack-tools): Operation failed: Operation not supported

原因分析

考虑到问题场景是使用的docker镜像带的conntrack工具,为了排除docker相关影响,在宿主机上安装conntrack工具并执行命令:

1
2
[root@node1 ~]# conntrack -D -p icmp -s 192.168.1.2
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>

#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>

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 ~]# ./conntrack_delete
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/