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

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

我正在使用 Google Kubernetes Engine 部署一个 Web 应用程序,并且我想通过现有静态 IP 地址上的负载均衡器访问它,该地址是我作为 Google Cloud Platform 中同一项目的一部分控制的,因为我想要使用的域名已经指向这个 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

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

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

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

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

有没有什么方法可以实现我想要的功能——在所选的静态 IP 地址上公开 Google Kubernetes 引擎上的 Kubernetes pod(或复制控制器)?

答案1

总结运行 Kubernetes 的 Google Container Enginev1.1支持loadBalancerIP将自动分配的 IP 标记为静止的第一的。

Kubernetes v1.1 支持外部 IP

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

目前还没有关于如何在 GCE 上使用它的真正好的一致文档。可以肯定的是,这个 IP 必须首先是你预先分配的静止的IP。

跨区域负载均衡文档主要针对 Compute Engine 而不是 Kubernetes/Container Engine,但它仍然很有用,尤其是“配置负载平衡服务”部分。

如果您只是在 GCE 上创建 Kubernetes LoadBalancer,它将创建一个网络 Compute Engine > 网络 > 网络负载平衡 > 转发规则,指向由集群上的机器组成的目标池(通常只有那些运行与服务选择器匹配的 Pod 的机器)。删除命名空间似乎不能很好地清理那些创建的规则。


更新

它实际上现在已得到支持(尽管记录不足):

  1. 检查你正在运行 Kubernetes 1.1 或更高版本(在吉科编辑你的集群并检查“节点版本”)
  2. 在下面网络 > 外部 IP 地址你应该已经有一些短暂的标记为指向集群的 VM 实例(如果不是或不确定,请在没有 的情况下部署一次loadBalancerIP,等到您在运行 时分配了外部 IP kubectl get svc,然后在该页面的列表中查找该 IP)。将其中一个标记为静止的,让我们说吧外部地址10.10.10.10
  3. 编辑您的负载均衡器如上所述loadBalancerIP=10.10.10.10(适应Google提供给您的IP)。

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

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

答案2

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


以前的:

这是一项被忽视的功能。它本来应该可以工作(甚至可能曾经工作过),但没有经过充分测试,在开发过程中出现问题,然后被意外设计(暂时)取消。

这是我在 1.0 版本之后需要修复的问题之一。

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

答案3

如果你尝试使用 Helm 来安装ingress-nginx静态外部 IP,下面是对我有用的命令:

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --debug \
  --set controller.service.loadBalancerIP=<YOUR_STATIC_IP>

更多信息:

相关内容