在没有负载平衡器的情况下,在Google Container Engine上公开80和443端口

目前我正在开发一个小型的爱好项目,一旦准备就绪,我就可以开源。 此服务正在Google Container Engine上运行。 我selectGCE来避免configuration麻烦,成本低廉,学习新东西。

我的豆荚运行良好,我创build了一个types为LoadBalancer的服务来公开端口80和443上的服务。

但是,我发现,对于每个LoadBalancer服务,都会创build一个新的Google Compute Engine负载平衡器。 这个负载均衡器相当昂贵,而且对于一个单一实例的业余爱好项目来说真的已经完成了。

为了削减成本,我正在寻找一种方法来暴露没有负载平衡器的端口。

我到目前为止所尝试的是:

  • 部署一个NodePort服务。 不幸的是它不允许暴露30000以下的端口。

  • 部署Ingress,但是这也会创build一个负载平衡器。

  • 试图禁用HttpLoadBalancing ( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ),但它仍然创build一个负载平衡器。

有没有一种方法可以在没有负载平衡器的情况下为Google Container Engine上的单个实例公开端口80和443?

是的,通过外部IPs上的服务。 我用过的示例服务:

 apiVersion: v1 kind: Service metadata: name: bind labels: app: bind version: 3.0.0 spec: ports: - port: 53 protocol: UDP selector: app: bind version: 3.0.0 externalIPs: - abcd - abce 

请注意,configuration文件中列出的IP必须是GCE上的内部IP。

如果您只有一个pod,则可以使用hostNetwork: true来实现此目的:

 apiVersion: apps/v1beta1 kind: Deployment metadata: name: caddy spec: replicas: 1 template: metadata: labels: app: caddy spec: hostNetwork: true # <--------- containers: - name: caddy image: your_image env: - name: STATIC_BACKEND # example env in my custom image value: $(STATIC_SERVICE_HOST):80 

请注意,通过这样做, 您的pod将inheritance主机的DNSparsing器,而不是Kubernetes。 这意味着您不能再通过DNS名称parsing群集服务。 例如,在上面的示例中,您无法访问http:// static的static服务。 您仍然可以通过群集IP访问服务,群集IP由环境variables注入。

此解决scheme比使用服务的外部IP更好,因为它绕过kube-proxy,并且您将收到正确的源IP。