问题是这样的:
三台云服务器:部署了三个master+三个node,发现在其中一台master上,验证能够正常访问其他工作节点上的pod。发现curl 不了,只能curl分配到本机的pod,后面才发现是路由转发策略问题导致!
一下是步骤和解决方式:

iptables -L -n

k8s 跨namespace共享 nacos k8s跨域问题_ico


Chain FORWARD (policy DROP) 是 Linux iptables 防火墙中的一个规则链,用于控制转发流量的访问。当该规则链的策略(policy)被设置为 DROP 时,表示该规则链默认不会转发任何数据包,除非明确地添加了允许转发的规则。

如果您在使用 Kubernetes 集群时遇到了 Chain FORWARD (policy DROP) 的问题,可能是因为您的 iptables 防火墙规则没有正确配置,导致 Kubernetes 的网络插件无法正确地转发数据包。

为了解决这个问题,您可以尝试以下几个步骤:

  1. 检查 iptables 防火墙规则是否正确配置,是否存在冲突或错误。您可以使用 iptables 命令来查看当前的防火墙规则。
  2. 检查 Kubernetes 的网络插件是否正确安装和配置。例如,如果您使用的是 Flannel 网络插件,您需要确认 Flannel 的网络配置是否正确,并且 Flannel 的网络接口是否正确地配置了 iptables 规则。
  3. 检查 Kubernetes 的节点是否正确地加入了集群,并且网络插件是否正确地配置了网络路由。您可以使用 kubectl 命令来检查节点和网络插件的状态。

如果您无法解决 Chain FORWARD (policy DROP) 的问题,建议您查看 Kubernetes 的官方文档或者在社区论坛中提问,以获得更多的帮助和支持。

解决办法:

将 net.ipv4.ip_forward 设置为 1,表示启用 Linux 内核的 IP 转发功能,允许 Linux 路由器将来自一个网络接口的数据包转发到另一个网络接口。这在 Kubernetes 集群中是必要的,因为容器需要与其他容器或外部网络进行通信。

要修改 net.ipv4.ip_forward,可以按照以下步骤进行操作:

  1. 打开终端,使用 root 用户登录到您的 Kubernetes 节点。
  2. 编辑 /etc/sysctl.conf 文件,添加以下行:
net.ipv4.ip_forward=1

如果该行已经存在,则请确保它没有被注释掉。

  1. 执行以下命令,使新的配置生效:
sudo sysctl -p

这将重新加载 sysctl.conf 文件,并将新的配置应用到内核。

我这边需要重启服务器才成Chain FORWARD (policy ACCEPT)

k8s 跨namespace共享 nacos k8s跨域问题_linux_02

请注意,如果您使用的是 Kubernetes 发行版,它可能已经自动配置了 net.ipv4.ip_forward。在这种情况下,您不需要手动修改此设置。如果您不确定是否需要修改此设置,请查看 Kubernetes 的官方文档或者咨询社区支持。

然后重新kubectl apply -f nginx.yaml 文件就正常访问了

k8s 跨namespace共享 nacos k8s跨域问题_ico_03


注意,有时候要单独去ping pod ip会不通,但是通过互相ping能够通。

建议修改的calico配置

calico的配置

我这边修改了配置

k8s 跨namespace共享 nacos k8s跨域问题_网络接口_04


具体内容如下:

- name: IP_AUTODETECTION_METHOD  #新增 目的是选择用优先使用哪个网卡
   value: "interface=eth.*"    #新增
 - name: CALICO_IPV4POOL_CIDR #这里是设置pod的ip段位,如果不设置,每次重启calico后,pod的ip会变化
   value: "192.168.0.0/16"

k8s 跨namespace共享 nacos k8s跨域问题_kubernetes_05