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

How to specify static IP address for Kubernetes load balancer?

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

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

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

如果您运行正在使用 Google 容器引擎,并且正在使用 type: LoadBalancer,那么 Google Cloud Platform 应该已经为您制作了一个网络负载均衡器将路由到此服务的静态 IP 地址。您无需指定任何 IP 地址。

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

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

您还应该能够 运行:

kubectl get services

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

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

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

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

请注意,只要您的服务存在,您的 "ephemeral" IP 就是您的 IP。这大致类似于 AWS 对 ELB 名称所做的处理(随机分配,在您发布之前属于您)。

publicIPs(或 v1 中弃用的 PublicIPs)将替换为语义非常相似的 externalIPs。这些是 "unmanaged" 个 IP - kubernetes 不会使用它们建立负载均衡器,但会接受它们的流量。

clusterIP 是集群内地址,通常在集群或 "project" 或 VPC(在 GCE 或 AWS 术语中)之外不可用

TL;DR Google 容器引擎 运行ning Kubernetes v1.1 支持 loadBalancerIP 先将自动分配的IP标记为static即可。

Kubernetes v1.1 支持externalIPs:

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

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

cross-region load balancing 文档主要针对 Compute Engine 而不是 Kubernetes/Container Engine,但它仍然很有用,尤其是 "Configure the load balancing service".

部分

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


更新

它现在实际上是受支持的(即使在文档中):

  1. 检查您是否正在 运行ning Kubernetes 1.1 或更高版本(在 GKE 下编辑您的集群并检查 "Node version")
  2. Networking > External IP addresses 下分配静态 IP,或者:
    • 在没有 loadBalancerIP 的情况下部署一次,等到 运行 kubectl get svc 分配了外部 IP,然后在该页面的列表中查找该 IP 并更改那些从临时静态
    • 点击"Reserver a static address"区域在你集群的区域,附加到None。
  3. 编辑您的 LoadBalancer 使其具有上述 loadBalancerIP=10.10.10.10(适应 Google 给您的 IP)。

现在,如果您删除 LoadBalancer 甚至您的命名空间,它将在该集群上重新部署时保留该 IP 地址。


2016-11-14更新

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

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

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

此外,在 returns 下面命令给定项目的负载均衡器 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