

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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，因此網路政策不會套用至鏈結的網路外掛程式。

# 使用 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)。

# 停用 Amazon EKS Pod 網路流量的 Kubernetes 網路政策
<a name="network-policy-disable"></a>

停用 Kubernetes 網路政策，以停止限制 Amazon EKS Pod 網路流量

1. 列出所有 Kubernetes 網路政策。

   ```
   kubectl get netpol -A
   ```

1. 刪除每個 Kubernetes 網路政策。您必須先刪除所有網路政策，才能停用網路政策。

   ```
   kubectl delete netpol <policy-name>
   ```

1. 在編輯器中開啟 aws-node DaemonSet。

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

1. 在 VPC CNI `aws-node` daemonset 清單檔案的 `aws-network-policy-agent` 容器，以 `false` 取代 `args:` 中命令引數 `--enable-network-policy=true` 裡的 `true`。

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

# 對 Amazon EKS 的 Kubernetes 網路政策進行故障診斷
<a name="network-policies-troubleshooting"></a>

這是 Amazon VPC CNI 的網路政策功能的故障診斷指南。

本指南涵蓋：
+ 安裝資訊、CRD 和 RBAC 許可 [新的 `policyendpoints` CRD 和許可](#network-policies-troubleshooting-permissions) 
+ 診斷網路政策問題時要檢查的日誌 [網路政策日誌](#network-policies-troubleshooting-flowlogs) 
+ 執行 eBPF SDK 工具集以進行故障診斷
+ 已知問題與解決方案 [已知問題與解決方案](#network-policies-troubleshooting-known-issues) 

**注意**  
請注意，網路政策僅會套用至由 Kubernetes *部署*建立的 Pod。如需 VPC CNI 中網路政策的更多限制，請參閱 [考量事項](cni-network-policy.md#cni-network-policy-considerations)。

閱讀[網路政策日誌](#network-policies-troubleshooting-flowlogs)並透過執行來自 [eBPF SDK](#network-policies-ebpf-sdk) 的工具，藉此對使用網路政策的網路連線進行故障診斷與調查。

## 新的 `policyendpoints` CRD 和許可
<a name="network-policies-troubleshooting-permissions"></a>
+ CRD：`policyendpoints.networking.k8s.aws`
+ Kubernetes API：稱為 `v1.networking.k8s.io` 的 `apiservice` 
+ Kubernetes 資源：`Kind: NetworkPolicy`
+ RBAC：稱為 `aws-node` 的 `ClusterRole` (VPC CNI)、稱為 `eks:network-policy-controller` 的 `ClusterRole` (EKS 叢集控制平面中的網路政策控制器)

對於網路政策，VPC CNI 會建立稱為 `policyendpoints.networking.k8s.aws` 的新 `CustomResourceDefinition` (CRD)。VPC CNI 必須擁有許可，才能建立 CRD，並為此 CRD 及由 VPC CNI (`eniconfigs.crd.k8s.amazonaws.com`) 安裝的其他 CRD 建立 CustomResources (CR)。這兩個 CRD 都可以在 GitHub 上的 [`crds.yaml` 檔案](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/charts/aws-vpc-cni/crds/customresourcedefinition.yaml)中找到。具體而言，VPC CNI 必須具有 `policyendpoints` 的 "get"、"list" 和 "watch" 動詞許可。

Kubernetes *網路政策*是稱為 `v1.networking.k8s.io` 的 `apiservice` 一部分，並且這是您的政策 YAML 檔案中的 `apiversion: networking.k8s.io/v1`。VPC CNI `DaemonSet` 必須擁有許可才能使用 Kubernetes API 的這一部分。

VPC CNI 許可位於稱為 `aws-node` 的 `ClusterRole` 中。請注意，`ClusterRole` 物件不會在命名空間中進行分組。下面顯示了叢集的 `aws-node`：

```
kubectl get clusterrole aws-node -o yaml
```

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/instance: aws-vpc-cni
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: aws-node
    app.kubernetes.io/version: v1.19.4
    helm.sh/chart: aws-vpc-cni-1.19.4
    k8s-app: aws-node
  name: aws-node
rules:
- apiGroups:
  - crd.k8s.amazonaws.com
  resources:
  - eniconfigs
  verbs:
  - list
  - watch
  - get
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - list
  - watch
  - get
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - list
  - watch
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
  - get
- apiGroups:
  - ""
  - events.k8s.io
  resources:
  - events
  verbs:
  - create
  - patch
  - list
- apiGroups:
  - networking.k8s.aws
  resources:
  - policyendpoints
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.aws
  resources:
  - policyendpoints/status
  verbs:
  - get
- apiGroups:
  - vpcresources.k8s.aws
  resources:
  - cninodes
  verbs:
  - get
  - list
  - watch
  - patch
```

此外，新的控制器會在每個 EKS 叢集的控制平面中執行。控制器會使用稱為 `eks:network-policy-controller` 的 `ClusterRole` 的許可。下面顯示了叢集的 `eks:network-policy-controller`：

```
kubectl get clusterrole eks:network-policy-controller -o yaml
```

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/name: amazon-network-policy-controller-k8s
  name: eks:network-policy-controller
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.aws
  resources:
  - policyendpoints
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - networking.k8s.aws
  resources:
  - policyendpoints/finalizers
  verbs:
  - update
- apiGroups:
  - networking.k8s.aws
  resources:
  - policyendpoints/status
  verbs:
  - get
  - patch
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  verbs:
  - get
  - list
  - patch
  - update
  - watch
```

## 網路政策日誌
<a name="network-policies-troubleshooting-flowlogs"></a>

VPC CNI 作出的關於網路政策是否允許或拒絕連線的每項決策，都會記錄在*流程日誌*中。每個節點上的網路政策日誌均包含具有網路政策的每個 Pod 之流程日誌。網路政策日誌會儲存於 `/var/log/aws-routed-eni/network-policy-agent.log`。以下範例來自於 `network-policy-agent.log` 檔案：

```
{"level":"info","timestamp":"2023-05-30T16:05:32.573Z","logger":"ebpf-client","msg":"Flow Info: ","Src
IP":"192.168.87.155","Src Port":38971,"Dest IP":"64.6.160","Dest
Port":53,"Proto":"UDP","Verdict":"ACCEPT"}
```

根據預設，網路政策日誌已停用。若要啟用網路政策日誌，請遵循下列步驟：

**注意**  
網路政策日誌需要為 VPC CNI `aws-node` `DaemonSet` 資訊清單中的 `aws-network-policy-agent` 容器額外配備 1 個 vCPU。

### Amazon EKS 附加元件
<a name="cni-network-policy-flowlogs-addon"></a>

 ** 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 金鑰 `"nodeAgent":`，且值為具有**組態值**中的金鑰 `"enablePolicyEventLogs":` 與 `"true"` 的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用，並且網路政策日誌會傳送至 CloudWatch Logs：

      ```
      {
          "enableNetworkPolicy": "true",
          "nodeAgent": {
              "enablePolicyEventLogs": "true"
          }
      }
      ```

下列螢幕擷取畫面展示了案例的範例。

![\[顯示選用組態中具有網路政策的 VPC CNI 附加元件和 CloudWatch 日誌的 <shared id="consolelong"/>。\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/console-cni-config-network-policy-logs.png)


 AWS CLI  

1. 執行下列 AWS CLI 命令。將 `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 '{"nodeAgent": {"enablePolicyEventLogs": "true"}}'
   ```

### 自我管理附加元件
<a name="cni-network-policy-flowlogs-selfmanaged"></a>

Helm  
如果您已透過 `helm` 安裝 Kubernetes 專用 Amazon VPC CNI 外掛程式，您可以更新組態，以寫入網路政策日誌。  

1. 執行下列命令以啟用網路政策。

   ```
   helm upgrade --set nodeAgent.enablePolicyEventLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

kubectl  
如果您已透過 `kubectl` 安裝 Kubernetes 專用 Amazon VPC CNI 外掛程式，您可以更新組態，以寫入網路政策日誌。  

1. 在您的編輯器中開啟 `aws-node` `DaemonSet`。

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

1. 在 VPC CNI `aws-node` `DaemonSet` 資訊清單的 `aws-network-policy-agent` 容器，使用 `args:` 中命令引數 `--enable-policy-event-logs=false` 中的 `true` 取代 `false`。

   ```
        - args:
           - --enable-policy-event-logs=true
   ```

### 將網路政策日誌傳送到 Amazon CloudWatch Logs
<a name="network-policies-cloudwatchlogs"></a>

您可以使用 Amazon CloudWatch Logs 這一類服務來監控網路政策日誌。您可以使用下列方法將網路政策日誌傳送到 CloudWatch Logs。

若為 EKS 叢集，政策日誌會放置在 `/aws/eks/cluster-name/cluster/` 下；若為自我管理的 K8S 群集，日誌會放置在 `/aws/k8s-cluster/cluster/` 下。

#### 使用 Kubernetes 專用 Amazon VPC CNI 外掛程式傳送網路政策日誌
<a name="network-policies-cwl-agent"></a>

如果您啟用網路政策，系統會將第二個容器新增至*節點代理程式*的 `aws-node` Pod。此節點代理程式可以將網路政策日誌傳送到 CloudWatch Logs。

**注意**  
網路政策日誌僅會由節點代理程式傳送。其他由 VPC CNI 製作的日誌不包含在內。

##### 先決條件
<a name="cni-network-policy-cwl-agent-prereqs"></a>
+ 將下列許可作為一節或個別政策新增至您用於 VPC CNI 的 IAM 角色。

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "VisualEditor0",
              "Effect": "Allow",
              "Action": [
                  "logs:DescribeLogGroups",
                  "logs:CreateLogGroup",
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

##### Amazon EKS 附加元件
<a name="cni-network-policy-cwl-agent-addon"></a>

 ** 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 金鑰 `"nodeAgent":`，且值為具有**組態值**中的金鑰 `"enableCloudWatchLogs":` 與 `"true"` 的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用，並且日誌會傳送至 CloudWatch Logs：

      ```
      {
          "enableNetworkPolicy": "true",
          "nodeAgent": {
              "enablePolicyEventLogs": "true",
              "enableCloudWatchLogs": "true",
          }
      }
      ```
下列螢幕擷取畫面展示了案例的範例。

![\[顯示選用組態中具有網路政策的 VPC CNI 附加元件和 CloudWatch 日誌的 <shared id="consolelong"/>。\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/console-cni-config-network-policy-logs-cwl.png)


 ** AWS CLI**   

1. 執行下列 AWS CLI 命令。將 `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 '{"nodeAgent": {"enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true"}}'
   ```

##### 自我管理附加元件
<a name="cni-network-policy-cwl-agent-selfmanaged"></a>

 **Helm**   
如果您已透過 `helm` 安裝 Kubernetes 專用 Amazon VPC CNI 外掛程式，您可以更新組態，以傳送網路政策日誌至 CloudWatch 日誌。  

1. 執行下列命令以啟用網路政策日誌，並將其傳送至 CloudWatch Logs。

   ```
   helm upgrade --set nodeAgent.enablePolicyEventLogs=true --set nodeAgent.enableCloudWatchLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

 **kubectl**   

1. 在您的編輯器中開啟 `aws-node` `DaemonSet`。

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

1. 在 VPC CNI `aws-node` `DaemonSet` 資訊清單的 `aws-network-policy-agent` 容器，使用 `args:` 中的兩個命令引數 `--enable-policy-event-logs=false` 和 `--enable-cloudwatch-logs=false` 中的 `true` 取代 `false`。

   ```
        - args:
           - --enable-policy-event-logs=true
           - --enable-cloudwatch-logs=true
   ```

#### 透過 Fluent Bit `DaemonSet` 傳送網路政策日誌
<a name="network-policies-cwl-fluentbit"></a>

如果您正在 `DaemonSet` 使用 Fluent Bit 從節點傳送日誌，則可新增組態以便包括來自網路政策的網路政策日誌。您可以使用下列範例組態：

```
    [INPUT]
        Name              tail
        Tag               eksnp.*
        Path              /var/log/aws-routed-eni/network-policy-agent*.log
        Parser            json
        DB                /var/log/aws-routed-eni/flb_npagent.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10
```

## 已包含 eBPF SDK
<a name="network-policies-ebpf-sdk"></a>

Kubernetes 專用 Amazon VPC CNI 外掛程式會在節點上安裝 eBPF SDK 工具集。您可以使用 eBPF SDK 來找出網路政策的問題。例如，下列命令會列出目前在節點上執行的程式。

```
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
```

若要執行此命令，您可以使用任何方法連接到節點。

## 已知問題與解決方案
<a name="network-policies-troubleshooting-known-issues"></a>

下列各節說明 Amazon VPC CNI 網路政策功能及其解決方案的已知問題。

### 儘管 enable-policy-event-logs 設定為 false，但仍會產生網路政策日誌
<a name="network-policies-troubleshooting-policy-event-logs"></a>

 **問題**：即使 `enable-policy-event-logs` 設定為 `false`，EKS VPC CNI 也會產生網路政策日誌。

 **解決方案**：`enable-policy-event-logs` 設定僅會停用政策「決策」日誌，但不會停用所有網路政策代理程式記錄。GitHub 上的 [aws-network-policy-agent README](https://github.com/aws/aws-network-policy-agent/) 記載了這種行為。若要完全停用記錄，您可能需要調整其他記錄組態。

### 網路政策映射清除問題
<a name="network-policies-troubleshooting-map-cleanup"></a>

 **問題**：刪除 Pod 後，網路 `policyendpoint` 仍然存在並且無法清除的問題。

 **解決方案**：此問題是因 VPC CNI 附加元件版本 1.19.3-eksbuild.1 的問題所造成。更新至較新版本的 VPC CNI 附加元件來解決此問題。

### 未套用網路政策
<a name="network-policies-troubleshooting-policyendpoint"></a>

 **問題**：Amazon VPC CNI 外掛程式中已啟用網路政策功能，但網路政策未正確套用。

如果您建立網路政策 `kind: NetworkPolicy`，但其不會影響 Pod，請檢查政策端點物件是否在與 Pod 相同的命名空間中建立。如果命名空間中沒有 `policyendpoint` 物件，則網路政策控制器 (EKS 叢集的一部分) 無法為要套用的網路政策代理程式 (VPC CNI 的一部分) 建立網路政策規則。

 **解決方案**：解決方案是修正 VPC CNI (`ClusterRole`：`aws-node`) 和網路政策控制站 (`ClusterRole`：`eks:network-policy-controller`) 的許可，並在任何政策強制執行工具 (例如 Kyverno) 中允許這些動作。確保 Kyverno 政策不會封鎖 `policyendpoint` 物件的建立。如需了解 [新的 `policyendpoints` CRD 和許可](#network-policies-troubleshooting-permissions) 中的必要許可，請參閱上一節。

### 在嚴格模式下刪除政策後，Pod 不會返回預設拒絕狀態
<a name="network-policies-troubleshooting-strict-mode-fallback"></a>

 **問題**：在嚴格模式下啟用網路政策時，Pod 會從預設拒絕政策開始。套用政策後，允許流量到達指定的端點。不過，刪除政策時，Pod 不會返回預設拒絕狀態，而是進入預設允許狀態。

 **解決方案**：此問題已在 VPC CNI 1.19.3 版中進行修正，其中包括網路政策代理程式 1.2.0 版。修正後，在啟用嚴格模式的情況下，只要移除政策，Pod 即會如預期返回到預設拒絕狀態。

### Pod 啟動延遲的安全群組
<a name="network-policies-troubleshooting-sgfp-latency"></a>

 **問題**：在 EKS 中使用 Pod 的安全群組功能時，Pod 啟動延遲會增加。

 **解決方案**：延遲是因資源控制器中來自 `CreateNetworkInterface` API 上的 API 限流的速率限制所致，其中 VPC 資源控制器會用於為 Pod 建立分支 ENI。檢查您帳戶的此操作的 API 限制，並考慮視需要請求提高限制。

### 由於 vpc.amazonaws.com/pod-eni 不足而導致 FailedScheduling
<a name="network-policies-troubleshooting-insufficient-pod-eni"></a>

 **問題**：Pod 無法排程並出現錯誤：`FailedScheduling 2m53s (x28 over 137m) default-scheduler 0/5 nodes are available: 5 Insufficient vpc.amazonaws.com/pod-eni. preemption: 0/5 nodes are available: 5 No preemption victims found for incoming pod.`

 **解決方案**：與上一個問題一樣，將安全群組指派給 Pod 會增加 Pod 排程延遲，並且新增每個 ENI 的時間可能會超出 CNI 閾值，進而導致啟動 Pod 的失敗。這是使用 Pod 的安全群組時的預期行為。設計工作負載架構時，請考慮排程影響。

### IPAM 連線問題和分段錯誤
<a name="network-policies-troubleshooting-systemd-udev"></a>

 **問題**：出現多個錯誤，包括 IPAM 連線問題、限流請求和分段錯誤：
+  `Checking for IPAM connectivity …​` 
+  `Throttling request took 1.047064274s` 
+  `Retrying waiting for IPAM-D` 
+  `panic: runtime error: invalid memory address or nil pointer dereference` 

 **解決方案**：如果您在 AL2023 上安裝 `systemd-udev`，就會出現此問題，因為該檔案會根據中斷政策重新寫入。當更新至具有更新的套件的不同 `releasever` 或手動更新套件本身時，可能會發生這種情況。避免在 AL2023 節點上安裝或更新 `systemd-udev`。

### 「無法依名稱尋找裝置」錯誤
<a name="network-policies-troubleshooting-device-not-found"></a>

 **問題**：錯誤訊息：`{"level":"error","ts":"2025-02-05T20:27:18.669Z","caller":"ebpf/bpf_client.go:578","msg":"failed to find device by name eni9ea69618bf0: %!w(netlink.LinkNotFoundError={0xc000115310})"}`

 **解決方案**：此問題已在最新版本的 Amazon VPC CNI 網路政策代理程式 (v1.2.0) 中進行識別和修正。更新至最新版本的 VPC CNI 來解決此問題。

### Multus CNI 映像中的 CVE 漏洞
<a name="network-policies-troubleshooting-cve-multus"></a>

 **問題**：增強型 EKS ImageScan CVE 報告可識別 Multus CNI 映像版本 v4.1.4-eksbuild.2\$1thick 中的漏洞。

 **解決方案**：更新至新版本的 Multus CNI 映像和新的網路政策控制器映像，它們沒有任何漏洞。可以更新掃描器，以解決先前版本中找到的漏洞。

### 日誌中的流程資訊 DENY 判定結果
<a name="network-policies-troubleshooting-flow-info-deny"></a>

 **問題**：網路政策日誌顯示 DENY 判定結果：`{"level":"info","ts":"2024-11-25T13:34:24.808Z","logger":"ebpf-client","caller":"events/events.go:193","msg":"Flow Info: ","Src IP":"","Src Port":9096,"Dest IP":"","Dest Port":56830,"Proto":"TCP","Verdict":"DENY"}`

 **解決方案**：此問題已在新版本的網路政策控制器中解決。更新至最新的 EKS 平台版本，以解決記錄問題。

### 從 Calico 移轉後的 Pod 至 pod 通訊問題
<a name="network-policies-troubleshooting-calico-migration"></a>

 **問題**：將 EKS 叢集升級至版本 1.30 並針對網路政策從 Calico 切換到 Amazon VPC CNI 後，套用網路政策時 Pod 至 Pod 通訊即會失敗。刪除網路政策時，即會還原通訊。

 **解決方案**：VPC CNI 中的網路政策代理程式指定的連接埠數量無法與 Calico 相比。請在網路政策中改用連接埠範圍。網路政策中每個通訊協定`ingress:`或`egress:`選擇器中每個通訊協定的唯一連接埠組合數目上限為 24。使用連接埠範圍來減少唯一的連接埠的數量，並避免此限制。

### 網路政策代理程式不支援獨立 Pod
<a name="network-policies-troubleshooting-standalone-pods"></a>

 **問題**：套用至獨立 Pod 的網路政策可能會有不一致的行為。

 **解決方案**：網路政策代理程式目前僅支援部署為 deployment/replicaset 一部分的 Pod。如果將網路政策套用至獨立 Pod，則行為中可能會出現一些不一致。此頁面頂端、[考量事項](cni-network-policy.md#cni-network-policy-considerations) 中和 GitHub 上的 [aws-network-policy-agent GitHub 問題 \$1327](https://github.com/aws/aws-network-policy-agent/issues/327) 中會記載這一情況。將 Pod 部署為 deployment 或 replicaset 的一部分，以實現一致的網路政策行為。

# Amazon EKS 的網路政策的星示範
<a name="network-policy-stars-demo"></a>

此示範會在 Amazon EKS 叢集上建立前端、後端和用戶端服務。示範中亦將建立管理圖形使用者介面，其顯示各服務之間可用的輸入和輸出路徑。我們建議您在不執行生產工作負載的叢集上完成示範。

在您建立任何網路政策前，所有服務都可以雙向通訊。在您套用網路政策後，便可看到用戶端只能與前端服務通訊，同時後端只能接受來自前端的流量。

1. 套用前端、後端、用戶端和管理使用者介面服務：

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml
   ```

1. 檢視叢集上的所有 Pod。

   ```
   kubectl get pods -A
   ```

   範例輸出如下。

   在輸出中，您應該在以下輸出中顯示的命名空間中看到 pod。*NAMES* 和 `READY` 直欄中的 Pod 數量與下列輸出中的數量不同。不要繼續，直到您看到具有相似名稱的 Pod 並且其在 `STATUS` 資料欄都有 `Running` 狀態。

   ```
   NAMESPACE         NAME                                       READY   STATUS    RESTARTS   AGE
   [...]
   client            client-xlffc                               1/1     Running   0          5m19s
   [...]
   management-ui     management-ui-qrb2g                        1/1     Running   0          5m24s
   stars             backend-sz87q                              1/1     Running   0          5m23s
   stars             frontend-cscnf                             1/1     Running   0          5m21s
   [...]
   ```

1. 若要連接到管理使用者介面，請連接到在叢集上執行之服務的 `EXTERNAL-IP`：

   ```
   kubectl get service/management-ui -n management-ui
   ```

1. 打開瀏覽器到上一個步驟的位置。您應該會看到管理使用者介面。**C** 節點是用戶端服務，而 **F** 節點是前端服務，且 **B** 節點是後端服務。每個節點都有對所有其他節點的完整通訊存取權 (如粗體、上顏色行的文字所指示)。  
![\[開放網路政策\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/stars-default.png)

1. 在 `stars` 和 `client` 命名空間中套用以下網路政策來將服務彼此隔離：

   ```
   kind: NetworkPolicy
   apiVersion: networking.k8s.io/v1
   metadata:
     name: default-deny
   spec:
     podSelector:
       matchLabels: {}
   ```

   您可以使用下列命令將政策同時套用至兩個命名空間：

   ```
   kubectl apply -n stars -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml
   kubectl apply -n client -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml
   ```

1. 重新整理您的瀏覽器。您將看到管理使用者介面不再到達任何節點，所以各節點均不會顯示在使用者介面中。

1. 套用下列不同的網路政策，以允許管理使用者介面存取服務。套用此政策以允許 UI：

   ```
   kind: NetworkPolicy
   apiVersion: networking.k8s.io/v1
   metadata:
     namespace: stars
     name: allow-ui
   spec:
     podSelector:
       matchLabels: {}
     ingress:
       - from:
           - namespaceSelector:
               matchLabels:
                 role: management-ui
   ```

   套用此政策以允許用戶端：

   ```
   kind: NetworkPolicy
   apiVersion: networking.k8s.io/v1
   metadata:
     namespace: client
     name: allow-ui
   spec:
     podSelector:
       matchLabels: {}
     ingress:
       - from:
           - namespaceSelector:
               matchLabels:
                 role: management-ui
   ```

   您可以使用下列命令來同時套用兩個政策：

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui.yaml
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui-client.yaml
   ```

1. 重新整理您的瀏覽器。您將看到管理使用者介面再次可到達各節點，但各節點無法互相通訊。  
![\[UI 存取網路政策\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/stars-no-traffic.png)

1. 套用以下網路政策以允許流量從前端服務流向後端服務：

   ```
   kind: NetworkPolicy
   apiVersion: networking.k8s.io/v1
   metadata:
     namespace: stars
     name: backend-policy
   spec:
     podSelector:
       matchLabels:
         role: backend
     ingress:
       - from:
           - podSelector:
               matchLabels:
                 role: frontend
         ports:
           - protocol: TCP
             port: 6379
   ```

1. 重新整理您的瀏覽器。您可以看到前端服務可以與後端服務通訊。  
![\[前端到後端政策\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/stars-front-end-back-end.png)

1. 套用以下網路政策以允許流量從用戶端流向後端服務：

   ```
   kind: NetworkPolicy
   apiVersion: networking.k8s.io/v1
   metadata:
     namespace: stars
     name: frontend-policy
   spec:
     podSelector:
       matchLabels:
         role: frontend
     ingress:
       - from:
           - namespaceSelector:
               matchLabels:
                 role: client
         ports:
           - protocol: TCP
             port: 80
   ```

1. 重新整理您的瀏覽器。您可以看到用戶端可以與前端服務通訊。前端服務仍然可以與後端服務通訊。  
![\[最終網路政策\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/stars-final.png)

1. (選用) 在完成示範後，您可以刪除其資源。

   ```
   kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml
   kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml
   kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml
   kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml
   kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml
   ```

   即使刪除資源之後，節點上仍可能有網路政策端點，這些端點可能會以非預期的方式干擾叢集中的聯網。移除這些規則的唯一確定方法，是重新啟動節點或終止所有節點並將其回收。若要終止所有節點，請將 Auto Scaling 群組所需的計數設定為 0，然後備份到所需的數字，或是只終止節點。