如何访问本地集群中的 Kubernetes pod?

How to access Kubernetes pod in local cluster?

我已经建立了一个实验性的 local Kubernetes 集群,其中有一个主节点和三个从节点。我已经为侦听端口 10001 的自定义服务创建了部署。目标是使用稳定的 IP/hostname 访问示例端点 /hello,例如http://<master>:10001/hello.

部署部署后,pods 创建良好并且可以通过其集群 IP 访问。

我了解云提供商的解决方案是为部署创建一个负载平衡器服务,这样您就可以 expose 一个服务。但是,这显然不支持本地集群。为此目的设置 Ingress 似乎有些矫枉过正。不是吗?

似乎 kube proxy 更像是一条路。但是,当我在主节点上 运行 kube proxy --port <port> 时,我可以访问 http://<master>:<port>/api/...,但不能访问实际的 pod。

有很多相关问题(例如 How to access services through kubernetes cluster ip?), but no (accepted) answers. The Kubernetes documentation on the topic 也相当稀疏,所以我什至不确定什么是概念上正确的方法。

因此我正在寻找一个直接的解决方案 and/or 一个很好的教程。这似乎是一个非常典型的用例,但缺乏明确的路径。

Ingress 可能是您最简单的选择。

您可以非常简单地安排 Nginx IngressController 的创建;这是 a guide。请注意,此设置使用 DaemonSet,因此每个节点上都有一个 IngressController。它还使用 hostPort 配置选项,因此 IngressController 将监听节点的 IP,而不是不稳定的虚拟服务 IP。

现在您只需将 HTTP 流量发送到您的任一节点。您可能希望为每个服务定义一个外部 DNS 条目,每个都指向您节点的 IP(即多个 A/AAAA 记录)。入口将使用 name-based virtual hosting.

根据 HTTP 主机名在集群内消除歧义和路由

如果您需要公开非 HTTP 服务,这会涉及更多,但您可以查看 nginx ingress 文档以获取更多示例(例如 UDP)。

如果 Ingress Controller 对您的场景来说太过分了,您可能想尝试使用 NodePort 类型的服务。您可以指定端口,也可以让系统自动为您分配一个端口。

NodePort 服务在集群中所有节点上的同一端口公开您的服务。如果您可以通过网络访问您的节点,则可以在配置中指定的节点 IP 和端口访问您的服务。

显然,这不会在节点之间进行负载平衡。如果您想模拟真正的负载均衡器会做什么,您可以添加一个外部服务来帮助您做到这一点。一个简单的选择是 运行 类似于 rocky-cli.