本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 限制 Pod 網路流量 Kubernetes 網路政策
您可以使用 Kubernetes 網路政策,以限制往返您 的網路流量 Pods。 如需詳細資訊,請參閱中的網路政策
您必須設定下列項目才能使用此功能:
-
在 設定政策強制執行 Pod 啟動。您可以在 VPC CNI 的
aws-node
容器中執行此操作DaemonSet
。 -
啟用附加元件的網路政策參數。
-
將叢集設定為使用 Kubernetes 網路政策
在開始之前,請檢閱考量事項。如需詳細資訊,請參閱考量事項。
必要條件
以下是此功能的先決條件:
* .最低叢集版本 現有 Amazon EKS 叢集。若要部署叢集,請參閱 Amazon EKS 入門。叢集必須是 Kubernetes 版本 1.25
或更新版本。叢集必須執行其中一個 Kubernetes 下表列出的版本和平台版本。請注意,任何 Kubernetes 和 平台版本也支援高於列出的版本。您可以檢查目前的 Kubernetes 版本取代 my-cluster
在下列命令中,使用叢集的名稱,然後執行修改後的命令:
+
aws eks describe-cluster --name my-cluster --query cluster.version --output text
+
Kubernetes 版本 | 平台版本 |
---|---|
|
|
|
|
|
|
* .最小 VPC CNI版本 1.14
或更新版本的 Amazon VPC CNI plugin for Kubernetes 在您的叢集上。您可以使用下列命令來查看您目前擁有哪個版本。
+
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
+ 如果您的版本早於 1.14
,請參閱 更新 Amazon VPC CNIAmazon EKS 附加元件) 升級至版本 1.14
或更新版本。* .Minimum Linux 核心版本 您的節點必須具有 Linux 核心版本 5.10
或更新版本。您可以使用 uname -r
來檢查您的核心版本。如果您使用的是最新版本的 Amazon EKS 最佳化 Amazon Linux、Amazon EKS 最佳化加速 Amazon Linux AMIs 和 Bottlerocket AMIs,則它們已經具有所需的核心版本。
+ Amazon EKS 最佳化加速 Amazon Linux AMI 版本 v20231116
或更新版本具有核心版本 5.10
。
步驟 1:在 設定政策強制執行 Pod 啟動
所以此 Amazon VPC CNI plugin for Kubernetes 設定與 Pod 佈建平行的 Pod 網路政策。在為新 Pod 設定所有政策之前,新 Pod 中的容器將以預設允許政策開始。這稱為標準模式。預設允許政策表示允許所有進出新 Pod 的輸入和輸出流量。例如,在新 Pod 更新為作用中政策之前,Pod 不會強制執行任何防火牆規則 (允許所有流量)。
將NETWORK_POLICY_ENFORCING_MODE
變數設定為 時strict
,使用 VPC CNI 的 Pod 會以預設拒絕政策開頭,然後設定政策。這稱為嚴格模式。在嚴格模式下,您必須針對 Pod 在叢集中需要存取的每個端點設定網路政策。請注意,此要求適用於 CoreDNS Pod。使用主機聯網的 Pod 未設定預設拒絕政策。
您可以在 VPC CNI 的NETWORK_POLICY_ENFORCING_MODE
strict
aws-node
容器中將環境變數設定為 ,以變更預設網路政策DaemonSet
。
env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"
步驟 2:啟用附加元件的網路政策參數
依預設,網路政策功能會使用節點的連接埠 8162
做為指標。此外,該功能使用了連接埠 8163
進行健康狀態探查。如果您在需要使用這些連接埠的節點或 Pod 內部執行另一應用程式,則該應用程式將無法執行。在 VPC v1.14.1
CNI中,您可以變更這些連接埠。
使用下列程序來啟用附加元件的網路政策參數。
- AWS Management Console
-
-
開啟 Amazon EKS 主控台
。 -
在左側導覽窗格中,選取叢集,然後選取您要設定 Amazon VPC CNI 附加元件的叢集名稱。
-
選擇附加元件索引標籤。
-
選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。
-
在 設定 上
name of add-on
頁面:-
在版本清單中選取
v1.14.0-eksbuild.3
或更新版本。 -
展開選用組態設定。
-
在組態值
"true"
中輸入 JSON 金鑰"enableNetworkPolicy":
和值。 產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料,請以大括號{ }
括住該金鑰和值。下列範例已啟用網路政策功能,並將指標和運作狀態探查設定為預設連接埠號碼:
{ "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
-
-
- Helm
-
如果您已安裝 Amazon VPC CNI plugin for Kubernetes 透過
helm
,您可以更新組態以變更連接埠。-
執行下列命令來變更連接埠。分別在金鑰
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
-
-
在您的編輯器中開啟
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
在 VPC CNI
aws-node
常駐程式清單的args:
aws-network-policy-agent
容器中,取代下列命令引數中的連接埠號碼。- args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163
-
步驟 3:在您的節點上安裝 Berkeley Packet Filter (BPF) 檔案系統
您必須在每個節點上安裝 Berkeley 封包篩選條件 (BPF) 檔案系統。
注意
如果您的叢集是版本 1.27
或更新版本,您可以略過此步驟,因為 1.27
或更新版本的所有 Amazon EKS 最佳化 Amazon Linux 和 Bottlerocket AMIs 都已經有此功能。
對於所有其他叢集版本,如果您將 Amazon EKS 最佳化的 Amazon Linux 升級至版本 v20230703
或更新版本,或將 Bottlerocket AMI 升級到版本 v1.0.2
或更新版本,您可以略過此步驟。
-
在每個節點上安裝 Berkeley Packet Filter (BPF) 檔案系統。
sudo mount -t bpf bpffs /sys/fs/bpf
-
然後,在您的 Amazon EC2 Auto Scaling 群組的啟動範本中,將相同的命令新增至您的使用者資料。
步驟 4:將叢集設定為使用 Kubernetes 網路政策
設定叢集以使用 Kubernetes 網路政策。您可以為 Amazon EKS 附加元件或自我管理附加元件設定此項目。
- AWS Management Console
-
-
開啟 Amazon EKS 主控台
。 -
在左側導覽窗格中,選取叢集,然後選取您要設定 Amazon VPC CNI 附加元件的叢集名稱。
-
選擇附加元件索引標籤。
-
選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。
-
在 設定 上
name of addon
頁面:-
在版本清單中選取
v1.14.0-eksbuild.3
或更新版本。 -
展開選用組態設定。
-
在組態值
"true"
中輸入 JSON 金鑰"enableNetworkPolicy":
和值。 產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料,請以大括號{ }
括住該金鑰和值。下列範例顯示已啟用網路政策:{ "enableNetworkPolicy": "true" }
下列螢幕擷取畫面展示了案例的範例。
-
-
- AWS CLI
-
-
執行下列 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 '{"enableNetworkPolicy": "true"}'
-
- Helm
-
如果您已安裝 Amazon VPC CNI plugin for Kubernetes 透過
helm
,您可以更新組態以啟用網路政策。-
執行下列命令以啟用網路政策。
helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
-
- kubectl
-
-
在您的編輯器中開啟
amazon-vpc-cni
ConfigMap
。kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
-
在
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"
-
在您的編輯器中開啟
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
在 VPC CNI
aws-node
常駐程式清單true
的--enable-network-policy=false
args:
aws-network-policy-agent
容器中,將 中的命令引數中的 取代false
為 。- args: - --enable-network-policy=true
-
步驟 5. 後續步驟
完成組態後,請確認 Pod aws-node
正在叢集上執行。
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
物件並將其部署到您的叢集。 NetworkPolicy
物件範圍為命名空間。您可以實作政策來允許或拒絕 Pods 根據標籤選取器、命名空間和 IP 地址範圍。如需建立NetworkPolicy
物件的詳細資訊,請參閱中的網路政策
強制執行 Kubernetes NetworkPolicy
物件是使用 實作 Extended Berkeley Packet Filter (eBPF)。 相對於iptables
以 為基礎的實作,它提供了較低的延遲和效能特性,包括降低 CPU 使用率並避免循序查詢。此外,eBPF 探查提供對內容豐富的資料的存取,有助於偵錯複雜的核心層級問題並改善可觀測性。Amazon EKS 支援 eBPF型匯出器,利用探查在每個節點上記錄政策結果,並將資料匯出至外部日誌收集器,以協助偵錯。如需詳細資訊,請參閱 eBPF 文件