如何在不使用LoadBalancer类型(在GCP上)的情况下发布Kubernetes服务



我希望避免对某个Kubernetes服务使用type: "LoadBalancer",但仍然可以在互联网上发布它。我正在使用谷歌云平台(GCP)运行一个Kubernetes集群,该集群目前运行在一个节点上。

我尝试向我们提供externalIPs服务配置,并轮流提供以下IP:

  • 承载Kubernetes集群的实例(外部IP;它也与kubernetes describe node报告的Kubernete节点的IP地址一致)
  • Kubernetes集群端点(如谷歌云控制台在集群详细信息中所报告的)
  • 在同一节点上运行的CCD_ 4类型的另一个Kubernetes服务的公共/外部IP

以上这些都没有帮助我使用带有externalIPs配置的Kubernetes服务访问我的应用程序。

那么,如果不使用LoadBalancer类型的Kubernetes服务,我如何在互联网上发布服务呢。

如果您不想使用LoadBalancer服务,公开您的服务的其他选项有:

类型NodePort

type设置为NodePort的情况下创建您的服务,Kubernetes将在您的所有节点VM上分配一个端口,您的服务将在该端口上公开(docs)。例如,如果您有两个节点,带有公共IP12.34.56.7823.45.67.89,并且Kubernetes分配了您的服务端口31234,那么该服务将在12.34.56.78:31234&23.45.67.89:31234

指定externalIPs

如果你有能力将公共IP路由到你的节点,你可以在你的服务中指定externalIPs来告诉Kubernetes"如果你看到有东西进入到那个IP w/my服务端口,请将它路由到我。"(docs)

集群端点对此不起作用,因为这只是您的Kubernetes主机的IP。另一个LoadBalancer服务的公共IP将不起作用,因为LoadBalancer仅配置为路由该原始服务的端口。我希望节点IP可以工作,但如果您的服务端口是特权端口,则可能会发生冲突。

使用/proxy/端点

Kubernetes API包含一个/proxy/端点,允许您访问集群端点IP上的服务。例如,如果您的集群端点是1.2.3.4,则可以通过使用集群凭据访问https://1.2.3.4/api/v1/proxy/namespaces/my-ns/services/my-service来访问命名空间my-ns中的my-service。这实际上应该只用于测试/调试,因为它会在通往服务的路上通过Kubernetes主机获取所有流量(额外的跃点、SPOF等)

还有另一个选项:在pod上设置hostNetwork标志。

例如,您可以使用helm3以这种方式安装nginx:

helm install --set controller.hostNetwork=true nginx-ingress nginx-stable/nginx-ingress

然后在端口80&443在运行pod的节点的IP地址上。您可以使用节点选择器或关联或其他工具来影响此选择。

在Kubernetes中对外公开服务有几种惯用方法(请参见注释#1):

  1. Service.Type=LoadBalancer,正如OP所指出的
  2. Service.Type=NodePort,这将暴露节点的IP
  3. Service.Type=ExternalName,通过返回CNAME记录将服务映射到ExternalName字段的内容(需要CoreDNS 1.7或更高版本才能使用ExternalName类型。)
  4. Ingress。这是一个新概念,它向Kubernetes集群中的服务公开了永恒的HTTP和/或HTTPS路由,您甚至可以将一条路由映射到多个服务。但是,这仅映射HTTP和/或HTTPS路由。(见注2)

相关内容

最新更新