Kubernetes Engine集群节点外网IP

External IP of nodes in cluster of Kubernetes Engine

如果集群升级或失败,集群中的3个工作节点将被删除并重新创建。这时候暴露在外面的节点IP就变了。解决这个问题,请问有没有办法即使我新建一个节点也能保留IP?

TL;DR

您不能将静态 IP 分配给 GKE 节点并期望它在“重新创建”后保持不变。

如果节点出现故障或节点升级,它将使用新 IP 重新创建(之前的静态 IP 将保持未使用状态)。

您可以创建一个 GKE 节点,然后将您的 Ephemeral IP 提升为 Static IP,但在节点 failure/upgrade 之后,它将从资源中释放( GKE节点)。

请看下面的更多解释。


我将这部分分为两部分:

  • 入口流量
  • 出口流量

入口流量(流量进入集群)

您不必担心 GKE 节点的 External IP 更改,因为暴露的工作负载应该使用:

  • Service 类型 LoadBalancer 创建 L4 LoadBalancer(有自己的 IP)指向所有节点(如果节点发生故障,流量将被发送到另一个)
  • Ingress 创建指向所有节点的 L7 HTTP/HTTPS 负载均衡器(具有自己的 IP)。 (如果一个节点发生故障,流量将被发送到另一个节点)

GKE 中关于 Services 的文档:

有一个选项可以使用 NodePort 类型的 Service 公开您的工作负载,但需要指出的是,这仍然是单点故障。对于 LoadBalancer 类型的 Service,流量有很多路径可供选择(节点可供选择)。 NodePort 以防节点故障,您的 app/software 将不可用。

出口流量(来自集群 out 的流量)

如果您担心从集群流出的流量将发往某些特定的白名单服务(例如其他位置的 DB),您可以使用 Cloud NAT

Cloud NAT overview

Cloud NAT (network address translation) lets Google Cloud virtual machine (VM) instances without external IP addresses and private Google Kubernetes Engine (GKE) clusters send outbound packets to the internet and receive any corresponding established inbound response packets.

Cloud.google.com: NAT: Docs: Overview

通过这种方法,您可以创建一个 private GKE cluster。您的节点将只有一个内部 IP 地址。然后,您可以配置前面提到的 Cloud NAT,以便节点通过 Cloud Router 路由数据包。您的所有节点都将在 Internet 上从同一个静态 IP 可见,该静态 IP 在任何节点故障的情况下都不会改变。

这里有一个示例设置:


从节点故障和节点升级的角度,建议大家查看官方文档:

您还可以看看: