

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

# 网络最佳实践
<a name="networking"></a>

**提示**  
 [通过亚马逊 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) ](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) CNI 插件来实现 Kubernetes Pod 网络。VPC CNI 提供与 AWS VPC 的原生集成，并在底层模式下运行。在底层模式下，Pod 和主机位于同一个网络层并共享网络命名空间。从集群和 VPC 的角度来看，Pod 的 IP 地址是一致的。

本指南介绍了 Kubernetes 集群网络背景下的[亚马逊 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 通信。
+ 使用[主机网络的 Pod ](https://docs.docker.com/network/host/) 必须能够在不使用 NAT 的情况下联系所有其他节点上的所有其他 Pod。

有关Kubernetes对兼容网络[实现的期望的详细信息，请参见 ](https://kubernetes.io/docs/concepts/services-networking/#the-kubernetes-network-model) Kubernetes网络模型。下图说明了 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) 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 启动时间。有关推荐的插件管理最佳实践[，请参阅](vpc-cni.md)亚马逊 VPC CNI。

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

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

亚马逊 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 来扩展可用的 IP 地址，](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html#add-cidr-block-restrictions)以解决 IPv4 CIDR 区块耗尽的问题。AWS VPC CNI 允许您为 Pod 使用不同的子网 CIDR 范围。VPC CNI 的这一功能称为[自定义网络](custom-networking.md)。你可以考虑将自定义网络与 EKS `100.64.0.0/10` 范围（共享地址空间，RFC 6598）的 CIDR 一起使用。这有效地允许您创建一个 Pod 不再使用您的 VPC 中的任何 RFC1918 IP 地址的环境。

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

EKS对IPv6的支持侧重于解决由有限的IPv4地址空间引起的IP耗尽问题。为了应对客户 IPv4 耗尽的问题，EKS 将 IPv6-only Pod 优先于双栈 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.md) VPC CNI 指南。

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

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