为什么 Kubernetes return ioctl 的奇怪结果

Why does Kubernetes return odd results for ioctl

我有一个遗留应用程序,我 运行 在使用 kubeadm 部署的 Kubernetes 上的 pod 中。 CNI 是绒布。该代码使用 SIOCGIFBRDADDR 调用 ioctl 以获取容器接口的广播地址。在 vanilla Docker 中返回正确的广播请求。在 Kubernetes 中它错误地 returns 0.0.0.0。 strace 显示来自 Kubernetes pod 的调用如下:

ioctl(4, SIOCGIFBRDADDR, {ifr_name="eth0", ifr_broadaddr={AF_INET, inet_addr("0.0.0.0")}}) = 0

我期待从工作节点上分配给 pods 运行 的 /24 计算出的广播,即 10.244.2.255 用于 pod IP 地址 10.244.2.70/24

SIOCGIFCONF 似乎确实正确返回了接口地址:

ioctl(4, SIOCGIFCONF, {100 * sizeof(struct ifreq) => 2 * sizeof(struct ifreq), [{ifr_name="lo", ifr_addr={AF_INET, inet_addr("127.0.0.1")}}, {ifr_name="eth0", ifr_addr={AF_INET, inet_addr("10.244.2.70")}}]}) = 0

广播地址获取不成功是什么原因?

更新: 作为测试用例,我编译了这里描述的代码,它只调用了上面描述的 ioctl。 https://gist.github.com/loderunner/ec7d4725daca39283606#file-getbroadaddr-c

当 运行 我的 pod 中的二进制文件 centos:7 时,它给出了结果:

sh-4.2$ ./getaddrs
Listing all interfaces:
lo
eth0
sh-4.2$ ./getaddrs eth0
eth0                    0.0.0.0
sh-4.2$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
3: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 8950 qdisc noqueue
    link/ether 3e:b4:05:db:cf:41 brd ff:ff:ff:ff:ff:ff
    inet 10.244.4.7/24 scope global eth0
        valid_lft forever preferred_lft forever
    inet6 fe80::3cb4:5ff:fedb:cf41/64 scope link
        valid_lft forever preferred_lft forever

这说明了这个问题。 ./getaddr eth0 的结果应该是 10.244.4.255,而不是 0.0.0.0

这似乎是法兰绒的怪癖。使用 weave-net 返回正确的广播。