

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

# 联网最佳实践
<a name="networking"></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)最佳实践。

了解 Kubernetes 网络对于高效运行集群和应用程序至关重要。Pod 网络，也称为集群网络，是 Kubernetes 网络的中心。Kubernetes 支持用于集群联网的[容器网络接口](https://github.com/containernetworking/cni) (CNI) 插件。

亚马逊 EKS 正式支持[亚马逊虚拟私有云 (VPC) Virtual Privat](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) e CNI 插件来实现 Kubernetes Pod 联网。VPC CNI 提供与 AWS VPC 的原生集成，并在底层模式下工作。在底层模式下，Pod 和主机位于同一个网络层并共享网络命名空间。从集群和 VPC 的角度来看，Pod 的 IP 地址是一致的。

本指南介绍了 Kubernet [es 集群联网背景下的亚马逊 VPC 容器网络接口](https://github.com/aws/amazon-vpc-cni-k8s) (VPC CNI)。VPC CNI 是 EKS 支持的默认网络插件，因此是本指南的重点。VPC CNI 具有高度可配置性，可支持不同的用例。本指南还包括关于不同 VPC CNI 用例、操作模式、子组件的专门章节，然后是建议。

亚马逊 EKS 在上游 Kubernetes 上游运行，并已通过 Kubernetes 合规认证。尽管您可以使用备用 CNI 插件，但本指南并未提供管理备用 CNI 的建议。查看 [EKS 备用 CNI](https://docs.aws.amazon.com/eks/latest/userguide/alternate-cni-plugins.html) 文档，了解有效管理备用 CNI 的合作伙伴和资源列表。

## Kubernetes 网络模型
<a name="kubernetes-networking-model"></a>

Kubernetes 对集群网络设置了以下要求：
+ 在同一节点上调度的 Pod 必须能够在不使用 NAT（网络地址转换）的情况下与其他 Pod 通信。
+ 在特定节点上运行的所有系统守护程序（后台进程，例如 [kubelet](https://kubernetes.io/docs/concepts/overview/components/)）都可以与在同一节点上运行的 Pod 通信。
+ 使用[主机网络](https://docs.docker.com/network/host/)的 Pod 必须能够在不使用 NAT 的情况下联系所有其他节点上的所有其他 Pod。

有关 [Kubernetes 对兼容网络实现的期望的详细信息，请参阅 Kubernetes 网络模型](https://kubernetes.io/docs/concepts/services-networking/#the-kubernetes-network-model)。下图说明了 Pod 网络命名空间和主机网络命名空间之间的关系。

![主机网络和 2 个 pod 网络命名空间的插图](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/image.png)


## 容器网络接口 (CNI)
<a name="container-networking-interface-cni"></a>

Kubernetes 支持 CNI 规范和插件来实现 Kubernetes 网络模型。CNI 由[规范](https://github.com/containernetworking/cni/blob/main/SPEC.md)（当前版本 1.0.0）和用于编写用于在容器中配置网络接口的插件的库以及许多支持的插件组成。CNI 只关心容器的网络连接以及在删除容器时移除分配的资源。

通过向 kubelet 传递命令行选项即可启用 CNI 插件。`--network-plugin=cni`Kubelet 从`--cni-conf-dir`（默认为 etc/cni //net.d）读取一个文件，并使用该文件中的 CNI 配置来设置每个 Pod 的网络。CNI 配置文件必须符合 CNI 规范（最低版本 0.4.0），并且该配置引用的任何必需的 CNI 插件都必须存在于`--cni-bin-dir`目录中（默认为 //bin）。opt/cni如果目录中有多个 CNI 配置文件，kubelet 会使用按字典顺序排在首位的配置文件。

## 亚马逊虚拟私有云 (VPC) Virtual Private Cloud CNI
<a name="amazon-virtual-private-cloud-vpc-cni"></a>

 AWS-provided VPC CNI 是 EKS 集群的默认联网附加组件。在您配置 EKS 集群时，会默认安装 VPC CNI 插件。VPC CNI 在 Kubernetes 工作节点上运行。VPC CNI 插件由 CNI 二进制文件和 IP 地址管理 (ipamd) 插件组成。CNI 将来自 VPC 网络的 IP 地址分配给 Pod。ipamd 管理每个 Kubernetes 节点的 AWS 弹性网络接口 (ENI)，并维护热池 IP。VPC CNI 提供配置选项，用于预先分配 ENI 和 IP 地址，从而缩短 Pod 启动时间。有关推荐的插件管理最佳实践，请参阅 [Amazon VPC CNI](vpc-cni.md)。

Amazon EKS 建议您在创建集群时至少在两个可用区中指定子网。Amazon VPC CNI 从节点子网为 Pod 分配 IP 地址。我们强烈建议您检查子网中是否有可用的 IP 地址。在部署 EKS 集群之前，请考虑 [VPC 和子网](subnets.md)建议。

Amazon VPC CNI 从连接到节点主 ENI 的子网中分配一个由 ENI 和辅助 IP 地址组成的温池。这种 VPC CNI 模式称为[辅助 IP 模式](vpc-cni.md)。IP 地址的数量以及相应的 Pod 数量（Pod 密度）由 ENI 的数量和实例类型定义的每个 ENI 的 IP 地址（限制）来定义。辅助模式是默认模式，适用于实例类型较小的小型集群。如果您遇到吊舱密度问题，请考虑使用[前缀模式](prefix-mode-linux.md)。您还可以通过为 ENI 分配前缀来增加 Pod 节点上的可用 IP 地址。

Amazon VPC CNI 以原生方式与 AWS VPC 集成，允许用户应用现有的 AWS VPC 联网和安全最佳实践来构建 Kubernetes 集群。这包括能够使用 VPC 流日志、VPC 路由策略和安全组进行网络流量隔离。默认情况下，Amazon VPC CNI 会将与节点上的主 ENI 关联的安全组应用于 Pod。如果您想[为 Pod 分配不同的网络规则，可以考虑为 Pod 启用安全组](sgpp.md)。

默认情况下，VPC CNI 会将分配给节点主 ENI 的子网中的 Pod 分配 IP 地址。运行包含数千个工作负载的大型集群时，通常会遇到 IPv4 地址短缺的情况。AWS VPC 允许您通过[分配辅助 CIDR 来解决 IPv4 CIDR](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html#add-cidr-block-restrictions) 块耗尽的问题，从而扩展可用的 IP。AWS VPC CNI 允许您为 Pod 使用不同的子网 CIDR 范围。VPC CNI 的这一功能称为[自定义联网](custom-networking.md)。你可以考虑使用自定义网络，在 EKS 中使用 `100.64.0.0/10` `198.19.0.0/16` CIDR (CG-NAT)。这实际上允许您创建一个环境，让 Pod 不再使用您的 VPC 中的任何 RFC1918 IP 地址。

自定义网络是解决 IPv4 地址耗尽问题的一种选择，但它需要运营开销。我们建议使用 IPv6 群集而不是自定义网络来解决此问题。具体而言，如果您已完全用完 VPC 的所有可用 [IPv4 地址空间，我们建议您迁移到 IPv6 集群](ipv6.md)。评估贵组织支持 IPv6 的计划，并考虑投资于 IPv6 是否具有更高的长期价值。

EKS 对 IPv6 的支持侧重于解决由 IPv4 地址空间有限引起的 IP 耗尽问题。为了应对客户的 IPv4 耗尽问题，EKS 将 Pod 置于双堆栈 IPv6-only Pod 之上。也就是说，Pod 可能能够访问 IPv4 资源，但没有从 VPC CIDR 范围为它们分配 IPv4 地址。VPC CNI 从 AWS 托管的 VPC IPv6 CIDR 块中为 Pod 分配 IPv6 地址。

## 子网计算器
<a name="subnet-calculator"></a>

该项目包括子[网计算器 Excel 文档](https://github.com/aws/aws-eks-best-practices/blob/master/latest/bpg/networking/subnet-calc/subnet-calc.xlsx)。本计算器文档模拟了不同的 ENI 配置选项（例如`WARM_IP_TARGET`和`WARM_ENI_TARGET`）下指定工作负载的 IP 地址消耗情况。该文档包括两张纸，第一页用于热 ENI 模式，另一页用于暖 IP 模式。有关这些模式的更多信息，请查看 [VPC CNI 指南](vpc-cni.md)。

输入：
+ 子网 CIDR 大小
+ 热 ENI 目标*或*热 IP 目标
+ 实例列表
  + 每个实例调度的工作负载 Pod 的类型、数量和数量

输出：
+ 托管的 pod 总数
+ 消耗的子网 IP 数量
+ 剩余子网 IP 的数量
+ 实例级别详情
  +  IPs/ENIs 每个实例的 Warm 数量
  +  IPs/ENIs 每个实例的活动数量