如何在 Google Kubernetes Engine 中选择 Kubernetes 负载均衡器的外部 IP 地址

Ben*_*Ben 18 docker google-compute-engine kubernetes google-cloud-platform google-kubernetes-engine

我正在使用 Google Kubernetes Engine 部署一个网络应用程序,我想通过负载均衡器在我作为 Google Cloud Platform 中同一项目的一部分控制的现有静态 IP 地址上访问它,因为我想使用域名已经指向这个IP。

我用于 pod 的 yaml 文件是:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法设置负载平衡器:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)

这提供了一个可以访问应用程序的外部 IP,但我找不到任何方法来配置它以使用我想要的 IP。该服务的文件提到了spec.clusterIP设置,但这似乎并没有涉及到的外部IP。同样,一旦设置了负载均衡器,服务的 status.loadBalancer.ingress.ip 字段就会设置为其外部 IP 地址,但这似乎不是一个可配置的设置。

作为替代方案,我尝试在 Google Compute Engine 控制台中手动创建转发规则,将来自静态 IP 地址的流量定向到 Kubernetes 设置的目标池,但是当我尝试连接时,连接被拒绝。

有什么方法可以做我想做的事 - 在选定的静态 IP 地址上在 Google Kubernetes 引擎上公开 Kubernetes pod(或复制控制器)?

Wer*_*ght 10

TL;DR运行 Kubernetes v1.1 的谷歌容器引擎支持首先loadBalancerIP将自动分配的 IP 标记为静态

Kubernetes v1.1 支持externalIPs

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...
Run Code Online (Sandbox Code Playgroud)

到目前为止,还没有关于如何在 GCE 上使用它的非常好的一致文档。可以肯定的是,此 IP 必须首先是您预先分配的静态IP 之一。

跨区域负载均衡文档主要是为计算引擎,而不是Kubernetes /集装箱引擎,但它仍然是有用的,尤其在部分“配置负载平衡服务”。

如果您只是在 GCE 上创建 Kubernetes LoadBalancer,它将创建一个网络 Compute Engine > Network > Network load balance > Forwarding Rule 指向由集群上的机器组成的目标池(通常只有那些运行与服务选择器匹配的 Pod) . 看起来删除命名空间并不能很好地清理那些创建的规则。


更新

它实际上现在得到支持(即使记录不足):

  1. 检查您是否正在运行 Kubernetes 1.1 或更高版本(在GKE下编辑您的集群并检查“节点版本”)
  2. 网络 > 外部 IP 地址下,您应该已经将一些临时标记标记为指向集群的 VM 实例(如果没有或不确定,请在没有 的情况下部署一次loadBalancerIP,等到您在运行时分配了外部 IP kubectl get svc,然后在该页面上的列表)。将其中之一标记为static,假设其External Address is 10.10.10.10
  3. 编辑您的负载平衡器具有loadBalancerIP=10.10.10.10如上(适应,是由谷歌给你的IP)。

现在,如果您删除 LoadBalancer 甚至您的命名空间,它应该在该集群上重新部署时保留该 IP 地址。如果您需要更改集群,应该可以进行一些手动操作:

  1. “网络负载平衡”部分,“目标池”选项卡下,单击“创建目标池”按钮:
    • 名称:(cluster-pool或任何其他名称)
    • 地区:选择您的集群之一的地区
    • 健康检查:可选,如果您愿意
    • 选择现有实例组:您的 Kubernetes 集群
  2. “网络负载均衡”部分,“转发规则”选项卡下,点击“创建转发规则”按钮:
    • 名称:(http-cross-region-gfr或任何其他名称)
    • 地区:选择您的集群之一的地区
    • 外部IP:选择loadbalancer-ip-crossregion您刚刚预留的
    • 目标池:选择cluster-pool您刚刚创建的


小智 8

好消息。这将在 Kubernetes v1.1 中修复。您可以将该service.spec.loadBalancerIP字段设置为您知道自己拥有的 IP。


以前的:

这是一个从裂缝中消失的功能。它应该可以工作(甚至可能在某些时候工作过),但没有经过很好的测试并且在此过程中被破坏,然后意外地设计出来(暂时)。

它在我 1.0 之后要修复的短名单上。

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

  • @Ward:来自开发人员的“这是不可能的”*是*一个答案,恕我直言,它被接受了。 (5认同)