協助改進此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定混合節點的 Kubernetes 網路政策
當使用 Cilium 作為 CNI 搭配 EKS 混合節點時,AWS 支援適用於 Pod 輸入和輸出流量的 Kubernetes 網路政策 (第 3 層/第 4 層)。如果您使用 AWS 雲端中的節點執行 EKS 叢集,則 AWS 支援 Kubernetes 專用 Amazon VPC CNI 網路政策。
本主題涵蓋如何使用 EKS 混合節點設定 Cilium 和 Kubernetes 網路政策。如需 Kubernetes 網路政策的詳細資訊,請參閱 Kubernetes 文件中的 Kubernetes 網路政策
設定網路政策
考量事項
-
AWS 支援上游 Kubernetes 網路政策和 Pod 輸入和輸出的規格。AWS 目前不支援
CiliumNetworkPolicy或CiliumClusterwideNetworkPolicy。 -
policyEnforcementModeHelm 值可用於控制預設的 Cilium 政策強制執行行為。預設行為允許所有輸出和輸入流量。當網路政策選取端點時,其會轉換為預設拒絕狀態,而該狀態僅允許明確允許的流量。如需預設政策模式和政策強制執行模式 的詳細資訊,請參閱 Cilium 文件。 -
如果您要變更現有 Cilium 安裝的
policyEnforcementMode,則您必須重新啟動 Cilium 代理程式 DaemonSet,以套用新的政策強制執行模式。 -
使用
namespaceSelector和podSelector允許或拒絕往返具有相符標籤的命名空間和 Pod 之間的流量。namespaceSelector和podSelector可與matchLabels或matchExpressions搭配使用,以根據其標籤選取命名空間和 Pod。 -
使用
ingress.ports和egress.ports允許或拒絕往返連接埠和通訊協定之間的流量。 -
ipBlock欄位無法用於選擇性地允許或拒絕往返 Pod IP 位址 (#9209) 的流量。針對節點 IP 使用 ipBlock選取器是 Cilium 中的 Beta 版功能,且不受 AWS 支援。 -
如需 Kubernetes 網路政策可用欄位的資訊,請參閱 Kubernetes 文件中的 NetworkPolicy 資源
。
先決條件
-
遵循 設定混合節點的 CNI 中的指示安裝 Cilium。
-
已在命令列環境中安裝 Helm,請參閱安裝 Helm 說明。
程序
下列程序會為範例微服務應用程式設定網路政策,以便元件只能與應用程式運作所需的其他元件通訊。程序會使用 Istio Bookinfo
Bookinfo 應用程式由四個單獨的微服務組成,且其關係如下:
-
productpage。productpage 微服務會呼叫詳細資訊並檢閱微服務來填入頁面。
-
詳細資訊 詳細資訊微服務包含書籍資訊。
-
檢閱。檢閱微服務包含書籍檢閱。其還會呼叫評分微服務。
-
評分。評分微服務包含隨附書籍檢閱的書籍排名資訊。
-
建立範例應用程式。
kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml -
確認應用程式已成功執行,並記下 productpage 微服務的 Pod IP 位址。在後續步驟中,您將使用此 Pod IP 位址來查詢每個微服務。
kubectl get pods -o wideNAME 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 -
建立將用於測試網路政策的 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 -
測試對 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> -
您可以輸入
exit來結束測試 curl Pod,並執行下列命令來重新連接至 Pod。kubectl attach curl-pod -c curl-pod -i -t -
為了在下列步驟中示範網路政策的效果,我們會先建立一個網路政策,其中該政策會拒絕 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 -
將拒絕網路政策套用至您的叢集。
kubectl apply -f network-policy-default-deny-bookinfo.yaml -
測試對 BookInfo 應用程式的存取。在以下範例中,我們使用 productpage Pod (
10.86.2.193) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。curl http://10.86.2.193:9080/productpage --max-time 10curl: (28) Connection timed out after 10001 milliseconds -
建立稱為
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
-
-
將 productpage 網路政策套用至您的叢集。
kubectl apply -f network-policy-productpage.yaml -
連線至 curl Pod 並測試對 Bookinfo 應用程式的存取。現在允許存取 productpage 微服務,但其他微服務仍然被拒絕,因為它們仍須遵循拒絕網路政策。在以下範例中,我們使用 productpage Pod (
10.86.2.193) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。kubectl attach curl-pod -c curl-pod -i -tcurl -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."} -
建立稱為
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 -
建立稱為
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 -
建立稱為
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"] -
將詳細資訊、檢閱和評分網路政策套用至您的叢集。
kubectl apply -f network-policy-details.yaml kubectl apply -f network-policy-reviews.yaml kubectl apply -f network-policy-ratings.yaml -
連線至 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}} -
清除您在本程序中建立的資源。
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
-