从另一台机器通过kube-proxy访问nodeport

时间:2018-02-08 11:02:59

标签: kubernetes kube-proxy

我有kubernetes集群(node01-03)。 nodeport有一个服务来访问pod(nodeport 31000)。 该pod正在node03上运行。 我可以从任何主机使用http://node03:31000访问该服务。在每个节点上,我都可以访问http://[name_of_the_node]:31000之类的服务。但是我不能通过以下方式访问服务:http://node01:31000即使在端口31000上的node01上有一个监听器(kube-proxy).iptables规则对我来说没问题。这是它的工作方式吗?如果没有,我该如何进一步排除故障?

2 个答案:

答案 0 :(得分:0)

如果访问Kubernetes群集中的pod,则无需使用nodeport。改为推断Kubernetes服务目标端口。假设podA需要通过名为serviceB的服务访问podB。假设http为http://serviceB:targetPort/

,您只需要

答案 1 :(得分:0)

NodePort在群集中的每个节点上公开。 https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport清楚地说:

  

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

因此,从集群内部和外部,可以使用集群中任何节点上的NodeIP:NodePort访问服务,kube-proxy将使用iptables路由到正确的节点有后端pod。

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

如果在运行后端窗格的节点上无法访问NodeIP:NodePort,则可能是由DROP上的默认FORWARD规则引起的链(由于安全原因,它又由Docker 1.13引起)。 Here是关于它的更多信息。另请参阅步骤 8 here。解决方案是在节点上添加以下规则:

iptables -A FORWARD -j ACCEPT

k8s的问题是here,修正是here(修复应该在k8s 1.9中)。

启用外部访问服务的其他三个选项是:

  1. ExternalIPshttps://kubernetes.io/docs/concepts/services-networking/service/#external-ips
  2. LoadBalancer与外部云提供商的负载均衡器:https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
  3. Ingresshttps://kubernetes.io/docs/concepts/services-networking/ingress/