问:如何从GCE网络中运行的(非K8s)服务提供对库伯内特斯内部运行的其他服务的可靠访问?
背景:我们在Google Cloud Platform中运行托管的K8s设置。大多数服务都是12因素应用程序,在K8s中运行良好。一些后备存储(数据库)在K8s之外运行。通过使用带有手动定义endpoint的无头服务来访问它们很容易固定内部IP。这些服务通常不需要与K8s中的服务“回话”。
但是一些运行在内部GCE网络(但在K8s之外)的服务需要访问运行在K8s内的服务。我们可以使用spec. type:NodePort
公开K8s服务,并在任何K8s Nodes IP上与此端口通信。但是我们如何自动找到正确的NodePort和有效的Worker NodeIP呢?或者甚至有更好的方法来解决这个问题。
这种设置可能不是K8s部署的典型用例,但我们希望这样做,直到K8s中的PetSet和持久存储足够成熟。
当我们谈论内部服务时,我想避免在这种情况下使用外部负载均衡器。
您可以通过创建“堡垒路由”或在您连接的机器上运行库贝-proxy来使集群服务IP在集群外部(但在专用网络内部)有意义(参见此答案)。
我认为你也可以把你的解决方案指向集群的DNS服务,以便能够解析服务DNS名称。但是,如果您有多个集群,这可能会变得很棘手。
一种可能的方法是使用入口控制器。入口控制器旨在提供从库伯内特斯集群外部对集群内部运行的服务的访问。入口控制器在集群内作为pod运行,并根据配置的规则将来自集群外部的请求路由到集群内部的正确服务。这为运行在GCE网络中的非库伯内特斯服务访问运行在库伯内特斯的服务提供了一种安全可靠的方式。