我在 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
确保这些端口保持保留状态,并且没有其他进程可以使用它们即使进程开始使用NodePort
iptables 规则(因为它们在 预输出 链)确保发送到的流量 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。