-1

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

4

2 回答 2

0

如果访问 Kubernetes 集群内的 Pod,则不需要使用 nodeport。改为推断 Kubernetes 服务目标端口。假设 podA 需要通过名为 serviceB 的服务访问 podB。所有你需要假设 http 是http://serviceB:targetPort/

于 2018-02-08T22:49:54.323 回答
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运行后端 pod的节点上无法访问,可能是链上的默认规则造成的(又是 Docker出于安全原因造成的)。是有关它的更多信息。另请参阅此处的第8步。解决方案是在节点上添加以下规则:DROPFORWARD1.13

iptables -A FORWARD -j ACCEPT

k8s 的问题在这里,修复在这里(修复应该在 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/
于 2018-02-10T09:27:38.867 回答