

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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`   | 

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

若要建立標準 Kubernetes 網路政策和管理網路政策，您需要執行 VPC CNI 外掛程式`1.21`的版本。您可以使用下列命令來查看您目前擁有哪個版本。

```
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` 或更高版本。

### 最低 Linux 核心版本
<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 的所有輸入和輸出流量。例如，在使用作用中的政策更新新 Pod 之前，Pod 不會強制執行任何防火牆規則 (允許所有流量)。

將 `NETWORK_POLICY_ENFORCING_MODE` 變數設定為 `strict` 時，使用 VPC CNI 的 Pod 會從*預設拒絕政策*開始，然後設定政策。這稱為*嚴格模式*。在嚴格模式下，您必須為 Pod 需要存取的叢集中的每個端點都設定網路政策。請注意，此要求適用於 CoreDNS Pod。預設拒絕政策不會針對具有主機聯網的 Pod 進行設定。

您可以透過在 VPC CNI `DaemonSet` 的 `aws-node` 容器中將環境變數 `strict` 設定為 `NETWORK_POLICY_ENFORCING_MODE` 來變更預設網路政策。

```
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` daemonset 清單檔案的 `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_tw/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` daemonset 清單檔案的 `aws-network-policy-agent` 容器，以 `true` 取代 `args:` 中命令引數 `--enable-network-policy=false` 裡的 `false`。

      ```
           - 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` Pod 中有 2 個容器。在先前版本中，如果網路政策已停用，則 `aws-node` Pod 中只會有單一容器。

您現在可以將 Kubernetes 網路政策部署到您叢集。

若要實作 Kubernetes 網路政策，您可以建立 Kubernetes `NetworkPolicy`或`ClusterNetworkPolicy`物件並將其部署到您的叢集。 `NetworkPolicy` 物件的範圍是命名空間，而`ClusterNetworkPolicy`物件的範圍可以是整個叢集或多個命名空間。您實施政策以允許或拒絕根據標籤選取工具、命名空間及 IP 位址範圍的 Pod 之間的流量。如需有關建立 `NetworkPolicy` 物件的詳細資訊，請參閱 Kubernetes 文件中的[網路政策](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)。

Kubernetes `NetworkPolicy` 物件的強制執行是使用延伸式 Berkeley 封包篩選 (eBPF) 實作的。相對於 `iptables` 型實作，它提供了更低的延遲和效能特性，包含降低 CPU 使用率與避免循序查詢。此外，eBPF 探查可讓您存取內容豐富的資料，協助除錯複雜的核心層級問題並改善可觀測性。Amazon EKS 支援 eBPF 型匯出工具，此工具利用探查來記錄每個節點上的政策結果，並將資料匯出到外部日誌收集器以協助除錯。如需詳細資訊，請參閱 [eBPF 文件](https://ebpf.io/what-is-ebpf/#what-is-ebpf)。