Kubernetes的NodePort类型端点和端口

4
kubernetes.io 的交互式教程上,我们通过执行命令 kubectl expose deploy kubernetes-bootcamp --type="NodePort" --port 8080 创建了一种类型为 NodePort 的服务。但是我对结果感到困惑。

首先,教程中指出:

让我们运行 (...) 命令 kubectl get services (...),我们可以看到该服务已获得 (...) 外部 IP(节点的 IP)。

但是这不准确,根据输出结果,并没有获得外部 IP:

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP PORTS
kubernetes-bootcamp NodePort    ...             <none>      8080:31479

现在使用kubectl describe service kubernetes-bootcamp命令,可以得到以下信息:
Type        NodePort
IP          ...
Port        <unset> 8080/TCP
NodePort    <unset> 31479/TCP

现在的教程建议使用curl $(minikube ip):$NODE_PORT,相当于curl <internal node IP>:<NodePort> - 这样做是可以工作的,但仍然存在很多疑问:
  • 根据kubectl expose -h的说明,--port命令用于指定服务的端口,因此我期望--port设置了暴露的<NodePort>,但事实并非如此。为什么?应该怎么设置?
  • 容器应用程序可以通过kubectl get nodes得到,但它的<internal node IP>在服务元数据中并没有显示出来。为什么?
  • kubectl describe service显示的IP(等同于集群IP)和对应的端口(等同于通过--port设置的端口),也可以路由到容器应用程序,因此curl <clusterIP>:8080能够正常工作,并且满足通过--port设置暴露端口的承诺。但这种方式却有些出乎意料:为什么一个NodePort服务具有clusterIP类型的接口?
  • kubectl describe service显示的Endpoints有什么意义,既不是clusterIP的终点,也不是NodePort的终点?
1个回答

3
它有助于将其分解,但总体主题是NodePort不是在集群外部公开服务的最常见方式,因此围绕它的一些功能并不是那么直观。 LoadBalancer(或使用它的入口控制器)是将服务暴露给集群外部世界的首选方式。
通过kubectl describe service显示的IP(等于集群IP)与也在那里显示的端口(等于通过--port设置的端口)结合起来,也会路由到容器应用程序,因此curl :8080有效,并实现了通过--port设置公开端口的承诺。但以意想不到的方式:为什么NodePort服务具有这样的clusterIP类型接口?
您还可以看到ClusterIP,因为这是从集群内部访问服务的方式。其他服务可以使用该服务名称和端口(在本例中为8080)在集群内部访问该服务,但ClusterIP本身并不能使服务在集群外部可用。
如果它既不是clusterIP端点也不是NodePort端点,则Endpoints的含义是什么?
"

172.18.0.2:8080或类似的终端节点值将是服务的内部IP和端口。在集群内,您也可以通过使用集群的内部DNS(通常更方便)使用其名称访问服务。

容器应用程序可确实访问的<internal node IP>未在服务元数据中显示在任何地方,我只能从kubectl get nodes中获取它。为什么?

这指向一个问题,即当通过NodePort公开时,从kubectl get serviceskubectl describe service <service>看到的输出有点误导-人们会期望在条目中看到一些类似于external-ip的内容或类似的内容。 NodePort在该节点上专门为该服务分配了一个端口。这有点限制,因为如果您继续为每个添加的服务执行此操作,则会耗尽端口。因此,如果要显示external-ip,则必须是节点的IP,当与LoadBalancer类型服务的IP并排显示时可能会看起来有点奇怪。

"
根据kubectl expose -h--port命令指定要提供服务的端口,因此我期望--port设置NodePort类型服务的暴露NodePort,但实际情况并非如此。为什么?如何设置?
当前,expose命令行选项特别有限,因为您目前甚至不能使用它选择NodePort范围中使用的端口。在您的情况下,您已获得外部端口31479,但您没有选择该端口。让用户过于轻易地选择可能不是明智的,因为可用端口数量有限,您很容易发现分配了两次相同的端口。但是,通过描述符文件部署时可以选择外部端口。

1
感谢您的长篇回复,它回答了我大部分的问题!但有一点我不太明白,"NodePort是用于测试" - 它不像是一个集群中节点之间的隧道,有许多可能的应用程序(单例数据节点,...)吗?您能否重新组织一下您的回复,以引用-回答的模式使其更易于阅读,这样我就可以接受它了? - B M
是的,说得好。而且引用-回答的格式更好。如果您有任何其他想法,我很乐意进一步改进。 - Ryan Dawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接