使用 限制 Pod 網路流量 Kubernetes 網路政策 - Amazon EKS

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

使用 限制 Pod 網路流量 Kubernetes 網路政策

您可以使用 Kubernetes 網路政策,以限制往返您 的網路流量 Pods。 如需詳細資訊,請參閱中的網路政策 Kubernetes 文件中)。

您必須設定下列項目才能使用此功能:

  1. 在 設定政策強制執行 Pod 啟動。您可以在 VPC CNI 的aws-node容器中執行此操作DaemonSet

  2. 啟用附加元件的網路政策參數。

  3. 將叢集設定為使用 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 版本 平台版本

1.27.4

eks.5

1.26.7

eks.6

1.25.12

eks.7

* .最小 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_MODEstrictaws-node容器中將環境變數設定為 ,以變更預設網路政策DaemonSet

env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"

步驟 2:啟用附加元件的網路政策參數

依預設,網路政策功能會使用節點的連接埠 8162 做為指標。此外,該功能使用了連接埠 8163 進行健康狀態探查。如果您在需要使用這些連接埠的節點或 Pod 內部執行另一應用程式,則該應用程式將無法執行。在 VPC v1.14.1CNI中,您可以變更這些連接埠。

使用下列程序來啟用附加元件的網路政策參數。

AWS Management Console
  1. 開啟 Amazon EKS 主控台

  2. 在左側導覽窗格中,選取叢集,然後選取您要設定 Amazon VPC CNI 附加元件的叢集名稱。

  3. 選擇附加元件索引標籤。

  4. 選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。

  5. 設定 上 name of add-on 頁面:

    1. 在版本清單中選取 v1.14.0-eksbuild.3或更新版本。

    2. 展開選用組態設定

    3. 在組態值"true"中輸入 JSON 金鑰"enableNetworkPolicy":和值。 產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料,請以大括號 { } 括住該金鑰和值。

      下列範例已啟用網路政策功能,並將指標和運作狀態探查設定為預設連接埠號碼:

      { "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
Helm

如果您已安裝 Amazon VPC CNI plugin for Kubernetes 透過 helm,您可以更新組態以變更連接埠。

  1. 執行下列命令來變更連接埠。分別在金鑰 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
  1. 在您的編輯器中開啟 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  2. 在 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 或更新版本,您可以略過此步驟。

  1. 在每個節點上安裝 Berkeley Packet Filter (BPF) 檔案系統。

    sudo mount -t bpf bpffs /sys/fs/bpf
  2. 然後,在您的 Amazon EC2 Auto Scaling 群組的啟動範本中,將相同的命令新增至您的使用者資料。

步驟 4:將叢集設定為使用 Kubernetes 網路政策

設定叢集以使用 Kubernetes 網路政策。您可以為 Amazon EKS 附加元件或自我管理附加元件設定此項目。

AWS Management Console
  1. 開啟 Amazon EKS 主控台

  2. 在左側導覽窗格中,選取叢集,然後選取您要設定 Amazon VPC CNI 附加元件的叢集名稱。

  3. 選擇附加元件索引標籤。

  4. 選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。

  5. 設定 上 name of addon 頁面:

    1. 在版本清單中選取 v1.14.0-eksbuild.3或更新版本。

    2. 展開選用組態設定

    3. 在組態值"true"中輸入 JSON 金鑰"enableNetworkPolicy":和值。 產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料,請以大括號 { } 括住該金鑰和值。下列範例顯示已啟用網路政策:

      { "enableNetworkPolicy": "true" }

      下列螢幕擷取畫面展示了案例的範例。

      <shared id="consolelong"/> 在選用組態中顯示具有網路政策的 VPC CNI 附加元件。
AWS CLI
  1. 執行下列 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,您可以更新組態以啟用網路政策。

  1. 執行下列命令以啟用網路政策。

    helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
  1. 在您的編輯器中開啟 amazon-vpc-cni ConfigMap

    kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
  2. 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"
  3. 在您的編輯器中開啟 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  4. 在 VPC CNI aws-node 常駐程式清單true--enable-network-policy=falseargs: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 文件中)。

強制執行 Kubernetes NetworkPolicy 物件是使用 實作 Extended Berkeley Packet Filter (eBPF)。 相對於iptables以 為基礎的實作,它提供了較低的延遲和效能特性,包括降低 CPU 使用率並避免循序查詢。此外,eBPF 探查提供對內容豐富的資料的存取,有助於偵錯複雜的核心層級問題並改善可觀測性。Amazon EKS 支援 eBPF型匯出器,利用探查在每個節點上記錄政策結果,並將資料匯出至外部日誌收集器,以協助偵錯。如需詳細資訊,請參閱 eBPF 文件