如何为 Kubernetes 负载均衡器指定静态 IP 地址?
How to specify static IP address for Kubernetes load balancer?
我在 Google Compute Engine 上有一个 Kubernetes 集群 运行,我想为我的外部服务 (type: LoadBalancer
) 分配静态 IP 地址。我不确定目前是否可行。我找到了关于该主题的以下资源:
- Kubernetes Service Documentation 允许您定义一个外部 IP 地址,但它失败了 cannot unmarshal object into Go value of type []v1.LoadBalancerIngress
- publicIPs field好像让我指定了外部IP,不过好像也行不通
- This Github issue 声明我正在尝试做的事情尚不支持,但将在 Kubernetes v1.1
- clusterIP field 也允许我指定一个 IP 地址,但失败并显示“提供的 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 匹配服务选择器)。看起来删除命名空间并不能很好地清理那些创建的规则。
更新
它现在实际上是受支持的(即使在文档中):
- 检查您是否正在 运行ning Kubernetes 1.1 或更高版本(在 GKE 下编辑您的集群并检查 "Node version")
- 在 Networking > External IP addresses 下分配静态 IP,或者:
- 在没有
loadBalancerIP
的情况下部署一次,等到 运行 kubectl get svc
分配了外部 IP,然后在该页面的列表中查找该 IP 并更改那些从临时到静态。
- 点击"Reserver a static address"区域在你集群的区域,附加到None。
- 编辑您的 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
我在 Google Compute Engine 上有一个 Kubernetes 集群 运行,我想为我的外部服务 (type: LoadBalancer
) 分配静态 IP 地址。我不确定目前是否可行。我找到了关于该主题的以下资源:
- Kubernetes Service Documentation 允许您定义一个外部 IP 地址,但它失败了 cannot unmarshal object into Go value of type []v1.LoadBalancerIngress
- publicIPs field好像让我指定了外部IP,不过好像也行不通
- This Github issue 声明我正在尝试做的事情尚不支持,但将在 Kubernetes v1.1
- clusterIP field 也允许我指定一个 IP 地址,但失败并显示“提供的 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 匹配服务选择器)。看起来删除命名空间并不能很好地清理那些创建的规则。
更新
它现在实际上是受支持的(即使在文档中):
- 检查您是否正在 运行ning Kubernetes 1.1 或更高版本(在 GKE 下编辑您的集群并检查 "Node version")
- 在 Networking > External IP addresses 下分配静态 IP,或者:
- 在没有
loadBalancerIP
的情况下部署一次,等到 运行kubectl get svc
分配了外部 IP,然后在该页面的列表中查找该 IP 并更改那些从临时到静态。 - 点击"Reserver a static address"区域在你集群的区域,附加到None。
- 在没有
- 编辑您的 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