为什么我耗尽 SNAT 端口以从集群中的 pod 进行输出连接?
从 IBM Cloud Kubernetes Service 1.25 开始,源网络地址转换 (NAT) 端口范围已更改为 32768 - 65535
,先前为 1024 - 65535
。 进行此更改是为了解决可能发生以下情况的可能问题。
- 在与 NLB 类型的 LoadBalancer 的 NodePort 冲突的 VPC 集群中选择 SNAT 端口。 在这种情况下,该出口连接失败。
- 针对 NodePort 范围内的长时间运行的出口连接选择 SNAT 端口,该范围为 30,000-32,767,集群服务稍后希望用于 NodePort。 在这种情况下,在使用该 SNAT 端口的连接完成并已关闭之前,该集群服务不会获取该 NodePort 上的流量。
- 对于 Linux 服务或
hostPort
pod 端口或hostNetwork
pod 端口以后想要使用的长时间运行的出口连接,将选择 SNAT 端口。 在这种情况下,在使用该 SNAT 端口的连接完成并已关闭之前,该服务或 pod 不会启动或工作。
通常,限制此端口范围是可以的。 但是,如果您正在 Pod-network Pod 中运行高度可扩展的应用程序,那么在单个工作程序上存在以下任一情况。
- 一次打开到集群中除 pod 或节点以外的目标的出口连接超过 30,000 个。
- 3 万个出口连接正在彼此之间的几分钟内打开。
可能是 32768-65535 范围不够大。 以下是解决此问题的两种可能方法。
- 添加更多节点,每个节点至少有一个 pod,用于建立所有这些出口连接,以便每个节点需要少于 30,000 个 SNAT 端口。 这是首选解决方案
- 将 Calico 中的 pod
natPortRange
显式设置为更大范围。 请注意,如果使用 VPC NLB 或添加使用特定硬编码端口的 NodePort 服务或hostPort
pod,那么这可能会导致先前列出的偶尔端口冲突
如果要设置此端口范围,那么必须下载 calicoctl
二进制文件,为集群设置 KUBECONFIG
环境变量,并运行以下命令,其中 LOWER_RANGE_LIMIT
介于 1025
和 32767
之间。
此更改将立即生效,如果在将集群主节点更新为 1.25 之前执行此操作,那么更新不会覆盖您设置的内容。
calicoctl patch felixconfiguration default --patch '{"spec":{"natPortRange": "LOWER_RANGE_LIMIT:65535"}}'