问题是这样的:
三台云服务器:部署了三个master+三个node,发现在其中一台master上,验证能够正常访问其他工作节点上的pod。发现curl 不了,只能curl分配到本机的pod,后面才发现是路由转发策略问题导致!
一下是步骤和解决方式:
iptables -L -n
Chain FORWARD (policy DROP) 是 Linux iptables 防火墙中的一个规则链,用于控制转发流量的访问。当该规则链的策略(policy)被设置为 DROP 时,表示该规则链默认不会转发任何数据包,除非明确地添加了允许转发的规则。
如果您在使用 Kubernetes 集群时遇到了 Chain FORWARD (policy DROP) 的问题,可能是因为您的 iptables 防火墙规则没有正确配置,导致 Kubernetes 的网络插件无法正确地转发数据包。
为了解决这个问题,您可以尝试以下几个步骤:
- 检查 iptables 防火墙规则是否正确配置,是否存在冲突或错误。您可以使用 iptables 命令来查看当前的防火墙规则。
- 检查 Kubernetes 的网络插件是否正确安装和配置。例如,如果您使用的是 Flannel 网络插件,您需要确认 Flannel 的网络配置是否正确,并且 Flannel 的网络接口是否正确地配置了 iptables 规则。
- 检查 Kubernetes 的节点是否正确地加入了集群,并且网络插件是否正确地配置了网络路由。您可以使用 kubectl 命令来检查节点和网络插件的状态。
如果您无法解决 Chain FORWARD (policy DROP) 的问题,建议您查看 Kubernetes 的官方文档或者在社区论坛中提问,以获得更多的帮助和支持。
解决办法:
将 net.ipv4.ip_forward 设置为 1,表示启用 Linux 内核的 IP 转发功能,允许 Linux 路由器将来自一个网络接口的数据包转发到另一个网络接口。这在 Kubernetes 集群中是必要的,因为容器需要与其他容器或外部网络进行通信。
要修改 net.ipv4.ip_forward,可以按照以下步骤进行操作:
- 打开终端,使用 root 用户登录到您的 Kubernetes 节点。
- 编辑 /etc/sysctl.conf 文件,添加以下行:
net.ipv4.ip_forward=1
如果该行已经存在,则请确保它没有被注释掉。
- 执行以下命令,使新的配置生效:
sudo sysctl -p
这将重新加载 sysctl.conf 文件,并将新的配置应用到内核。
我这边需要重启服务器才成Chain FORWARD (policy ACCEPT)
请注意,如果您使用的是 Kubernetes 发行版,它可能已经自动配置了 net.ipv4.ip_forward。在这种情况下,您不需要手动修改此设置。如果您不确定是否需要修改此设置,请查看 Kubernetes 的官方文档或者咨询社区支持。
然后重新kubectl apply -f nginx.yaml 文件就正常访问了
注意,有时候要单独去ping pod ip会不通,但是通过互相ping能够通。
建议修改的calico配置
calico的配置
我这边修改了配置
具体内容如下:
- name: IP_AUTODETECTION_METHOD #新增 目的是选择用优先使用哪个网卡
value: "interface=eth.*" #新增
- name: CALICO_IPV4POOL_CIDR #这里是设置pod的ip段位,如果不设置,每次重启calico后,pod的ip会变化
value: "192.168.0.0/16"