Kubernetes 和 iptables:将外部流量转发到特定的 nodePort

Kubernetes 和 iptables:将外部流量转发到特定的 nodePort

我在 EC2 环境中安装了 kubernetes。我想将流量从外部端口 6600 重定向到 30000 作为 nodePort。我使用 iptables 来执行此操作(下面的 cmd),但这没有执行重定向。我在其他环境中测试了命令,重定向工作正常。在我看来,kubernetes 是问题的根源。

iptables -t nat -A PREROUTING -p tcp --dport 6600 -j REDIRECT --to-port 30000

结果来自:sudo iptables -t nat -L

Chain PREROUTING (policy ACCEPT)

target         prot opt source               destination 
KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */
DOCKER         all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
REDIRECT       tcp  --  anywhere             anywhere             tcp dpt:6600 redir ports 30000

答案1

在 iptables 模式下使用时kube-proxy(kubernetes 中默认为此模式),将请求路由到 服务 即使kube-proxy节点上的进程死亡, 仍可继续为现有服务工作Kube-proxy绑定并侦听(在所有 k8s 节点上)分配的所有端口,以NodePorts确保这些端口保持保留状态,并且没有其他进程可以使用它们即使进程开始使用NodePortiptables 规则(因为它们在 预输出 链)确保发送到的流量 NodePort 被路由到 pod。

在正常情况下kube-proxy 绑定并监听确保NodePorts这些端口保持保留状态,并且没有其他进程可以使用它们。因此,如果您有服务 NodePort,则无需手动配置 iptables 规则。

KUBE-SERVICES目标中有一个由 创建的链kube-proxy。列出该链中的规则,参见以下示例:

$ sudo iptables -t nat -L KUBE-SERVICES -n | column -t
...
KUBE-NODEPORTS             all            --   0.0.0.0/0       0.0.0.0/0     /*  kubernetes                                   service  nodeports;  NOTE:  this  must       be  the  last  rule  in  this  chain  */  ADDRTYPE  match  dst-type  LOCAL

如您所见,KUBE-SERVICES链中的一个目标是KUBE-NODEPORTS链。由于我们创建的服务类型为,因此让我们列出链NodePort中的规则。KUBE-NODEPORTS

$ sudo iptables -t nat -L KUBE-NODEPORTS -n | column -t

您应该看到输出显示目标是发往您的数据包NodePort 30000

然后验证kube-proxy正在监听 NodePort。

正常情况下,kube-proxy绑定并监听所有端口,NodePorts以确保这些端口保持保留状态,并且没有其他进程可以使用它们。您可以在上面的 kubernetes 节点上验证这一点:

$ sudo lsof -i:30000
$ ps -aef | grep -v grep | grep PID

你应该看到正在kube-proxy监听NodePort 6600。在 iptables 模式下,kube-proxy为 kubernetes 服务创建 iptables 规则,确保对 的请求 service 被路由(并负载平衡)到适当的 pod。

只要这些 iptables 规则存在, services 即使节点上的 kube-proxy 进程终止,请求也会被路由到适当的 pod。 services 但是,new 的端点在此节点上不起作用,因为kube-proxy进程不会为其创建 iptables 规则。

看一看:iptables-kubernetes

相关内容