我正在虚拟机中运行一个单节点Kubernetes集群,用于开发和测试目的。我使用Rancher Kubernetes Engine(RKE,Kubernetes1.18版(来部署它,并使用MetalLB来启用LoadBalancer服务类型。Traefik是2.2版本,通过官方Helm图表部署(https://github.com/containous/traefik-helm-chart)。我部署了一些虚拟容器来测试设置(https://hub.docker.com/r/errm/cheese)。
我可以通过节点IP访问Traefik面板(->MetalLB似乎可以工作(。它为测试容器注册服务和路由。一切看起来都很好,但当我试图访问浏览器中的测试容器时,我收到了一个502坏网关错误。
一些调查显示,吊舱的出站流量似乎存在问题。当我通过SSH进入节点时,我可以通过服务或pod IP访问所有pod。从节点到pod的DNS也能正常工作。然而,如果我启动一个交互式busybox吊舱,我就无法从那里联系到任何其他吊舱或主机。当我wget
到任何其他容器(都在默认命名空间中(时,我只得到wget: can't connect to remote host (10.42.0.7): No route to host.
。互联网上的服务器也是如此。
我没有安装任何网络策略,我知道默认情况下也没有安装任何策略。
我也经历过:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service
指南中的一切都很好,只是吊舱似乎没有任何网络连接。
我的RKE配置是标准的,只是我关闭了标准的Nginx入口,并在休息时启用了etcd加密。
有什么想法吗?
也许只需仔细检查节点的ip转发是否已打开:sysctl net.ipv4.ip_forward
如果由于某种原因没有返回: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链上的所有流量。。。删除该规则解决了问题。
我只是觉得解除这个角色有点不安,但我必须承认,我并不完全理解这对安全的影响。这可能需要进一步的研究,但这是另一个话题。由于我目前不打算在生产中运行这个集群,而是使用托管集群,所以这无论如何都不是一个真正的问题。