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

时间:2016-06-13 14:40:12

标签: load-balancing kubernetes google-cloud-platform google-kubernetes-engine

我想避免将type: "LoadBalancer"用于某个Kubernetes服务,但仍然可以在Internet上发布它。我正在使用Google Cloud Platform(GCP)来运行当前在单个节点上运行的Kubernetes集群。

我尝试了externalIPs服务配置并轮流提供IP:

  • 托管Kubernetes群集的实例(外部IP;它也与kubernetes describe node报告的Kubernetes节点的IP地址一致)
  • Kubernetes集群端点(由Google Cloud Console在集群详细信息中报告)
  • 在同一节点上运行的另一个LoadBalancer类型的Kubernetes服务的公共/外部IP。

上述所有内容均未帮助我使用配置为externalIPs的Kubernetes服务来访问我的应用程序。

那么,如何在不使用LoadBalancer类型的Kubernetes服务的情况下在Internet上发布服务。

3 个答案:

答案 0 :(得分:7)

如果您不想使用LoadBalancer服务,则公开展示服务的其他选项包括:

键入NodePort

type设置为NodePort的情况下创建您的服务,Kubernetes将在您的服务将公开的所有节点VM上分配一个端口(docs)。例如。如果您有2个节点,w /公共IP 12.34.56.7823.45.67.89,并且Kubernetes分配您的服务端口31234,那么该服务将在12.34.56.78:3123423.45.67.89:31234上公开提供。 externalIPs

指定externalIPs

如果您能够将公共IP路由到您的节点,您可以在服务中指定LoadBalancer告诉Kubernetes“如果您发现某些内容已发送到具有我的服务端口的IP,请将其路由到我。” (docs

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

使用/proxy/端点

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

答案 1 :(得分:3)

还有另一个选择:在您的广告连播上设置hostNetwork标志。

例如,您可以使用helm3通过以下方式安装nginx:

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

然后,可以在运行Pod的节点的IP地址上的端口80和443上使用nginx。您可以使用节点选择器或相似性或其他工具来影响此选择。

答案 2 :(得分:0)

有一些惯用的方法可以在Kubernetes中对外公开服务(请参见注释#{1):

  1. Service.Type = LoadBalancer,如OP所指出的。
  2. Service.Type = NodePort,这将公开节点的IP。
  3. Service.Type = ExternalName,通过返回CNAME记录将服务映射到externalName字段的内容(您必须使用CoreDNS版本1.7或更高版本才能使用ExternalName类型。)
  4. 入口。这是一个新概念,可将外部HTTP和/或HTTPS路由公开给Kubernetes集群中的服务,您甚至可以将路由映射到多个服务。但是,这仅映射HTTP和/或HTTPS路由。 (请参阅注释#2