Kubernetes 从另一台机器通过kube代理访问节点端口

Kubernetes 从另一台机器通过kube代理访问节点端口,kubernetes,kube-proxy,Kubernetes,Kube Proxy,我有kubernetes集群(节点01-03)。 有一个使用nodeport访问pod的服务(nodeport 31000)。 pod正在节点03上运行。 我可以从任何主机访问该服务。在每个节点上,我都可以像这样访问服务。但我无法通过以下方式访问该服务:即使在端口31000的node01上有一个侦听器(kube代理)。iptables规则在我看来没问题。这就是它的工作原理吗?如果没有,我如何进一步排除故障?如果访问Kubernetes集群内的POD,则不需要使用节点端口。而是推断Kubernet

我有kubernetes集群(节点01-03)。 有一个使用nodeport访问pod的服务(nodeport 31000)。 pod正在节点03上运行。
我可以从任何主机访问该服务。在每个节点上,我都可以像这样访问服务。但我无法通过以下方式访问该服务:即使在端口31000的node01上有一个侦听器(kube代理)。iptables规则在我看来没问题。这就是它的工作原理吗?如果没有,我如何进一步排除故障?

如果访问Kubernetes集群内的POD,则不需要使用节点端口。而是推断Kubernetes服务targetport。假设podA需要通过名为serviceB的服务访问podB。假设http是
NodePort
在集群中的每个节点上公开,那么您需要做的就是。清楚地说:

每个节点将代理该端口(每个节点上的端口号相同)到您的服务中

因此,无论从集群内部还是外部,都可以使用
NodeIP:NodePort
集群中的任何节点上访问服务,kube代理将使用iptables路由到具有后端pod的正确节点

但是,如果从集群外部使用
NodeIP:NodePort
访问服务,我们需要首先确保从点击
NodeIP:NodePort
的位置可以访问
NodeIP

如果在未运行后端pod的节点上无法访问
NodeIP:NodePort
,则这可能是由于
转发链上的默认
DROP
规则造成的(出于安全原因,Docker
1.13
又导致了此问题)。是关于它的更多信息。另请参见步骤8。解决方案是在节点上添加以下规则:

iptables -A FORWARD -j ACCEPT
k8s的问题是,修复程序是(修复程序应该在k8s 1.9中)

允许外部访问服务的其他三个选项是:

  • ExternalIPs
  • LoadBalancer
    带有外部云提供商的负载平衡器:
  • 入口

  • 很高兴知道。我不知道。但我想知道:为了从外部访问服务,我是否总是必须检查pod在哪个节点上运行?您不必这样做。K8s将自动向iptables添加POD的ip地址。K8s dns将处理将服务名称解析为POD的实际IP。您只需确保kube dns在每个节点上运行。我可以访问所有节点,但我无法连接到[node_ip_其中_pod_未运行]:[nodeport]@m0087是否
    kube代理
    正在运行?它应该将请求重定向到正确的后端pod-是的,如果我在一个节点上并使用该节点的名称,它就会工作。例如,我在node01上(pod在node03上运行)并访问。@m0087我想您在docker中看到了
    iptables
    问题。您可以在节点上尝试
    iptables-A FORWARD-j ACCEPT
    并进行检查吗?我已经用所需信息编辑了我的答案。请参阅我上面的回答中的“如果
    NodeIP:NodePort
    无法在未运行后端pod的节点上访问”部分。@m0087很乐意提供帮助。如果您认为我的答案有用,请向上投票,让其他人知道这是正确的答案,谢谢!