我已经建立了一个实验性的本地Kubernetes 集群,其中包含一个主节点和三个从节点。我为侦听端口 10001 的自定义服务创建了一个部署。目标是访问具有稳定 IP/主机名的示例性端点/hello
,例如http://<master>:10001/hello
.
部署部署后,Pod 将创建良好,并且可以通过其群集 IP 进行访问。
我知道云提供商的解决方案是为部署创建负载均衡器服务,以便您可以只expose
服务。但是,本地群集显然不支持此操作。为此目的设置入口似乎有些过分。难道不是吗?
似乎更像是kube proxy
是要走的路。但是,当我在主节点上运行kube proxy --port <port>
时,我可以访问http://<master>:<port>/api/...
,但不能访问实际的 pod。
有许多相关的问题(例如,如何通过 kubernetes 集群 ip 访问服务?),但没有(接受的)答案。关于该主题的 Kubernetes 文档也相当稀疏,所以我甚至不确定概念上的正确方法是什么。
因此,我正在寻找一个直接的解决方案和/或一个好的教程。这似乎是一个非常典型的用例,但缺乏明确的路径。
如果入口控制器对于你的方案来说矫枉过正,你可能想要尝试使用类型NodePort
的服务。您可以指定端口,也可以让系统自动为您分配一个端口。
NodePort
服务在群集中所有节点上的同一端口公开您的服务。如果您具有对节点的网络访问权限,则可以在配置中指定的节点 IP 和端口访问您的服务。
显然,这不会在节点之间进行负载平衡。如果要模拟实际负载均衡器的功能,可以添加外部服务来帮助您执行此操作。一个简单的选择是运行类似 rocky-cli 的东西。
入口可能是你最简单的选择。
您可以非常简单地安排Nginx IngressController的创建;这里有一个指南。请注意,此设置使用守护程序集,因此每个节点上都有一个入口控制器。它还使用 hostPort 配置选项,因此入口控制器将侦听节点的 IP,而不是不稳定的虚拟服务 IP。
现在,您只需要将 HTTP 流量传输到任何一个节点。您可能需要为每个服务定义一个外部 DNS 条目,每个条目都指向节点的 IP(即多个 A/AAAA 记录)。入口将使用基于名称的虚拟主机,根据 HTTP 主机名在群集内消除歧义和路由。
如果你需要公开非HTTP服务,这会涉及更多,但你可以在nginx入口文档中查看更多示例(例如UDP)。