

 **協助改進此頁面** 

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

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

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

# 設定混合節點的 Kubernetes 網路政策
<a name="hybrid-nodes-network-policies"></a>

 當使用 Cilium 作為 CNI 搭配 EKS 混合節點時，AWS 支援適用於 Pod 輸入和輸出流量的 Kubernetes 網路政策 (第 3 層/第 4 層)。如果您使用 AWS 雲端中的節點執行 EKS 叢集，則 AWS 支援 [Kubernetes 專用 Amazon VPC CNI 網路政策](cni-network-policy.md)。

本主題涵蓋如何使用 EKS 混合節點設定 Cilium 和 Kubernetes 網路政策。如需 Kubernetes 網路政策的詳細資訊，請參閱 Kubernetes 文件中的 [Kubernetes 網路政策](https://kubernetes.io/docs/concepts/services-networking/network-policies/)。

## 設定網路政策
<a name="hybrid-nodes-configure-network-policies"></a>

### 考量事項
<a name="_considerations"></a>
+  AWS 支援上游 Kubernetes 網路政策和 Pod 輸入和輸出的規格。AWS 目前不支援 `CiliumNetworkPolicy` 或 `CiliumClusterwideNetworkPolicy`。
+ `policyEnforcementMode` Helm 值可用於控制預設的 Cilium 政策強制執行行為。預設行為允許所有輸出和輸入流量。當網路政策選取端點時，其會轉換為預設拒絕狀態，而該狀態僅允許明確允許的流量。如需[預設政策模式](https://docs.cilium.io/en/stable/security/policy/intro/#policy-mode-default)和[政策強制執行模式](https://docs.cilium.io/en/stable/security/policy/intro/#policy-enforcement-modes)的詳細資訊，請參閱 Cilium 文件。
+ 如果您要變更現有 Cilium 安裝的 `policyEnforcementMode`，則您必須重新啟動 Cilium 代理程式 DaemonSet，以套用新的政策強制執行模式。
+ 使用 `namespaceSelector` 和 `podSelector` 允許或拒絕往返具有相符標籤的命名空間和 Pod 之間的流量。`namespaceSelector` 和 `podSelector` 可與 `matchLabels` 或 `matchExpressions` 搭配使用，以根據其標籤選取命名空間和 Pod。
+ 使用 `ingress.ports` 和 `egress.ports` 允許或拒絕往返連接埠和通訊協定之間的流量。
+ `ipBlock` 欄位無法用於選擇性地允許或拒絕往返 Pod IP 位址 ([\#9209](https://github.com/cilium/cilium/issues/9209)) 的流量。針對節點 IP 使用 `ipBlock` 選取器是 Cilium 中的 Beta 版功能，且不受 AWS 支援。
+ 如需 Kubernetes 網路政策可用欄位的資訊，請參閱 Kubernetes 文件中的 [NetworkPolicy 資源](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)。

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。
+ 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

### 程序
<a name="_procedure"></a>

下列程序會為範例微服務應用程式設定網路政策，以便元件只能與應用程式運作所需的其他元件通訊。程序會使用 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 範例微服務應用程式。

Bookinfo 應用程式由四個單獨的微服務組成，且其關係如下：
+  **productpage**。productpage 微服務會呼叫詳細資訊並檢閱微服務來填入頁面。
+  **詳細資訊** 詳細資訊微服務包含書籍資訊。
+  **檢閱**。檢閱微服務包含書籍檢閱。其還會呼叫評分微服務。
+  **評分**。評分微服務包含隨附書籍檢閱的書籍排名資訊。

  1. 建立範例應用程式。

     ```
     kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     ```

  1. 確認應用程式已成功執行，並記下 productpage 微服務的 Pod IP 位址。在後續步驟中，您將使用此 Pod IP 位址來查詢每個微服務。

     ```
     kubectl get pods -o wide
     ```

     ```
     NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE
     details-v1-766844796b-9wff2       1/1     Running   0          7s    10.86.3.7     mi-0daa253999fe92daa
     productpage-v1-54bb874995-lwfgg   1/1     Running   0          7s    10.86.2.193   mi-082f73826a163626e
     ratings-v1-5dc79b6bcd-59njm       1/1     Running   0          7s    10.86.2.232   mi-082f73826a163626e
     reviews-v1-598b896c9d-p2289       1/1     Running   0          7s    10.86.2.47    mi-026d6a261e355fba7
     reviews-v2-556d6457d-djktc        1/1     Running   0          7s    10.86.3.58    mi-0daa253999fe92daa
     reviews-v3-564544b4d6-g8hh4       1/1     Running   0          7s    10.86.2.69    mi-09183e8a3d755abf6
     ```

  1. 建立將用於測試網路政策的 Pod。請注意，Pod 是在具有標籤 `access: true` 的 `default` 命名空間中建立的。

     ```
     kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
     ```

  1. 測試對 productpage 微服務的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     ```

     ```
     <title>Simple Bookstore App</title>
     ```

  1. 您可以輸入 `exit` 來結束測試 curl Pod，並執行下列命令來重新連接至 Pod。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

  1. 為了在下列步驟中示範網路政策的效果，我們會先建立一個網路政策，其中該政策會拒絕 BookInfo 微服務的所有流量。建立稱為 `network-policy-deny-bookinfo.yaml` 的檔案，其中會定義拒絕網路政策。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: deny-bookinfo
       namespace: default
     spec:
       podSelector:
         matchExpressions:
         - key: app
           operator: In
           values: ["productpage", "details", "reviews", "ratings"]
       policyTypes:
       - Ingress
       - Egress
     ```

  1. 將拒絕網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-default-deny-bookinfo.yaml
     ```

  1. 測試對 BookInfo 應用程式的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     curl http://10.86.2.193:9080/productpage --max-time 10
     ```

     ```
     curl: (28) Connection timed out after 10001 milliseconds
     ```

  1. 建立稱為 `network-policy-productpage.yaml` 的檔案，其中會定義 productpage 網路政策。政策具有下列規則：
     + 允許來自具有標籤 `access: true` 的 Pod 的輸入流量 (在上一個步驟中建立的 curl Pod)
     + 允許連接埠 `9080` 上的輸出 TCP 流量，以取得詳細資訊、檢閱和評分微服務
     + 允許在 `kube-system` 命名空間中執行的 CoreDNS 連接埠 `53` 上的輸出 TCP/UDP 流量

       ```
       apiVersion: networking.k8s.io/v1
       kind: NetworkPolicy
       metadata:
         name: productpage-policy
         namespace: default
       spec:
         podSelector:
           matchLabels:
             app: productpage
         policyTypes:
         - Ingress
         - Egress
         ingress:
         - from:
           - podSelector:
               matchLabels:
                 access: "true"
         egress:
         - to:
           - podSelector:
               matchExpressions:
               - key: app
                 operator: In
                 values: ["details", "reviews", "ratings"]
           ports:
           - port: 9080
             protocol: TCP
         - to:
           - namespaceSelector:
               matchLabels:
                 kubernetes.io/metadata.name: kube-system
             podSelector:
               matchLabels:
                 k8s-app: kube-dns
           ports:
           - port: 53
             protocol: UDP
           - port: 53
             protocol: TCP
       ```

  1. 將 productpage 網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-productpage.yaml
     ```

  1. 連線至 curl Pod 並測試對 Bookinfo 應用程式的存取。現在允許存取 productpage 微服務，但其他微服務仍然被拒絕，因為它們仍須遵循拒絕網路政策。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     <title>Simple Bookstore App</title>
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     {"error": "Sorry, product details are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     {"error": "Sorry, product reviews are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     {"error": "Sorry, product ratings are currently unavailable for this book."}
     ```

  1. 建立稱為 `network-policy-details.yaml` 的檔案，其中會定義詳細資訊網路政策。此政策僅允許來自 productpage 微服務的輸入流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: details-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: details
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
     ```

  1. 建立稱為 `network-policy-reviews.yaml` 的檔案，其中會定義檢閱網路政策。此政策僅允許來自 productpage 微服務輸入流量，且僅允許至評分微服務和 CoreDNS 的輸出流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: reviews-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: reviews
       policyTypes:
       - Ingress
       - Egress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
       egress:
       - to:
         - podSelector:
             matchLabels:
               app: ratings
       - to:
         - namespaceSelector:
             matchLabels:
               kubernetes.io/metadata.name: kube-system
           podSelector:
             matchLabels:
               k8s-app: kube-dns
         ports:
         - port: 53
           protocol: UDP
         - port: 53
           protocol: TCP
     ```

  1. 建立稱為 `network-policy-ratings.yaml` 的檔案，其中會定義評分網路政策。此政策僅允許來自檢閱微服務的輸入流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: ratings-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: ratings
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchExpressions:
             - key: app
               operator: In
               values: ["productpage", "reviews"]
     ```

  1. 將詳細資訊、檢閱和評分網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-details.yaml
     kubectl apply -f network-policy-reviews.yaml
     kubectl apply -f network-policy-ratings.yaml
     ```

  1. 連線至 curl Pod 並測試對 Bookinfo 應用程式的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     測試詳細資訊微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     ```

     ```
     {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}
     ```

     測試檢閱微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     ```

     ```
     {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
     ```

     測試評分微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     ```

     ```
     {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
     ```

  1. 清除您在本程序中建立的資源。

     ```
     kubectl delete -f network-policy-deny-bookinfo.yaml
     kubectl delete -f network-policy-productpage.yaml
     kubectl delete -f network-policy-details.yaml
     kubectl delete -f network-policy-reviews.yaml
     kubectl delete -f network-policy-ratings.yaml
     kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     kubectl delete pod curl-pod
     ```