「Kubernetes」- 无法从主节点访问 NodePort 服务

  CREATED BY JENKINSBOT

# 10/01/2019 我们首次遇见该问题
# 05/08/2021 从那以后我们未再遇到该问题,当时是因为 Docker 的版本过旧(完全能够这样理解)。如果再次遇到该问题,很可能是因为其他原因导致的;
# 04/14/2022 我们再次遇到类似问题,除了 Pod 所在节点能够通过 NodePort 访问,而无法从其他节点通过 NodePort 访问;

问题描述

定义 Deployment 资源,定义 Service 资源,并且 Selector 与 Label 都是正确的。启动 Service 的 NodePort 为 32340 端口。

正常结果:在正常情况下,不管是通过 Master 还是 Node 节点,都可以访问 NodePort 服务。

问题状况:我们无法通过 Master 节点的 IP 地址来访问 NodePort 服务。通过 http://node-address:32340/ 正常访问服务,但是通过 http://master-address:32340/ 只会得到超时。

系统环境

CentOS Linux release 7.5.1804 (Core)
Docker version 1.13.1, build b2f74b2/1.13.1
Kubernetes v1.14.0

原因分析

这个问题已经有人遇到过了:Handle nodes with iptables FORWARD DROP better #39823

这个问题是由 Docker 导致的。如「vendor libnetwork \@1861587 #28257」所述:
1)如果 net.ipv4.ip_forward=1 参数是由 Docker 所设置,则 iptables 的 FORWARD 会被设置为 DORP 策略。
2)如果是由用户设置 net.ipv4.ip_forward=1 参数,则用户可能会进行某些意图需要 FORWARD 为 ACCEPT 策略,这时候 Docker 就不会去修改 FORWARD 策略。

解决办法

设置 net.ipv4.ip_forward=1 参数:

cat > /etc/sysctl.d/99-ipv4_forward.conf <<EOF
net.ipv4.ip_forward=1
EOF

sysctl --load=/etc/sysctl.d/99-ipv4_forward.conf

虽然我们用的是 Docker CE 版本,但是 moby 是 Docker 的”始祖“,并且那个 PR 已经合并到 Docker CE 了,所以上面的修改才生效。

相关链接

Kubernetes/Tasks/Debug Services
moby、docker-ce与docker-ee的区别

参考文献

kubernetes: cannot access NodePort from other machines
vendor libnetwork \@1861587 #28257
Upgrading docker 1.13 on nodes causes outbound container traffic to stop working #40182