

 **帮助改进此页面** 

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

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

## 概述
<a name="_overview"></a>

默认情况下，Kubernetes 对集群中任何容器组（pod）之间或容器组（pod）与任何其他网络中的资源之间的 IP 地址、端口或连接没有限制。可以使用 Kubernetes *网络策略*来限制进出容器组（pod）的网络流量。有关更多信息，请参阅 Kubernetes 文档中的[网络策略](https://kubernetes.io/docs/concepts/services-networking/network-policies/)。

## 标准网络策略
<a name="_standard_network_policy"></a>

您可以使用 `NetworkPolicy` 标准在集群中分段容器组（pod）间流量。这些网络策略在 OSI 网络模型的第 3 层和第 4 层上运行，让您能够控制 Amazon EKS 集群中 IP 地址或端口级别的流量。标准网络策略的范围限定为命名空间级别。

### 使用案例
<a name="_use_cases"></a>
+ 在工作负载之间对网络流量进行分段，确保只有相关的应用程序才能相互通信。
+ 使用策略在命名空间级别隔离租户，以强制执行网络分离。

### 示例
<a name="_example"></a>

在以下策略中，来自 *sun* 命名空间中的 *webappp*容器组（pod）的出口流量受到限制。

```
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: webapp-egress-policy
  namespace: sun
spec:
  podSelector:
    matchLabels:
      role: webapp
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          name: moon
      podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 8080
  - to:
    - namespaceSelector:
        matchLabels:
          name: stars
      podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 8080
```

该策略适用于 `sun` 命名空间中带有 `role: webapp` 标签的容器组（pod）。
+ 允许的流量：在 TCP 端口 `8080` 的 `moon` 命名空间中带有 `role: frontend` 标签的容器组（pod） 
+ 允许的流量：在 TCP 端口 `8080` 的 `stars` 命名空间中带有 role: frontend 标签的容器组（pod） 
+ 被阻止的流量：所有其他来自 `webapp` 容器组（pod）的出站流量都被隐式拒绝

## 管理员（或集群）网络策略
<a name="_admin_or_cluster_network_policy"></a>

![\[EKS 中的网络策略评估顺序示意图\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/evaluation-order.png)


您可以使用 `ClusterNetworkPolicy` 来强制执行适用于整个集群的网络安全标准。无需为每个命名空间重复定义和维护不同的策略，而是可以使用单个策略来集中管理集群中不同工作负载的网络访问权限控制，无论其命名空间如何。

### 使用案例
<a name="_use_cases_2"></a>
+ 集中管理 EKS 集群中所有（或部分）工作负载的网络访问权限控制。
+ 定义整个集群的默认网络安全状况。
+ 以更具运营效率的方式，将组织安全标准扩展到集群范围。

### 示例
<a name="_example_2"></a>

在以下策略中，您可以明确阻止来自其他命名空间的集群流量，以防止网络访问敏感的工作负载命名空间。

```
apiVersion: networking.k8s.aws/v1alpha1
kind: ClusterNetworkPolicy
metadata:
  name: protect-sensitive-workload
spec:
  tier: Admin
  priority: 10
  subject:
    namespaces:
      matchLabels:
        kubernetes.io/metadata.name: earth
  ingress:
    - action: Deny
      from:
      - namespaces:
          matchLabels: {} # Match all namespaces.
      name: select-all-deny-all
```

## 重要提示
<a name="_important_notes"></a>

以下配置支持适用于 Kubernetes 的 Amazon VPC CNI 插件中的网络策略。
+ 适用于标准和管理员网络策略的 Amazon VPC CNI 插件 1.21.0 版本（或更高版本）。
+ 为 `IPv4` 或 `IPv6` 地址配置的集群。
+ 您可以将网络策略与[容器组（pod）的安全组](security-groups-for-pods.md)结合使用。通过网络策略，您可以控制集群内的所有通信。借助容器组（pod）的安全组，您可以控制从容器组（pod）中的应用程序对 AWS 服务的访问。
+ 您可以将网络策略与*自定义网络*和*前缀委派*结合使用。

## 注意事项
<a name="cni-network-policy-considerations"></a>

 **架构** 
+ 当使用适用于 Kubernetes 的 Amazon VPC CNI 插件，将其网络策略应用于集群时，您只能将策略应用于 Amazon EC2 Linux 节点。无法将策略应用于 Fargate 或 Windows 节点。
+ 网络策略仅适用于其中一个 `IPv4` 或 `IPv6` 地址，但不适用于两者。在 `IPv4` 集群中，VPC CNI 为容器组（pod）分配 `IPv4` 地址并应用 `IPv4` 策略。在 `IPv6` 集群中，VPC CNI 为容器组（pod）分配 `IPv6` 地址并应用 `IPv6` 策略。系统将忽略应用于 `IPv6` 集群的任何 `IPv4` 网络策略规则。系统将忽略应用于 `IPv4` 集群的任何 `IPv6` 网络策略规则。

 **网络策略** 
+ 网络策略仅适用于属于部署构成部分的容器组（pod）。不能将网络策略应用于未设置 `metadata.ownerReferences` 的独立容器组（pod）。
+ 可以对同一容器组（pod）应用多个网络策略。当配置两个或多个选择同一容器组（pod）的策略时，所有策略都将应用于该容器组（pod）。
+ 在所有网络策略中，单个 IP 地址范围（CIDR）的最大端口和协议组合数量为 24 个。`namespaceSelector` 等选择器会解析为一个或多个 CIDR。如果多个选择器解析为单个 CIDR，或者您在相同或不同的网络策略中多次指定了相同的直接 CIDR，这些都会计入此限制。
+ 对于任何 Kubernetes 服务，服务端口必须与容器端口相同。如果您使用的是命名端口，也请在服务规范中使用相同的名称。

 **管理员网络策略** 

1.  **管理员层策略（先进行评估）**：首先对所有管理员层 ClusterNetworkPolicies 进行评估，然后再评估任何其他策略。在管理员层中，策略按优先级顺序处理（优先级序号最小者优先）。操作类型决定了接下来的操作。
   +  **Deny 操作（优先级最高）**：当具有 Deny 操作的管理员策略与流量匹配时，无论采用何种其他策略，该流量都会立即被阻止。不再处理其他 ClusterNetworkPolicy 或 NetworkPolicy 规则。这样可以确保组织范围的安全控制不会被命名空间级别的策略所覆盖。
   +  **Allow 操作**：评估 Deny 规则后，将按优先级顺序处理具有 Allow 操作的管理员策略（优先级序号最小者优先）。当 Allow 操作匹配时，流量将被接受，并且不再进行进一步的策略评估。这些策略可以根据标签选择器授予跨多个命名空间的访问权限，从而集中控制哪些工作负载可以访问特定资源。
   +  **Pass 操作**：管理员层策略中的 Pass 操作将决策委托给较低层级。当流量与 Pass 规则匹配时，评估将跳过该流量的所有剩余管理层规则，直接进入 NetworkPolicy 层。这允许管理员将某些流量模式的控制权明确委托给应用程序团队。例如，您可以使用 Pass 规则将命名空间内的流量管理委托给命名空间管理员，同时保持对外部访问权限的严格控制。

1.  **网络策略层**：如果没有与 Deny 或 Allow 匹配的管理员层策略，或者匹配了 Pass 操作，则接下来将评估命名空间范围的 NetworkPolicy 资源。这些策略在各个命名空间内提供精细的控制，并由应用程序团队管理。命名空间范围的策略只能比管理员策略更严格。它们无法覆盖管理员策略的 Deny 决策，但可以进一步限制管理员策略允许或通过的流量。

1.  **基准层管理员策略**：如果没有管理员或命名空间范围的策略与流量匹配，则会评估基准层 ClusterNetworkPolicies。它们提供了可以被命名空间范围的策略覆盖的默认安全状况，允许管理员设置组织范围的默认值，同时让团队可以灵活地根据需要进行自定义。基准策略按优先级顺序进行评估（优先级序号最小者优先）。

1.  **默认拒绝（如果没有匹配的策略）**：这种默认拒绝行为可确保仅允许明确允许的连接，从而保持稳固的安全状况。

 **迁移** 
+ 如果集群当前使用第三方解决方案来管理 Kubernetes 网络策略，则可将这些策略与适用于 Kubernetes 的 Amazon VPC CNI 插件结合使用。但是，您必须删除现有的解决方案，使其不再管理相同的策略。

**警告**  
建议您在删除网络策略解决方案后，替换所有应用过该网络策略解决方案的节点。这是因为如果解决方案的某个容器组（pod）突然退出，其流量规则可能会遗留下来。

 **安装**。
+ 网络策略功能创建并需要一个名为 `policyendpoints.networking.k8s.aws` 的 `PolicyEndpoint` 自定义资源定义（CRD）。自定义资源的 `PolicyEndpoint` 对象由 Amazon EKS 管理。您不应该修改或删除这些资源。
+ 如果您运行的容器组（pod）使用实例角色 IAM 凭证或连接到 EC2 IMDS，请注意检查是否存在会阻止访问 EC2 IMDS 的网络策略。您可能需要添加网络策略以允许访问 EC2 IMDS。有关更多信息，请参阅 Amazon EC2 用户指南中的[实例元数据和用户数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。

  *对服务账户使用 IAM 角色*或使用 *EKS 容器组身份*的容器组（pod）无法访问 EC2 IMDS。
+ 适用于 Kubernetes 的 Amazon VPC CNI 插件不会将网络策略应用于每个容器组（pod）的其他网络接口，只会应用于每个容器组（pod）的主接口 (`eth0`)。这会影响以下架构：
  +  `ENABLE_V4_EGRESS` 变量设置为 `true` 的 `IPv6` 容器组。此变量使 `IPv4` 出口功能能够将 IPv6 容器组连接到 `IPv4` 端点，例如集群外部的端点。`IPv4` 出口功能的工作原理是使用本地环回 IPv4 地址创建一个额外的网络接口。
  + 使用诸如 Multus 之类的链式网络插件时。由于这些插件为每个容器组（pod）添加了网络接口，因此网络策略不适用于链式网络插件。