我有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规则对我来说没问题。这是它的工作方式吗?如果没有,我该如何进一步排除故障?
NodePort
暴露在集群中的每个节点上。 https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport清楚地说:
每个节点将代理该端口(每个节点上的相同端口号)到您的服务中
因此,从集群内部和外部,可以在集群中的任何节点上使用NodeIP:NodePort
访问服务,kube-proxy将使用iptables路由到具有后端pod的右侧节点。
但是,如果使用来自群集外部的NodeIP:NodePort
访问服务,我们需要首先确保NodeIP
可以从我们击中NodeIP:NodePort
的位置到达。
如果无法在未运行后端pod的节点上访问NodeIP:NodePort
,则可能是由DROP
链上的默认FORWARD
规则引起的(出于安全原因,该规则又由Docker 1.13
引起)。 Here更多信息。另见步骤8 here。解决方案是在节点上添加以下规则:
iptables -A FORWARD -j ACCEPT
k8s的问题是here,修复是here(修复应该在k8s 1.9中)。
启用外部访问服务的其他三个选项是:
如果访问Kubernetes集群中的pod,则不需要使用nodeport。改为推断Kubernetes服务目标端口。假设podA需要通过名为serviceB的服务访问podB。所有你需要假设http是http://serviceB:targetPort/