

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 优化 IP 地址利用率
<a name="ip-opt"></a>

**提示**  
 通过 Amazon EKS 研讨会@@ [探索](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)最佳实践。

得益于应用程序现代化，容器化环境的规模正在快速增长。这意味着部署的工作节点和 Pod 越来越多。

[Amazon VPC CNI](vpc-cni.md) 插件为每个容器分配一个来自 VPC 的 CIDR 的 IP 地址。这种方法通过 VPC 流日志和其他监控解决方案等工具提供 Pod 地址的全面可见性。根据您的工作负载类型，这可能会导致 Pod 消耗大量的 IP 地址。

在设计 AWS 网络架构时，在 VPC 和节点级别优化 Amazon EKS IP 使用非常重要。这将帮助您缓解 IP 耗尽问题并增加每个节点的 pod 密度。

在本节中，我们将讨论可以帮助您实现这些目标的技术。

## 优化节点级 IP 消耗
<a name="_optimize_node_level_ip_consumption"></a>

 [前缀委](https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html)派是亚马逊虚拟私有云（亚马逊 VPC）的一项功能，它允许您为亚马逊弹性计算云 (Amazon EC2) 实例分配 IPv4 或 IPv6 前缀。它增加了每个网络接口 (ENI) 的 IP 地址，从而提高了每个节点的 pod 密度并提高了计算效率。自定义网络还支持前缀委托。

有关详细信息，请参阅 [Linux 节点的前缀委](prefix-mode-linux.md)派和[使用 Windows 节点的前缀委派](prefix-mode-win.md)部分。

## 减轻 IP 耗尽的风险
<a name="_mitigate_ip_exhaustion"></a>

为防止您的集群消耗所有可用的 IP 地址，我们强烈建议您在调整您的 VPC 和子网时考虑增长。

采用 [IPv6](ipv6.md) 是从一开始就避免这些问题的好方法。但是，对于可扩展性需求超过初始规划且无法采用 IPv6 的组织，建议改进 VPC 设计是应对 IP 地址耗尽的应对措施。Amazon EKS 客户最常用的技术是向 VPC 添加不可路由的辅助 CIDR，并将 VPC CNI 配置为在为 Pod 分配 IP 地址时使用额外的 IP 空间。这通常被称为[自定义网络](custom-networking.md)。

我们将介绍您可以使用 Amazon VPC CNI 的哪些变量来优化分配给节点的 IP 热池。在本节结束时，我们将介绍一些其他架构模式，这些模式不是 Amazon EKS 固有的，但可以帮助缓解 IP 耗尽。

### 使用 IPv6（推荐）
<a name="_use_ipv6_recommended"></a>

采用 IPv6 是解决 RFC1918 限制的最简单方法；我们强烈建议您在选择网络架构时考虑将 IPv6 作为首选。IPv6 提供的总 IP 地址空间要大得多，集群管理员可以专注于迁移和扩展应用程序，而不必花精力绕过 IPv4 限制。

亚马逊 EKS 集群同时支持 IPv4 和 IPv6。默认情况下，EKS 集群使用 IPv4 地址空间。在创建集群时指定基于 IPv6 的地址空间将启用 IPv6。在 IPv6 EKS 集群中，容器和服务接收 IPv6 地址，同时**保持传统 IPv4 终端节点连接到在 IPv6 集群上运行的服务的能力，反之亦然**。集群内所有 pod 到 Pod 的通信始终通过 IPv6 进行。在 VPC (/56) 中，IPv6 子网的 IPv6 CIDR 块大小固定为 /64。这提供了 2^64（大约 18 万亿）的 IPv6 地址，允许您在 EKS 上扩展部署。

有关详细信息，请参阅 “[运行 IPv6 EKS 集群](ipv6.md)” 部分；要[获得实践经验，请参阅 “亲身体验 [IPv6” 研讨会的 “了解 Amazon EKS 上](https://catalog.workshops.aws/ipv6-on-aws/en-US/lab-6)的 IPv6](https://catalog.workshops.aws/ipv6-on-aws/en-US)” 部分。

![IPv6 模式下的 EKS 集群](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/opt_ipv6.gif)


### 优化 IPv4 集群中的 IP 消耗
<a name="_optimize_ip_consumption_in_ipv4_clusters"></a>

本节专门针对正在运行传统应用程序但尚未准备好迁移到 IPv6 的客户。 and/or 虽然我们鼓励所有组织尽快迁移到 IPv6，但我们认识到，有些组织可能仍需要考虑其他方法来使用 IPv4 扩展其容器工作负载。为此，我们还将引导您了解架构模式，以优化 Amazon EKS 集群的 IPv4 (RFC1918) 地址空间消耗。

#### 为增长做好计划
<a name="_plan_for_growth"></a>

作为防止 IP 耗尽的第一道防线，我们强烈建议您在考虑增长的情况下调整 IPv4 VPC 和子网的大小，以防止您的集群消耗所有可用 IP 地址。如果子网没有足够的可用的 IP 地址，您将无法创建新的 Pod 或节点。

在构建 VPC 和子网之前，建议从所需的工作负载规模向后移动。例如，使用 [eksctl](https://eksctl.io/)（用于在 EKS 上创建和管理集群的简单 CLI 工具）构建集群时，默认情况下会创建 19 个子网。/19 的网络掩码适用于允许分配超过 8000 个地址的大多数工作负载类型。

**重要**  
在调整 VPC 和子网的大小时，可能会有许多元素（Pod 和节点除外）会消耗 IP 地址，例如负载均衡器、RDS 数据库和其他 vpc 内服务。

此外，Amazon EKS 可以创建多达 4 个弹性网络接口 (X-ENI)，这些接口是允许与控制平面通信所必需的（更多信息[请点击此处](subnets.md)）。在集群升级期间，Amazon EKS 会创建新的集群， X-ENIs 并在升级成功后删除旧集群。因此，对于与 EKS 集群关联的子网，我们建议网络掩码至少为 /28（16 个 IP 地址）。

您可以使用 [EKS 子网计算器电子表格样本](https://github.com/aws/aws-eks-best-practices/blob/master/latest/bpg/networking/subnet-calc/subnet-calc.xlsx)来规划您的网络。该电子表格根据工作负载和 VPC ENI 配置计算 IP 使用情况。将 IP 使用情况与 IPv4 子网进行比较，以确定配置和子网大小是否足以应付您的工作负载。请记住，如果您的 VPC 中的子网用完了可用 IP 地址，我们建议使用 VPC 的原始 CIDR 块[创建一个新子网](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-subnets.html#create-subnets)。请注意，现在 [Amazon EKS 允许修改集群子网和安全组](https://aws.amazon.com/about-aws/whats-new/2023/10/amazon-eks-modification-cluster-subnets-security/)。

#### 自定义网络
<a name="_custom_networking"></a>

如果您即将耗尽 RFC1918 IP 空间，则可以使用[自定义网络](custom-networking.md)模式通过在专用的额外子网内调度 Pod 来节省可路由的 IP。虽然自定义网络将接受辅助 CIDR 范围的有效 VPC 范围，但我们建议您使用该 CG-NAT 空间中的 CIDR (/16)，也就是说`100.64.0.0/10`，`198.19.0.0/16`与 RFC1918 范围相比，这些在企业环境中使用的可能性较小。

有关详细信息，请参阅 “[自定义网络](custom-networking.md)” 的专用部分。

![自定义网络](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/opt_custom-networking.gif)


#### 增强的子网发现
<a name="_enhanced_subnet_discovery"></a>

[增强型子网发现通过标记新子网，使 Amazon VPC CNI 可以发现这些子网，从而为 IP 耗尽提供了一种简化的网络配置替代方案。](vpc-cni.md)借助增强型子网发现，当前的工作负载可以在相同的子网上继续运行，Amazon Elastic Kubernetes Service (Amazon EKS) 现在可以在新的 “可用子网” 上安排更多容器。

如果您的集群当前子网的 IP 地址已用完，则只需按如下方式向 Amazon EKS 集群添加其他子网即可：

1. 将新的 CIDR 块关联到您的 VPC。

1. 在新的 CIDR 块中创建一个新的子网，并用 “kubernetes” 对其进行标记。 io/role/cni” = “1"。

1. 将 Amazon VPC CNI 插件的 ENABLE\_SUBNET\_DISCOVERY 配置设置为 “true”（自版本 1.18.0 起默认）。

在您的 VPC 和 Amazon EKS 集群上启用增强型子网发现后，新的弹性网络接口 (ENI) 将连接到您的 Amazon EKS 节点，如下图所示：

![增强的子网发现](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/opt_enhanced-subnet-discovery.gif)


有关更多信息，请参阅 [AWS 容器博客上的 Amazon VPC CNI 推出增强型子网发现](https://aws.amazon.com/blogs/containers/amazon-vpc-cni-introduces-enhanced-subnet-discovery/)。

#### 优化 IP 温池
<a name="_optimize_the_ips_warm_pool"></a>

在默认配置下，VPC CNI 会将整个 ENI（和相关的 IP）保留在温池中。这可能会消耗大量 IP，尤其是在较大的实例类型上。

如果您的集群子网可用的 IP 地址数量有限，请仔细检查以下 VPC CNI 配置环境变量：
+  `WARM_IP_TARGET` 
+  `MINIMUM_IP_TARGET` 
+  `WARM_ENI_TARGET` 

您可以将的值配置`MINIMUM_IP_TARGET`为与您期望在节点上运行的 Pod 数量非常匹配。这样做可以确保在创建 Pod 时，CNI 无需调用 EC2 API 即可从温池中分配 IP 地址。

请注意，将值设置`WARM_IP_TARGET`得太低会导致对 EC2 API 的额外调用，这可能会导致请求受到限制。对于大型集群，使用和`MINIMUM_IP_TARGET`以避免限制请求。

要配置这些选项，您可以下载`aws-k8s-cni.yaml`清单并设置环境变量。在撰写本文时，最新版本位于[此处](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/config/master/aws-k8s-cni.yaml)。检查配置值的版本是否与已安装的 VPC CNI 版本相匹配。

**警告**  
更新 CNI 时，这些设置将重置为默认值。在更新 CNI 之前，请对其进行备份。查看配置设置以确定更新成功后是否需要重新应用这些设置。

您可以即时调整现有应用程序的 CNI 参数，而无需停机，但您应该选择能够满足您的可扩展性需求的值。例如，如果您使用的是批处理工作负载，我们建议您更新默认工作负载`WARM_ENI_TARGET`以满足 Pod 规模的需求。设置`WARM_ENI_TARGET`为较高的值将始终保持运行大批量工作负载所需的热 IP 池，从而避免数据处理延迟。

**警告**  
改进 VPC 设计是应对 IP 地址耗尽的建议措施。考虑像 IPv6 和辅助 CIDR 这样的解决方案。在排除其他选项之后，调整这些值以最大限度地减少热 IP 的数量应该是一种临时解决方案。错误配置这些值可能会干扰群集操作。在对生产系统进行任何更改之前，请务必查看[此页面](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/eni-and-ip-target.md)上的注意事项。

#### 监控 IP 地址清单
<a name="_monitor_ip_address_inventory"></a>

除了上述解决方案外，了解 IP 利用率也很重要。您可以使用 [CNI 指标](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)助手监控子网的 IP 地址清单。一些可用的指标是：
+ 集群可以支持的最大 ENI 数量
+ 已分配的 ENI 数量
+ 当前分配给 Pod 的 IP 地址数量
+ 可用 IP 地址的总数和最大数量

您还可以设置[CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)，以便在子网的 IP 地址用完时收到通知。

**警告**  
确保 VPC CNI 的`DISABLE_METRICS`变量设置为 false。

#### 进一步的考虑
<a name="_further_considerations"></a>

还有其他不是 Amazon EKS 固有的架构模式可以帮助解决 IP 耗尽问题。例如，您可以[优化 VPC 间的通信或跨](subnets.md#cross-vpcs)[多个账户共享 VPC](subnets.md#subnets-multiple-accounts) 以限制 IPv4 地址分配。

在此处了解有关这些模式的更多信息：
+  [设计超大规模的 Amazon VPC 网络](https://aws.amazon.com/blogs/networking-and-content-delivery/designing-hyperscale-amazon-vpc-networks/)，
+  使用 [Amazon VPC Lattice 建立安全的多账户多 VPC 连接](https://aws.amazon.com/blogs/networking-and-content-delivery/build-secure-multi-account-multi-vpc-connectivity-for-your-applications-with-amazon-vpc-lattice/)。