Kubernetes 上没有出站网络 pods

No outbound networking on Kubernetes pods

我是 运行 VM 中的单节点 Kubernetes 集群,用于开发和测试目的。我使用 Rancher Kubernetes Engine(RKE,Kubernetes 版本 1.18)来部署它,并使用 MetalLB 来启用 LoadBalancer 服务类型。 Traefik 是 2.2 版,通过官方 Helm 图表部署 (https://github.com/containous/traefik-helm-chart). I have a few dummy containers deployed to test the setup (https://hub.docker.com/r/errm/cheese)。

我可以通过节点 IP 访问 Traefik 仪表板(-> MetalLB 似乎可以工作)。它为测试容器注册服务和路由。一切看起来都很好,但是当我尝试在浏览器中访问测试容器时,出现 502 Bad Gateway 错误。

一些探测表明 pods 的出站流量似乎存在问题。当我通过 SSH 进入节点时,我可以通过他们的服务或 pod IP 访问所有 pods。从节点到 Pod 的 DNS 也可以正常工作。但是,如果我启动一个交互式 busybox pod,我无法从那里访问任何其他 pod 或主机。当我 wget 到任何其他容器(都在默认命名空间中)时,我只会得到 wget: can't connect to remote host (10.42.0.7): No route to host. 互联网上的服务器也是如此。

我没有安装任何网络策略,我知道默认安装了 none。

我也经历过这个:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service

指南中的所有内容都运行良好,除了 pods 似乎没有任何网络连接。

我的 RKE 配置是标准的,只是我关闭了标准的 Nginx 入口并启用了 etcd 静态加密。

有什么想法吗?

也许只需仔细检查您的节点的 ip 转发是否已打开:sysctl net.ipv4.ip_forward

如果由于某种原因它没有 return: net.ipv4.ip_forward = 1

然后你可以设置它: sudo sysctl -w net.ipv4.ip_forward=1

并使其永久化:

  • 编辑/etc/sysctl.conf
  • 添加或取消注释 net.ipv4.ip_forward = 1
  • 并通过 sysctl -p /etc/sysctl.conf
  • 重新加载

好吧,所以我是愚蠢的(或者更确切地说:一个菜鸟)。我在主机上有一个旧的 iptables 规则,丢弃了 FORWARD 链上的所有流量...删除该规则解决了问题。

删除该角色让我感到有些不安,但我不得不承认我并不完全理解这样做的安全隐患。这可能需要进一步研究,但这是另一个话题。由于我目前不打算 运行 在生产环境中使用这个集群,而是使用托管集群,所以这并不是真正的问题。