

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Kubernetes 網路政策限制 Pod 流量
<a name="cni-network-policy"></a>

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

根據預設，Kubernetes 中沒有任何限制施加於 IP 位址、連接埠，或叢集中任何 Pod 之間或您的 Pod 與任何其他網路中的資源之間的連結。您可以使用 Kubernetes *網路政策*來限制往返 Pod 之間的網路流量。如需詳細資訊，請參閱 Kubernetes 文件的[網路政策](https://kubernetes.io/docs/concepts/services-networking/network-policies/)。

## 標準網路政策
<a name="_standard_network_policy"></a>

您可以使用 標準`NetworkPolicy`來分割叢集中的 pod-to-pod 流量。這些網路政策會在 OSI 網路模型的第 3 層和第 4 層運作，可讓您控制 Amazon EKS 叢集內 IP 地址或連接埠層級的流量流程。標準網路政策的範圍是命名空間層級。

### 使用案例
<a name="_use_cases"></a>
+ 分割工作負載之間的網路流量，以確保只有相關的應用程式可以互相通訊。
+ 使用 政策在命名空間層級隔離租用戶，以強制執行網路分離。

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

在下面的政策中，來自*太陽*命名空間中 *Webapp* 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 連接埠上`moon`命名空間`role: frontend`中具有 標籤的 Pod `8080` 
+ 允許流量：具有標籤角色的 Pod：TCP 連接埠`stars`命名空間中的前端 `8080` 
+ 封鎖流量：來自 Pod `webapp` 的所有其他傳出流量會隱含拒絕

## 管理員 （或叢集） 網路政策
<a name="_admin_or_cluster_network_policy"></a>

![EKS 網路政策評估順序的虛構](http://docs.aws.amazon.com/zh_tw/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 外掛程式將 Kubernetes 專用 Amazon VPC CNI 外掛程式網路政策套用至您的叢集時，您只能將這些政策套用至 Amazon EC2 Linux 節點。您無法將這些政策套用至 Fargate 或 Windows 節點。
+ 網路政策只會套用 `IPv4` 或 `IPv6` 位址，但不能同時套用兩者。在 `IPv4` 叢集中，VPC CNI 會將 `IPv4` 位址指派給 Pod 並套用 `IPv4` 政策。在 `IPv6` 叢集中，VPC CNI 會將 `IPv6` 位址指派給 Pod 並套用 `IPv6` 政策。套用至 `IPv6` 叢集的任何 `IPv4` 網路政策規則都會遭到忽略。套用至 `IPv4` 叢集的任何 `IPv6` 網路政策規則都會遭到忽略。

 **網路政策** 
+ 網路政策僅會套用至屬於部署一部分的 Pod。沒有 `metadata.ownerReferences` 集合的獨立 Pod 無法套用網路政策。
+ 您可以將多個網路政策套用至相同的 Pod。當設定了兩個以上選取相同 Pod 的政策，所有政策皆會套用至 Pod。
+ 在所有網路政策中，單一 IP 位址範圍 (CIDR) 的連接埠和通訊協定組合數目上限為 24。選取器，如 `namespaceSelector` 解析為一或多個 CIDRs。如果多個選擇器解析為單一 CIDR，或者您在相同或不同的網路政策中多次指定相同的直接 CIDR，這些都會計入此限制。
+ 對於任何一種您的 Kubernetes 服務，服務連接埠必須與容器連接埠相同。如果您使用的是已命名連接埠，請也要在服務規格中使用相同的名稱。

 **管理員網路政策** 

1.  **管理員層政策 （先評估）**：所有管理員層 ClusterNetworkPolicies 都會在任何其他政策之前進行評估。在管理員層中，政策會依優先順序處理 （優先順序最低的數字優先）。動作類型會決定接下來會發生的情況。
   +  **拒絕動作 （最高優先順序）**：當具有拒絕動作的管理員政策符合流量時，無論任何其他政策為何，都會立即封鎖該流量。不會處理其他 ClusterNetworkPolicy 或 NetworkPolicy 規則。這可確保命名空間層級政策不會覆寫整個組織的安全控制。
   +  **允許動作**：評估拒絕規則之後，使用允許動作的管理員政策會依優先順序 （優先順序最低的數字優先） 處理。當允許動作相符時，系統會接受流量，而不會進行進一步的政策評估。這些政策可以根據標籤選擇器授予多個命名空間的存取權，從而集中控制哪些工作負載可以存取特定資源。
   +  **傳遞動作**：在管理員層政策中傳遞動作，將決策委派給較低的層。當流量符合通過規則時，評估會略過該流量的所有剩餘管理員層規則，並直接進入 NetworkPolicy 層。這可讓管理員將特定流量模式的控制明確委派給應用程式團隊。例如，您可以使用傳遞規則將命名空間內流量管理委派給命名空間管理員，同時對外部存取維持嚴格的控制。

1.  **網路政策層**：如果沒有管理員層政策與拒絕或允許相符，或者如果通過動作相符，則會評估命名空間範圍的 NetworkPolicy 資源。這些政策可在個別命名空間內提供精細的控制，並由應用程式團隊管理。命名空間範圍政策只能比管理員政策更嚴格。他們無法覆寫管理員政策的拒絕決策，但可以進一步限制管理員政策允許或傳遞的流量。

1.  **基準層管理員政策**：如果沒有管理員或命名空間範圍的政策符合流量，則會評估基準層 ClusterNetworkPolicies。這些提供可由命名空間範圍政策覆寫的預設安全狀態，允許管理員設定整個組織的預設值，同時為團隊提供視需要自訂的彈性。基準政策會依優先順序 （優先順序最低的數字優先） 進行評估。

1.  **預設拒絕 （如果沒有政策相符）**：此deny-by-default行為可確保只允許明確允許的連線，並維持強大的安全狀態。

 **移轉** 
+ 如果您的叢集目前正在使用第三方解決方案來管理 Kubernetes 網路政策，您可以搭配 Kubernetes 專用 Amazon VPC CNI 外掛程式來使用那些相同的政策。然而，您必須移除現有的解決方案，如此才不會管理相同的政策。

**警告**  
我們建議在移除網路政策解決方案後，更換所有曾套用該網路政策解決方案的節點。這是因為如果解決方案的 Pod 突然退出，流量規則可能會殘留。

 **安裝** 
+ 網路政策功能會建立且需要稱為 `policyendpoints.networking.k8s.aws` 的 `PolicyEndpoint` 自訂資源定義 (CRD)。自訂資源的 `PolicyEndpoint` 物件是由 Amazon EKS 管理。您不應修改或刪除這些資源。
+ 如果您執行使用執行個體角色 IAM 憑證的 Pod 或連線至 EC2 IMDS，請小心檢查是否有會封鎖 EC2 IMDS 存取的網路政策。您可能需要新增網路政策以允許 EC2 IMDS 的存取權。如需詳細資訊，請參閱《Amazon EC2 使用者指南》中的[執行個體中繼資料和使用者資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。

  使用*服務帳戶的 IAM 角色*或 *EKS Pod 身分識別*的 Pod 不會存取 EC2 IMDS。
+ Kubernetes 專用 Amazon VPC CNI 外掛程式不會將網路政策套用至每個 Pod 的其他網路介面，而只會套用每個 Pod 的主要介面 (`eth0`)。這會影響下列架構：
  +  `ENABLE_V4_EGRESS` 變數設定為 `true` 的 `IPv6` Pod。此變數可讓 `IPv4` 輸出功能將 IPv6 Pod 連線到 `IPv4` 端點，例如叢集外部的端點。`IPv4` 輸出功能的運作方式是使用本機迴路 IPv4 地址建立額外的網路介面。
  + 使用鏈結的網絡外掛程式（例如 Multus）時。由於這些外掛程式會將網路介面新增至每個 Pod，因此網路政策不會套用至鏈結的網路外掛程式。