如何为Kubernetes负载均衡器指定静态IP地址?

时间:2015-08-28 07:55:56

标签: load-balancing google-compute-engine kubernetes

我在Google Compute Engine上运行了Kubernetes群集,我想为外部服务(type: LoadBalancer)分配静态IP地址。我不确定目前是否可能这样做。我在该主题上找到了以下来源:

  • Kubernetes Service Documentation允许您定义外部IP地址,但它失败,无法将对象解组为类型为[] v1的Go值.LoadBalancerIngress
  • publicIPs field似乎让我指定外部IP,但它似乎无法正常工作
  • This Github issue说我还没有支持我要做的事情,但会在Kubernetes v1.1中
  • clusterIP field还允许我指定一个IP地址,但是如果提供的IP不在有效范围内,那么" 就会失败"

我觉得在设置Web服务时使用静态IP非常重要。我在这里错过了什么吗?如果有人能在这里启发我,我将非常感激!

编辑:澄清:我没有使用Container Engine,我自己使用Compute Engine的官方安装说明设置了一个集群。与我的k8s服务相关联的所有IP地址都标记为"短暂的",这意味着重新创建kubernetes服务可能会导致不同的外部IP地址(这就是我需要它们为静态的原因)。

4 个答案:

答案 0 :(得分:42)

TL; DR Google容器引擎运行Kubernetes v1.1 支持loadBalancerIP只需将自动分配的IP标记为静态第一

Kubernetes v1.1支持externalIPs

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

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

cross-region load balancing文档主要用于计算引擎而不是Kubernetes / Container Engine,但它仍然特别适用于“配置负载平衡服务”部分。

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

更新

实际上现在支持它(即使记录在案):

  1. 检查您是否正在运行Kubernetes 1.1或更高版本(在GKE下编辑您的群集并检查“节点版本”)
  2. Networking > External IP addresses下分配静态IP:
    • 在没有loadBalancerIP的情况下部署一次,等到运行kubectl get svc时分配了外部IP,然后在该页面的列表中查找该IP并从 Ephemeral <更改< / em>到静态
    • 点击群集区域中的“保留静态地址”区域,附加到“无”。
  3. 编辑您的 LoadBalancer ,使其具有上述loadBalancerIP=10.10.10.10(适应Google为您提供的IP)。
  4. 现在,如果删除LoadBalancer甚至是命名空间,它将在该群集上重新部署时保留该IP地址。

    更新2016-11-14

    另请参阅Kubernetes article,了解如何在Kubernetes上为单个或多个域设置静态IP。

答案 1 :(得分:13)

Kubernetes v1.1将进行一些更改。

首先,GCE中的所有负载均衡器都将获得静态IP。这允许我们模拟&#34;更新&#34; GCE不支持的操作。

其次,https://github.com/kubernetes/kubernetes/pull/13005提出了一个新字段来明确设置负载均衡器的IP。

注意你的短暂&#34;只要您的服务存在,IP就属于您。这大致类似于AWS对ELB名称的作用(随机分配,直到您发布它为止)。

publicIPs(或v1中的deprecatedPublicIPs)将被替换为具有非常相似语义的externalIP。这些是“不受管理的”#34; IP - kubernetes不会使用它们建立负载均衡器,但它会接受它们的流量。

clusterIP是群集内地址,通常在群集外部不可用,或者&#34;项目&#34;或VPC(以GCE或AWS术语表示)

答案 2 :(得分:1)

如果您使用的是Google容器引擎,并且正在使用type: LoadBalancer,那么Google云端平台应该为您创建一个网络负载均衡器,其中包含将路由到此服务的静态IP地址。您不需要指定任何IP地址。

要查找网络负载均衡器的IP,请运行:

gcloud compute forwarding-rules list --project "YOUR-PROJECT-ID"

您还应该能够运行:

kubectl get services

这将返回您的服务的群集和外部IP和端口。

答案 3 :(得分:0)

在我这边,我确认 loadBalancerIP 字段允许使用 Kubernetes 1.18.2 为 GKE LoadBalancer 指定静态 IP 地址:

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

此外,以下命令返回给定项目的负载均衡器 IP:

gcloud compute forwarding-rules list --project <PROJECT_IS>
NAME                              REGION       IP_ADDRESS   IP_PROTOCOL  TARGET
aaba14cac607a4413813bebfb7eaaf8a  us-central1  10.136.0.49  TCP          us-central1/backendServices/aaba14cac607a4413813bebfb7eaaf8a

该命令证明它工作正常:

kubectl get service <svc-name> 
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
<svc-name>    LoadBalancer   10.136.27.201   10.136.0.49   4040:30754/TCP   57s