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

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

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

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

要使用此功能,您必須設定以下內容:

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

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

  3. 設定叢集以使用 Kubernetes 網路政策

請檢閱考量之後再開始。如需詳細資訊,請參閱 考量事項

先決條件

以下是此功能的先決條件:

最低叢集版本

現有 Amazon EKS 叢集。若要部署叢集,請參閱 開始使用 Amazon EKS。叢集必須執行下表所列的其中一種 Kubernetes 版本和平台版本,請注意,也支援比上列任何 Kubernetes 與平台版本更新的版本。您可使用叢集名稱取代下列命令的 my-cluster,然後執行修改的命令來檢查目前 Kubernetes 版本:

aws eks describe-cluster --name my-cluster --query cluster.version --output text
Kubernetes 版本 平台版本

1.27.4

eks.5

1.26.7

eks.6

最低 VPC CNI 版本

叢集上安裝版本為 1.14 或更高版本的 Kubernetes 專用 Amazon VPC CNI 外掛程式。您可以使用下列命令來查看您目前擁有哪個版本。

kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

如果您的版本早於 1.14,請查看 更新 Amazon VPC CNI (Amazon EKS 附件元件) 以升級到版本 1.14 或更高版本。

最低 Linux 核心版本

您的節點必須具有 Linux 核心版本 5.10 或更高版本。您可以使用 uname -r 來檢查您的核心版本。如果您使用的是最新版本的 Amazon EKS 最佳化 Amazon Linux、Amazon EKS 最佳化加速 Amazon Linux AMI 和 Bottlerocket AMI,則它們已經具有所需的核心版本。

Amazon EKS 最佳化加速 Amazon Linux AMI 版本 v20231116 或具有核心版本 5.10 的更新版本。

步驟 1:設定政策在 Pod 啟動時強制執行

Kubernetes 專用 Amazon VPC CNI 外掛程式 會在 Pod 佈建的同時設定 Pod 的網路政策。在為新 Pod 設定所有政策之前,新 Pod 中的容器會以預設允許政策啟動。這稱為標準模式。預設允許政策意味著允許進出新 Pod 的所有輸入和輸出流量。例如,在使用作用中的政策更新新 Pod 之前,Pod 不會強制執行任何防火牆規則 (允許所有流量)。

NETWORK_POLICY_ENFORCING_MODE 變數設定為 strict 時,使用 VPC CNI 的 Pod 會從預設拒絕政策開始,然後設定政策。這稱為嚴格模式。在嚴格模式下,您必須為 Pod 需要存取的叢集中的每個端點都設定網路政策。請注意,此要求適用於 CoreDNS Pod。預設拒絕政策不會針對具有主機聯網的 Pod 進行設定。

您可以透過在 VPC CNI DaemonSetaws-node 容器中將環境變數 strict 設定為 NETWORK_POLICY_ENFORCING_MODE 來變更預設網路政策。

env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"

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

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

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

AWS 管理主控台

  1. 開啟 Amazon EKS 主控台

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

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

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

  5. 設定 Amazon VPC CNI 頁面上:

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

    2. 展開選用組態設定

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

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

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

Helm

如果您已透過 helm 安裝 Kubernetes 專用 Amazon VPC CNI 外掛程式,您可更新組態來變更連接埠。

  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 daemonset 清單檔案的 aws-network-policy-agent 容器,取代 args: 中下列命令引數的連接埠號碼。

    - args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163

步驟 3:設定叢集以使用 Kubernetes 網路政策

您可為 Amazon EKS 附加元件或自我管理附加元件設定此值。

使用 AWS CLI,您可以執行以下命令,將叢集設定為使用 Kubernetes 網路政策。將 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"}'

要使用 AWS 管理主控台設定此項目,請依照下列步驟進行:

  1. 開啟 Amazon EKS 主控台

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

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

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

  5. 設定 Amazon VPC CNI 頁面上:

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

    2. 展開選用組態設定

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

      { "enableNetworkPolicy": "true" }

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

      <shared id="consolelong"/> 顯示選用組態中具有網路政策的 VPC CNI 附加元件的 。
Helm

如果您已透過 helm 安裝 Kubernetes 專用 Amazon VPC CNI 外掛程式,您可以更新組態以啟用網路政策。

  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
    1. 在 VPC CNI aws-node daemonset 清單檔案的 aws-network-policy-agent 容器,以 true 取代 args: 中命令引數 --enable-network-policy=false 裡的 false

      - args: - --enable-network-policy=true

步驟 4. 後續步驟

完成組態後,請確認 aws-node Pod 正在叢集上執行。

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 物件的範圍是一個命名空間。您實施政策以允許或拒絕根據標籤選取工具、命名空間及 IP 位址範圍的 Pod 之間的流量。如需有關建立 NetworkPolicy 物件的詳細資訊,請參閱 Kubernetes 文件中的網路政策

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