協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 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 目前不支援
CiliumNetworkPolicy
或CiliumClusterwideNetworkPolicy
。 -
policyEnforcementMode
Helm 值可用來控制預設的 Cilium 政策強制執行行為。預設行為允許所有輸出和輸入流量。當網路政策選取端點時,它會轉換為預設拒絕狀態,其中只允許明確允許的流量。如需預設政策模式和政策強制執行模式 的詳細資訊,請參閱 Cilium 文件。 -
如果您要
policyEnforcementMode
變更現有的 Cilium 安裝,您必須重新啟動 Cilium 代理程式 DaemonSet 以套用新的政策強制執行模式。 -
使用
namespaceSelector
和podSelector
允許或拒絕具有相符標籤的命名空間和 Pod 之間的流量。namespaceSelector
和podSelector
可與matchLabels
或 搭配使用matchExpressions
,以根據其標籤選取命名空間和 Pod。 -
使用
ingress.ports
和egress.ports
允許或拒絕往返連接埠和通訊協定的流量。 -
ipBlock
欄位無法用來選擇性允許或拒絕進出 Pod IP 地址 (#9209) 的流量。對節點 IPs 使用 ipBlock
選擇器是 Cilium 中的 Beta 功能,不受 支援 AWS。 -
如需 Kubernetes 網路政策可用欄位的資訊,請參閱 Kubernetes 文件中的 NetworkPolicy 資源
。
先決條件
-
按照 中的指示安裝 Cilium設定混合節點的 CNI。
-
安裝在命令列環境中的 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 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
-
建立 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
-
測試對 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>
-
您可以輸入 來結束測試 curl Pod,
exit
並執行下列命令來重新連接至 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 10
curl: (28) Connection timed out after 10001 milliseconds
-
建立名為 的檔案
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
-
-
將 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 -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."}
-
建立名為 的檔案
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
-