設定混合節點的 Kubernetes 網路政策 - Amazon EKS

協助改善此頁面

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

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

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

設定混合節點的 Kubernetes 網路政策

AWS 使用 Cilium 做為 CNI 搭配 EKS 混合節點時,支援 Pod 輸入和輸出流量的 Kubernetes 網路政策 (第 3 層/第 4 層)。如果您使用 AWS 雲端中的節點執行 EKS 叢集,則 AWS 支援 Amazon VPC CNI for Kubernetes 網路政策

本主題說明如何使用 EKS 混合節點設定 Cilium 和 Kubernetes 網路政策。如需 Kubernetes 網路政策的詳細資訊,請參閱 Kubernetes 文件中的 Kubernetes 網路政策

設定網路政策

考量事項

  • AWS 支援上游 Kubernetes 網路政策和 Pod 輸入和輸出的規格。 AWS 目前不支援 CiliumNetworkPolicyCiliumClusterwideNetworkPolicy

  • policyEnforcementMode Helm 值可用來控制預設的 Cilium 政策強制執行行為。預設行為允許所有輸出和輸入流量。當網路政策選取端點時,它會轉換為預設拒絕狀態,其中只允許明確允許的流量。如需預設政策模式政策強制執行模式的詳細資訊,請參閱 Cilium 文件。

  • 如果您要policyEnforcementMode變更現有的 Cilium 安裝,您必須重新啟動 Cilium 代理程式 DaemonSet 以套用新的政策強制執行模式。

  • 使用 namespaceSelectorpodSelector 允許或拒絕具有相符標籤的命名空間和 Pod 之間的流量。namespaceSelectorpodSelector可與 matchLabels或 搭配使用matchExpressions,以根據其標籤選取命名空間和 Pod。

  • 使用 ingress.portsegress.ports 允許或拒絕往返連接埠和通訊協定的流量。

  • ipBlock 欄位無法用來選擇性允許或拒絕進出 Pod IP 地址 (#9209) 的流量。對節點 IPs 使用ipBlock選擇器是 Cilium 中的 Beta 功能,不受 支援 AWS。

  • 如需 Kubernetes 網路政策可用欄位的資訊,請參閱 Kubernetes 文件中的 NetworkPolicy 資源

先決條件

程序

下列程序會為範例微服務應用程式設定網路政策,讓元件只能與應用程式運作所需的其他元件通訊。程序使用 Istio Bookinfo 範例微服務應用程式。

Bookinfo 應用程式由四個單獨的微服務組成,關係如下:

  • productpage。productpage 微服務會呼叫詳細資訊並檢閱微服務以填入頁面。

  • 詳細資訊。詳細資訊微服務包含書籍資訊。

  • 檢閱。檢閱微服務包含書籍檢閱。它也會呼叫評分微服務。

  • 評分。評分微服務包含書籍評論隨附的書籍排名資訊。

    1. 建立範例應用程式。

      kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
    2. 確認應用程式已成功執行,並記下 productpage microservice 的 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
    3. 建立 Pod,用於測試網路政策。請注意,Pod 是在具有標籤 的default命名空間中建立access: true

      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
    4. 測試對 productpage microservice 的存取。在下面的範例中,我們使用 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>
    5. 您可以輸入 來結束測試 curl Pod,exit並執行下列命令來重新連接至 Pod。

      kubectl attach curl-pod -c curl-pod -i -t
    6. 為了在下列步驟中示範網路政策的效果,我們首先建立一個網路政策,拒絕 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
    7. 將拒絕網路政策套用至您的叢集。

      kubectl apply -f network-policy-default-deny-bookinfo.yaml
    8. 測試 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
    9. 建立名為 的檔案network-policy-productpage.yaml,以定義 productpage 網路政策。此政策具有下列規則:

      • 允許來自標籤 Pod 的輸入流量 access: true(在上一個步驟中建立的 curl Pod)

      • 允許連接埠上的輸出 TCP 流量9080,以取得詳細資訊、檢閱和評分微服務

      • 允許在 kube-system 命名空間中執行53之 CoreDNS 連接埠上的輸出 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
    10. 將 productpage 網路政策套用至您的叢集。

      kubectl apply -f network-policy-productpage.yaml
    11. 連接至 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."}
    12. 建立名為 的檔案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
    13. 建立名為 的檔案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
    14. 建立名為 的檔案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"]
    15. 將詳細資訊、檢閱和評分網路政策套用至您的叢集。

      kubectl apply -f network-policy-details.yaml kubectl apply -f network-policy-reviews.yaml kubectl apply -f network-policy-ratings.yaml
    16. 連接至 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}}
    17. 清除您在此程序中建立的資源。

      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