RedHat 7.6,重启导致应用程序仅监听 tcp6 套接字

RedHat 7.6,重启导致应用程序仅监听 tcp6 套接字

我们有一些安装了 RHEL 7.6 的 vmware 虚拟机,最近由于数据中心移动位置,它们全部重新启动。

问题是,重启某些应用程序(例如 Java)后,kube-proxy 仅监听 tcp6 套接字,这很奇怪。即使我重新启动这些应用程序,它们仍然只监听 tcp6 套接字,我需要添加 jvm 参数java.net.preferIPv4Stack=true才能让它再次监听 ipv4 套接字。但对于 kube-proxy(kubernetes 集群代理),我没有找到解决方案。

我看到有人说,tcp6 暗示 tcp,但是我无法使用 ipv4 地址访问那些套接字。

我的问题是:什么原因导致这种情况?我不想禁用 ipv6,只是更喜欢 ipv4。

[root@ocrpoc1 ~]# telnet 127.0.0.1 32414
Trying 127.0.0.1...
^C
[root@ocrpoc1 ~]# telnet 127.0.0.1 6443
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^ZConnection closed by foreign host.
[root@ocrpoc1 ~]# netstat -apn | grep kube-proxy
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      5282/kube-proxy     
tcp        0      0 X.X.X.X:60458      X.X.X.X:6443       ESTABLISHED 5282/kube-proxy     
tcp6       0      0 :::10256                :::*                    LISTEN      5282/kube-proxy     
tcp6       0      0 :::32414                :::*                    LISTEN      5282/kube-proxy

[root@ocrpoc1 ~]# nc -4 -lk 32414
Ncat: bind to 0.0.0.0:32414: Address already in use. QUITTING.
[root@ocrpoc1 ~]# nc -6 -lk 32414
Ncat: bind to :::32414: Address already in use. QUITTING.

答案1

以防帮助其他人可能会遇到这个问题。

这是由 calico 引起的。默认情况下,calico 使用“自动检测”方法选择 IPv4 地址,这意味着“第一个找到”具有有效 IPv4 地址的接口。

我的kubernetes集群的一个节点已经通过docker-compose创建了一些docker容器,它带来了桥接接口br-XXXXX,calico-node容器在启动时选择它。

为了解决这个问题,我编辑了 calico-node DaemonSet 并添加了以下环境变量:

名称:IP_AUTODETECTION_METHOD 值:can-reach=我的 kubernetes 主节点 ip

相关内容