

 **帮助改进此页面** 

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

# 使用 Kubernetes 网络策略限制容器组（pod）网络流量
<a name="cni-network-policy-configure"></a>

您可以使用 Kubernetes 网络策略来限制进出容器组（pod）的网络流量。有关更多信息，请参阅 Kubernetes 文档中的[网络策略](https://kubernetes.io/docs/concepts/services-networking/network-policies/)。

要使用此功能，您必须配置以下内容：

1. 在容器组（pod）启动时设置策略实施。您可以在 VPC CNI `DaemonSet` 的 `aws-node` 容器中执行此操作。

1. 为附加组件启用网络策略参数。

1. 将集群配置为使用 Kubernetes 网络策略

开始之前，请查看注意事项。有关更多信息，请参阅 [注意事项](cni-network-policy.md#cni-network-policy-considerations)。

## 先决条件
<a name="cni-network-policy-prereqs"></a>

以下是使用此功能的先决条件：

### 最低集群版本
<a name="cni-network-policy-minimum"></a>

现有 Amazon EKS 集群。要部署一个角色，请参阅[开始使用 Amazon EKS](getting-started.md)。该集群当前运行的必须是下表中列出的 Kubernetes 版本和平台版本之一。请注意，也支持所有比所列版本更高的 Kubernetes 和平台版本。您可以通过将以下命令中的 *my-cluster* 替换为集群名称，然后运行修改后的命令来检查当前的 Kubernetes 版本：

```
aws eks describe-cluster --name my-cluster --query cluster.version --output text
```


| Kubernetes 版本 | 平台版本 | 
| --- | --- | 
|   `1.27.4`   |   `eks.5`   | 
|   `1.26.7`   |   `eks.6`   | 

### 最低 Amazon CNI 版本
<a name="cni-network-policy-minimum-vpc"></a>

要同时创建标准 Kubernetes 网络策略和管理员网络策略，您需要运行 `1.21` 版的 VPC CNI 插件。您可以使用以下命令查看当前使用的版本。

```
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
```

如果您的版本低于 `1.21`，请查看 [更新 Amazon VPC CNI（Amazon EKS 附加组件）](vpc-add-on-update.md) 将版本升级到 `1.21` 版本或更高版本。

### 最低 Amazon 内核版本
<a name="cni-network-policy-minimum-linux"></a>

您的节点必须具有 Linux 内核版本 `5.10` 或更高版本。您可以使用 `uname -r` 检查您的内核版本。如果您使用的是最新版本的 Amazon EKS 优化 Amazon Linux、Amazon EKS 优化版加速型 Amazon Linux AMI 和 Bottlerocket AMI，则已拥有所需的内核版本。

Amazon EKS 优化加速的 Amazon Linux AMI 版本 `v20231116`，或更高版本拥有内核版本 `5.10`。

## 第 1 步：在容器组（pod）启动时设置策略实施
<a name="cni-network-policy-configure-policy"></a>

适用于 Kubernetes 的 Amazon VPC CNI 插件为容器组（pod）配置网络策略，同时进行容器组（pod）预置。在为新的容器组（pod）配置所有策略之前，新的容器组（pod）中的容器将从*默认允许策略*开始。这称为*标准模式*。默认允许策略意味着允许所有进出新容器组（pod）的入口和出口流量。例如，在使用生效的策略更新新的容器组之前，容器组不会强制执行任何防火墙规则（允许所有流量）。

将 `NETWORK_POLICY_ENFORCING_MODE` 变量设置为 `strict` 后，使用 VPC CNI 的容器组（pod）从*默认拒绝策略*开始，然后将配置策略。这称为*严格模式*。在严格模式下，您必须为集群中容器组（pod）需要访问的每个端点制定网络策略。请注意，此要求适用于 CoreDNS 容器组（pod）。未为带有主机网络的容器组（pod）配置默认拒绝策略。

您可以通过在 VPC CNI `DaemonSet` 的 `aws-node` 容器中将环境变量 `NETWORK_POLICY_ENFORCING_MODE` 设置为 `strict` 来更改此默认网络策略。

```
env:
  - name: NETWORK_POLICY_ENFORCING_MODE
    value: "strict"
```

## 第 2 步：为附加组件启用网络策略参数
<a name="enable-network-policy-parameter"></a>

默认情况下，网络策略功能使用节点上的端口 `8162` 获取指标。此外，该功能还使用端口 `8163` 进行运行状况探测。如果您在需要使用这些端口的节点或 Pod 内运行其他应用程序，则该应用程序将无法运行。在 VPC CNI `v1.14.1` 版或更高版本中，您可以更改这些端口。

要为附加组件启用网络策略参数，请使用以下程序。

### AWS 管理控制台
<a name="cni-network-policy-console"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。

1. 选择**附加组件**选项卡。

1. 选择附加组件框右上角的框，然后选择 **Edit**（编辑）。

1. 在**配置 `Amazon VPC CNI`** 页面上：

   1. 在**版本**列表中选择 `v1.14.0-eksbuild.3` 或更高版本。

   1. 展开**可选配置设置**。

   1. 在**配置值**中输入 JSON 键 `"enableNetworkPolicy":` 和值 `"true"`。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据，请用大括号 `{ }` 将键和值括起来。

      以下示例启用了网络策略功能，并将指标和运行状况探测设置为默认端口号：

      ```
      {
          "enableNetworkPolicy": "true",
          "nodeAgent": {
              "healthProbeBindAddr": "8163",
              "metricsBindAddr": "8162"
          }
      }
      ```

### Helm
<a name="cni-network-helm"></a>

如果已通过 `helm` 安装适用于 Kubernetes 的 Amazon VPC CNI 插件，则可以更新配置以更改端口。

1. 运行以下命令以更改端口。分别在键 `nodeAgent.metricsBindAddr` 或键 `nodeAgent.healthProbeBindAddr` 的值中设置端口号。

   ```
   helm upgrade --set nodeAgent.metricsBindAddr=8162 --set nodeAgent.healthProbeBindAddr=8163 aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

### kubectl
<a name="cni-network-policy-kubectl"></a>

1. 在编辑器中打开 `aws-node` `DaemonSet`。

   ```
   kubectl edit daemonset -n kube-system aws-node
   ```

1. 在 VPC CNI `aws-node` 守护程序集清单中 `aws-network-policy-agent` 容器的 `args:` 中，替换以下命令参数中的端口号。

   ```
       - args:
               - --metrics-bind-addr=:8162
               - --health-probe-bind-addr=:8163
   ```

## 步骤 3：将集群配置为使用 Kubernetes 网络策略
<a name="cni-network-policy-setup"></a>

您可以为 Amazon EKS 附加组件或自行管理的附加组件设置此项。

### Amazon EKS 附加组件
<a name="cni-network-policy-setup-procedure-add-on"></a>

使用 AWS CLI，您可以通过运行以下命令将集群配置为使用 Kubernetes 网络策略。将 `my-cluster` 替换为集群的名称，并将 IAM 角色 ARN 替换为您正在使用的角色。

```
aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.14.0-eksbuild.3 \
    --service-account-role-arn arn:aws:iam::123456789012:role/AmazonEKSVPCCNIRole \
    --resolve-conflicts PRESERVE --configuration-values '{"enableNetworkPolicy": "true"}'
```

要使用 AWS 管理控制台配置此项，请按以下步骤操作：

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后选择要为其配置 Amazon VPC CNI 附加组件的集群名称。

1. 选择**附加组件**选项卡。

1. 选择附加组件框右上角的框，然后选择 **Edit**（编辑）。

1. 在**配置 `Amazon VPC CNI`** 页面上：

   1. 在**版本**列表中选择 `v1.14.0-eksbuild.3` 或更高版本。

   1. 展开**可选配置设置**。

   1. 在**配置值**中输入 JSON 键 `"enableNetworkPolicy":` 和值 `"true"`。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据，请用大括号 `{ }` 将键和值括起来。以下示例显示网络策略已启用：

      ```
      { "enableNetworkPolicy": "true" }
      ```

      下面的屏幕截图为此场景的一个示例。  
![\[<shared id="consolelong"/> 在可选配置中显示带有网络策略的 VPC CNI 附加组件。\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/console-cni-config-network-policy.png)

### 自主管理的附加组件
<a name="cni-network-policy-setup-procedure-self-managed-add-on"></a>

如果已通过 `helm` 安装适用于 Kubernetes 的 Amazon VPC CNI 插件，则可以更新配置以启用网络策略。

1. 运行以下命令以启用网络策略。

   ```
   helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

1. 在编辑器中打开 `amazon-vpc-cni` `ConfigMap`。

   ```
   kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
   ```

1. 将以下行添加到 `ConfigMap` 中的 `data`。

   ```
   enable-network-policy-controller: "true"
   ```

   添加该行后，您的 `ConfigMap` 应该看起来像下面的示例。

   ```
   apiVersion: v1
    kind: ConfigMap
    metadata:
     name: amazon-vpc-cni
     namespace: kube-system
    data:
     enable-network-policy-controller: "true"
   ```

1. 在编辑器中打开 `aws-node` `DaemonSet`。

   ```
   kubectl edit daemonset -n kube-system aws-node
   ```

   1. 在 VPC CNI `aws-node` 守护程序集清单中 `aws-network-policy-agent` 容器的 `args:` 中，将命令参数 `--enable-network-policy=false` 中的 `false` 替换为 `true`。

      ```
           - args:
              - --enable-network-policy=true
      ```

## 步骤 4：后续步骤
<a name="cni-network-policy-setup-procedure-confirm"></a>

完成配置后，确认 `aws-node` 容器组（pod）正在您的集群上运行。

```
kubectl get pods -n kube-system | grep 'aws-node\|amazon'
```

示例输出如下。

```
aws-node-gmqp7                                          2/2     Running   1 (24h ago)   24h
aws-node-prnsh                                          2/2     Running   1 (24h ago)   24h
```

版本 `1.14` 及更高版本的 `aws-node` 容器组中有 2 个容器。在以前的版本中，如果禁用网络策略，则 `aws-node` 容器组（pod）中只有 1 个容器。

您现在可以将 Kubernetes 网络策略部署到集群。

要实施 Kubernetes 网络策略，您可以创建 Kubernetes `NetworkPolicy` 或 `ClusterNetworkPolicy` 对象并将其部署到集群。`NetworkPolicy` 对象的范围限定为命名空间，而 `ClusterNetworkPolicy` 对象的范围可限定为整个集群或多个命名空间。您可以实施策略，根据标签选择器、命名空间和 IP 地址范围来允许或拒绝容器组（pod）之间的流量。有关创建 `NetworkPolicy` 对象的更多信息，请参阅 Kubernetes 文档中的[网络策略](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)。

Kubernetes `NetworkPolicy` 对象的执行是使用 Extended Berkeley Packet Filter（eBPF）实施的。与基于 `iptables` 的实施相比，它具有更低的延迟和性能，包括降低 CPU 利用率和避免顺序查找。此外，eBPF 探测器还可以访问上下文丰富的数据，帮助调试复杂的内核级问题并提高可观测性。Amazon EKS 支持基于 eBPF 的导出程序，该导出程序利用探测器记录每个节点上的策略结果，并将数据导出到外部日志收集器以帮助调试。有关更多信息，请参阅 [eBPF 文档](https://ebpf.io/what-is-ebpf/#what-is-ebpf)。