

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 将多个网络接口连接到容器组（pod）
<a name="pod-multiple-network-interfaces"></a>

默认情况下，Amazon VPC CNI 插件为每个容器组（pod）分配一个 IP 地址。此 IP 地址连接到一个*弹性网络接口*，该接口负责处理容器组（pod）的所有传入和传出流量。要提高带宽和每秒数据包速率性能，您可以使用 VPC CNI 的*多 NIC 功能*配置多宿主容器组（pod）。多宿主容器组（pod）是使用多个网络接口（和多个 IP 地址）的单个 Kubernetes 容器组（pod）。通过运行多宿主容器组（pod），您可以使用并发连接将其应用程序流量分散到多个网络接口。这对于人工智能（AI）、机器学习（ML）和高性能计算（HPC）使用案例特别有用。

下图显示一个在使用多个网络接口卡（NIC）的 Worker 节点上运行的多宿主容器组（pod）。

![\[带有两个网络接口的多宿主容器组（pod），一个网络接口连接 ENA，一个网络接口连接 ENA 和 EFA\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/multi-homed-pod.png)


## 背景
<a name="pod-multi-nic-background"></a>

在 Amazon EC2 上，*弹性网络接口*是 VPC 中的逻辑联网组件，表示虚拟网卡。对于许多 EC2 实例类型，网络接口在硬件中共享一个网络接口卡（NIC）。此单个 NIC 具有最大带宽和每秒数据包速率。

如果启用了多 NIC 功能，则 VPC CNI 不会像默认那样批量分配 IP 地址。相反，新容器组（pod）启动后，VPC CNI 会按需为每个网卡上的网络接口分配一个 IP 地址。这种行为可降低因使用多宿主容器组（pod）而增加的 IP 地址耗尽率。由于 VPC CNI 按需分配 IP 地址，因此在启用多 NIC 功能的实例上，容器组（pod）可能需要更长的时间才能启动。

## 注意事项
<a name="pod-multi-nic-considerations"></a>
+ 确保您的 Kubernetes 集群运行的是 VPC CNI 版本 `1.20.0` 及更高版本。多 NIC 功能仅在 VPC CNI `1.20.0` 或更高版本中可用。
+ 在 VPC CNI 插件中启用 `ENABLE_MULTI_NIC` 环境变量。您可以运行以下命令来设置该变量并开始部署 DaemonSet。
  +  `kubectl set env daemonset aws-node -n kube-system ENABLE_MULTI_NIC=true` 
+ 确保创建具有多个网络接口卡（NIC）的 Worker 节点。有关具有多个网络接口卡的 EC2 实例列表，请参阅《Amazon EC2 用户指南》****中的[网卡](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#network-cards)。
+ 如果启用了多 NIC 功能，则 VPC CNI 不会像默认那样批量分配 IP 地址。由于 VPC CNI 按需分配 IP 地址，因此在启用多 NIC 功能的实例上，容器组（pod）可能需要更长的时间才能启动。有关更多信息，请参阅之前的 [背景](#pod-multi-nic-background) 部分。
+ 启用多 NIC 功能后，容器组（pod）默认没有多个网络接口。必须将每个工作负载配置为使用多 NIC。为应具有多个网络接口的工作负载添加 `k8s.amazonaws.com/nicConfig: multi-nic-attachment` 注解。

### `IPv6` 注意事项
<a name="pod-multi-nic-considerations-ipv6"></a>
+  **自定义 IAM 策略**：对于 `IPv6` 集群，请为 VPC CNI 创建并使用以下自定义 IAM 策略。此策略专用于多 NIC。有关将 VPC CNI 与 `IPv6` 集群结合使用的更多一般信息，请参阅 [了解如何将 IPv6 地址分配给集群、容器组（pod）和服务](cni-ipv6.md)。

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AmazonEKSCNIPolicyIPv6MultiNIC",
              "Effect": "Allow",
              "Action": [
                  "ec2:CreateNetworkInterface",
                  "ec2:DescribeInstances",
                  "ec2:AssignIpv6Addresses",
                  "ec2:DetachNetworkInterface",
                  "ec2:DescribeNetworkInterfaces",
                  "ec2:DescribeTags",
                  "ec2:ModifyNetworkInterfaceAttribute",
                  "ec2:DeleteNetworkInterface",
                  "ec2:DescribeInstanceTypes",
                  "ec2:UnassignIpv6Addresses",
                  "ec2:AttachNetworkInterface",
                  "ec2:DescribeSubnets"
              ],
              "Resource": "*"
          },
          {
              "Sid": "AmazonEKSCNIPolicyENITagIPv6MultiNIC",
              "Effect": "Allow",
              "Action": "ec2:CreateTags",
              "Resource": "arn:aws:ec2:*:*:network-interface/*"
          }
      ]
  }
  ```
+  `IPv6` **转换机制不可用**：如果您使用多 NIC 功能，则 VPC CNI 不会为 `IPv6` 集群上的容器组（pod）分配 `IPv4` 地址。否则，VPC CNI 会为每个容器组（pod）分配一个主机本地 `IPv4` 地址，这样容器组（pod）便可与其他 Amazon VPC 或互联网中的外部 `IPv4` 资源进行通信。

## 用法
<a name="pod-multi-NIC-usage"></a>

在 VPC CNI 中启用多 NIC 功能并且 `aws-node` 容器组（pod）重新启动后，您可以将每个工作负载配置为多宿主。以下是带有所需注解的 YAML 配置示例：

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: orders-deployment
  namespace: ecommerce
  labels:
    app: orders
spec:
  replicas: 3
  selector:
    matchLabels:
      app: orders
  template:
    metadata:
      annotations:
         k8s.amazonaws.com/nicConfig: multi-nic-attachment
      labels:
        app: orders
    spec:
...
```

## 常见问题
<a name="pod-muti-nic-faqs"></a>

### **1。什么是网络接口卡（NIC）？**
<a name="pod-muti-nic-faqs-nic"></a>

网络接口卡（NIC），也简称网卡，是一种支持底层云计算硬件网络连接的物理设备。在现代 EC2 服务器中，这指的是 Nitro 网卡。弹性网络接口（ENI）是该底层网卡的虚拟表示。

某些 EC2 实例类型有多个 NIC，以提升带宽和数据包速率性能。对于此类实例，您可以将辅助 ENI 分配给其他网卡。例如，ENI \$11 可以作为连接到网卡索引 0 的 NIC 的接口，而 ENI \$12 可以作为连接到单独网卡索引的 NIC 的接口。

### **2. 什么是多宿主容器组（pod）？**
<a name="pod-muti-nic-faqs-pod"></a>

多宿主容器组（pod）是具有多个网络接口（也意味着多个 IP 地址）的单个 Kubernetes 容器组（pod）。每个容器组（pod）网络接口都关联一个[弹性网络接口（ENI）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)，而这些 ENI 是底层 Worker 节点上独立 NIC 的逻辑表示。通过多个网络接口，多宿主容器组（pod）具有额外的数据传输容量，从而也提升了其数据传输速率。

**重要**  
VPC CNI 只能在具有多个 NIC 的实例类型上配置多宿主容器组（pod）。

### **3. 为什么应该使用此功能？**
<a name="pod-muti-nic-faqs-why"></a>

如果您需要在基于 Kubernetes 的工作负载中扩展网络性能，可以使用多 NIC 功能运行多宿主容器组（pod），这些容器组（pod）与连接 ENA 设备的所有底层 NIC 相连。通过将应用程序流量分布到多个并发连接，利用额外的网卡可以提高应用程序的带宽容量和数据包速率性能。这对于人工智能（AI）、机器学习（ML）和高性能计算（HPC）使用案例特别有用。

### **4. 如何使用此功能？**
<a name="pod-muti-nic-faqs-how-to-enable"></a>

1. 首先，必须确保您的 Kubernetes 集群使用的是 VPC CNI 版本 1.20 或更高版本。有关将 VPC CNI 更新为 EKS 附加组件的步骤，请参阅[更新 Amazon VPC CNI（Amazon EKS 附加组件）](vpc-add-on-update.md)。

1. 然后，您必须使用 `ENABLE_MULTI_NIC` 环境变量在 VPC CNI 中启用多 NIC 支持。

1. 接着，您必须确保创建并加入具有多个网卡的节点。有关具有多个网卡的 EC2 实例类型列表，请参阅《Amazon EC2 用户指南》**中的[网卡](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#network-cards)。

1. 最后，您可以将每个工作负载配置为使用多个网络接口（多宿主容器组（pod））或使用单个网络接口。

### **5. 如何将我的工作负载配置为在支持的 Worker 节点上使用多个 NIC？**
<a name="pod-muti-nic-faqs-how-to-workloads"></a>

要使用多宿主容器组（pod），您需要添加以下注解：`k8s.amazonaws.com/nicConfig: multi-nic-attachment`。这会将底层实例中每个 NIC 的 ENI 连接到容器组（pod）（容器组（pod）与 NIC 之间是一对多映射）。

如果缺少此注解，VPC CNI 会假设您的容器组（pod）只需要 1 个网络接口，并从任何可用 NIC 上的 ENI 为其分配一个 IP。

### **6. 此功能支持哪些网络接口适配器？**
<a name="pod-muti-nic-faqs-adapters"></a>

如果至少有一个 ENA 连接到底层网卡用于传输 IP 流量，则可以使用任何网络接口适配器。有关 ENA 的更多信息，请参阅《Amazon EC2 用户指南》**中的[弹性网络适配器（ENA）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html)。

支持的网络设备配置：
+  **ENA** 接口提供支持 VPC 的 IP 联网所需的所有传统 IP 联网和路由功能。有关更多信息，请参阅[在 EC2 实例上使用 ENA 启用增强联网功能](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html)。
+  **EFA****（带 ENA 的** **EFA）**接口既提供用于 IP 联网的 ENA 设备，又提供用于低延迟、高吞吐量通信的 EFA 设备。

**重要**  
如果网卡仅连接了**仅限 EFA** 适配器，则在为多宿主容器组（pod）预置网络连接时，VPC CNI 将跳过。但是，如果您在网卡上将**仅限 EFA** 适配器与 **ENA** 适配器结合使用，则 VPC CNI 也将管理此设备上的 ENI。要将仅限 EFA 接口与 EKS 集群结合使用，请参阅[使用 Elastic Fabric Adapter 在 Amazon EKS 上运行机器学习训练](node-efa.md)。

### **7. 我可以查看集群中的某个节点是否支持 ENA 吗？**
<a name="pod-muti-nic-faqs-node-ena"></a>

是的，您可以使用 AWS CLI 或 EC2 API 来检索有关集群中 EC2 实例的网络信息。这将提供有关该实例是否支持 ENA 的详细信息。在以下示例中，将 `<your-instance-id>` 替换为节点的 EC2 实例 ID。

 AWS CLI 示例：

```
aws ec2 describe-instances --instance-ids <your-instance-id> --query "Reservations[].Instances[].EnaSupport"
```

输出示例：

```
[ true ]
```

### **8. 我可以查看与容器组（pod）关联的不同 IP 地址吗？**
<a name="pod-muti-nic-faqs-list-ips"></a>

这不太容易。但您可以从节点使用 `nsenter` 运行常用网络工具（例如 `ip route show`）并查看其他 IP 地址和接口。

### **9. 我可以控制控制容器组（pod）的网络接口数量吗？**
<a name="pod-muti-nic-faqs-number-of-enis"></a>

不可以。当您的工作负载配置为在支持的实例上使用多个 NIC 时，单个容器组（pod）会自动从该实例上的每个网卡获得一个 IP 地址。或者，单宿主容器组（pod）将有一个网络接口连接到实例上的一个 NIC。

**重要**  
VPC CNI 会跳过*仅*连接**仅限 EFA** 设备的网卡。

### **10. 我可以将容器组（pod）配置为使用特定的 NIC 吗？**
<a name="pod-muti-nic-faqs-specify-nic"></a>

不可以，不支持此功能。如果某个容器组（pod）有相关注解，则 VPC CNI 会自动将其配置为使用 Worker 节点上带有 ENA 适配器的每个 NIC。

### **11. 此功能可以与其他 VPC CNI 联网功能结合使用吗？**
<a name="pod-muti-nic-faqs-modes"></a>

可以，VPC CNI 中的多 NIC 功能可以与*自定义联网*和*增强型子网发现*功能结合使用。但是，多宿主容器组（pod）不会使用自定义子网或安全组。相反，VPC CNI 会将 IP 地址和网络接口分配给与节点具有相同子网和安全组配置的多宿主容器组（pod）。有关自定义联网功能的更多信息，请参阅 [使用自定义网络在备用子网中部署容器组（pod）](cni-custom-network.md)。

VPC CNI 中的多 NIC 功能不适用且无法与*容器组（pod）的安全组*结合使用。

### **12. 我可以将网络策略与此功能结合使用吗？**
<a name="pod-muti-nic-faqs-netpol"></a>

可以，您可以将 Kubernetes 网络策略与多 NIC 结合使用。Kubernetes 网络策略可限制进出容器组（pod）的网络流量。有关使用 VPC CNI 应用网络策略的更多信息，请参阅[通过 Kubernetes 网络策略限制容器组（pod）流量](cni-network-policy.md)。

### **13. EKS 自动模式下是否启用了多 NIC 支持？**
<a name="pod-muti-nic-faqs-auto-mode"></a>

EKS 自动模式集群不支持多 NIC。