針對 Amazon EKS 的 Kubernetes 網路政策進行故障診斷 - Amazon EKS

協助改善此頁面

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

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

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

針對 Amazon EKS 的 Kubernetes 網路政策進行故障診斷

這是 Amazon VPC CNI 網路政策功能的疑難排解指南。

本指南涵蓋:

注意

請注意,網路政策僅適用於 Kubernetes Deployments 製作的 Pod。如需 VPC CNI 中網路政策的更多限制,請參閱考量事項

您可以透過讀取網路政策日誌並從 eBPF SDK 執行工具,對使用網路政策的網路連線進行疑難排解和調查。 包含的 eBPF 開發套件

新的 policyendpoints CRD 和許可

  • CRD: policyendpoints.networking.k8s.aws

  • Kubernetes API:apiservice稱為 v1.networking.k8s.io

  • Kubernetes 資源: Kind: NetworkPolicy

  • RBAC:ClusterRole稱為 aws-node(VPC CNI),ClusterRole稱為 eks:network-policy-controller(EKS 叢集控制平面中的網路政策控制器)

對於網路政策,VPC CNI 會建立新的 CustomResourceDefinition(CRD),稱為 policyendpoints.networking.k8s.aws。VPC CNI 必須具有許可,才能建立 CRD 並為此項目建立 CustomResources (CR),以及 VPC CNI () 安裝的其他 CRDeniconfigs.crd.k8s.amazonaws.com。這兩個 CRDs都可在 GitHub 的 crds.yaml 檔案中取得。具體而言,VPC CNI 必須具有 的「get」、「list」和「watch」動詞許可policyendpoints

Kubernetes 網路政策apiservice名為 的一部分v1.networking.k8s.io,這apiversion: networking.k8s.io/v1位於您的政策 YAML 檔案中。VPC CNI DaemonSet 必須具有許可才能使用 Kubernetes API 的此部分。

VPC CNI 許可位於ClusterRole稱為 的 中aws-node。請注意,ClusterRole物件不會在命名空間中分組。以下顯示叢集aws-node的 :

kubectl get clusterrole aws-node -o yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/instance: aws-vpc-cni app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: aws-node app.kubernetes.io/version: v1.19.4 helm.sh/chart: aws-vpc-cni-1.19.4 k8s-app: aws-node name: aws-node rules: - apiGroups: - crd.k8s.amazonaws.com resources: - eniconfigs verbs: - list - watch - get - apiGroups: - "" resources: - namespaces verbs: - list - watch - get - apiGroups: - "" resources: - pods verbs: - list - watch - get - apiGroups: - "" resources: - nodes verbs: - list - watch - get - apiGroups: - "" - events.k8s.io resources: - events verbs: - create - patch - list - apiGroups: - networking.k8s.aws resources: - policyendpoints verbs: - get - list - watch - apiGroups: - networking.k8s.aws resources: - policyendpoints/status verbs: - get - apiGroups: - vpcresources.k8s.aws resources: - cninodes verbs: - get - list - watch - patch

此外,新的控制器會在每個 EKS 叢集的控制平面中執行。控制器使用ClusterRole稱為 的 許可eks:network-policy-controller。以下顯示叢集eks:network-policy-controller的 :

kubectl get clusterrole eks:network-policy-controller -o yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/name: amazon-network-policy-controller-k8s name: eks:network-policy-controller rules: - apiGroups: - "" resources: - namespaces verbs: - get - list - watch - apiGroups: - "" resources: - pods verbs: - get - list - watch - apiGroups: - "" resources: - services verbs: - get - list - watch - apiGroups: - networking.k8s.aws resources: - policyendpoints verbs: - create - delete - get - list - patch - update - watch - apiGroups: - networking.k8s.aws resources: - policyendpoints/finalizers verbs: - update - apiGroups: - networking.k8s.aws resources: - policyendpoints/status verbs: - get - patch - update - apiGroups: - networking.k8s.io resources: - networkpolicies verbs: - get - list - patch - update - watch

網路政策日誌

VPC CNI 的每個決策都會記錄在流程日誌中,網路政策是否允許或拒絕連線。每個節點上的網路政策日誌均包含具有網路政策的每個 Pod 之流程日誌。網路政策日誌會儲存於 /var/log/aws-routed-eni/network-policy-agent.log。以下範例來自於 network-policy-agent.log 檔案:

{"level":"info","timestamp":"2023-05-30T16:05:32.573Z","logger":"ebpf-client","msg":"Flow Info: ","Src IP":"192.168.87.155","Src Port":38971,"Dest IP":"64.6.160","Dest Port":53,"Proto":"UDP","Verdict":"ACCEPT"}

網路政策日誌預設為停用。若要啟用網路政策日誌,請遵循下列步驟:

注意

網路政策日誌需要 VPC CNI aws-nodeDaemonSet資訊清單中aws-network-policy-agent容器的額外 1 個 vCPU。

Amazon EKS 附加元件

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

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

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

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

  5. 設定 Amazon VPC CNI 頁面上:

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

    2. 展開選用組態設定

    3. 輸入最上層 JSON 金鑰 "nodeAgent":,且值為具有組態值中的金鑰 "enablePolicyEventLogs":"true" 的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用,網路政策日誌會傳送至 CloudWatch Logs:

      { "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true" } }

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

<shared id="consolelong"/>,顯示選用組態中具有網路政策和 CloudWatch Logs 的 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 '{"nodeAgent": {"enablePolicyEventLogs": "true"}}'

自我管理附加元件

Helm

如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式helm,您可以更新組態以寫入網路政策日誌。

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

    helm upgrade --set nodeAgent.enablePolicyEventLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl

如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式kubectl,您可以更新組態以寫入網路政策日誌。

  1. 在您的編輯器中開啟 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  2. 在 VPC CNI aws-nodeDaemonSet資訊清單中 args: aws-network-policy-agent 容器中true--enable-policy-event-logs=false命令引數中false,將 取代為 。

    - args: - --enable-policy-event-logs=true

將網路政策日誌傳送到 Amazon CloudWatch Logs

您可以使用 Amazon CloudWatch Logs 這一類服務來監控網路政策日誌。您可以使用下列方法將網路政策日誌傳送到 CloudWatch Logs。

對於 EKS 叢集,政策日誌將位於 下,/aws/eks/cluster-name/cluster/對於自我管理的 K8S 叢集,日誌將放置在 下/aws/k8s-cluster/cluster/

使用適用於 Kubernetes 的 Amazon VPC CNI 外掛程式傳送網路政策日誌

如果您啟用網路政策,系統會將第二個容器新增至節點代理程式aws-node Pod。此節點代理程式可以將網路政策日誌傳送到 CloudWatch Logs。

注意

網路政策日誌僅會由節點代理程式傳送。不包含 VPC CNI 製作的其他日誌。

先決條件
  • 將下列許可作為一節或個別政策新增至您用於 VPC CNI 的 IAM 角色。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:DescribeLogGroups", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
Amazon EKS 附加元件
AWS Management Console
  1. 開啟 Amazon EKS 主控台

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

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

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

  5. 設定 Amazon VPC CNI 頁面上:

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

    2. 展開選用組態設定

    3. 輸入最上層 JSON 金鑰 "nodeAgent":,且值為具有組態值中的金鑰 "enableCloudWatchLogs":"true" 的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用,日誌會傳送至 CloudWatch Logs:

      { "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true", } }

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

<shared id="consolelong"/>,顯示選用組態中具有網路政策和 CloudWatch Logs 的 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 '{"nodeAgent": {"enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true"}}'
自我管理附加元件
Helm

如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式helm,您可以更新組態,將網路政策日誌傳送至 CloudWatch Logs。

  1. 執行下列命令來啟用網路政策日誌,並將其傳送至 CloudWatch Logs。

    helm upgrade --set nodeAgent.enablePolicyEventLogs=true --set nodeAgent.enableCloudWatchLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
  1. 在您的編輯器中開啟 aws-node DaemonSet

    kubectl edit daemonset -n kube-system aws-node
  2. false 將 取代true為兩個命令引數--enable-cloudwatch-logs=false中的 ,--enable-policy-event-logs=false並在 VPC CNI aws-nodeDaemonSet資訊清單中args:aws-network-policy-agent容器中的 中取代 。

    - args: - --enable-policy-event-logs=true - --enable-cloudwatch-logs=true

使用 Fluent Bit 傳送網路政策日誌 DaemonSet

如果您在 中使用 Fluent Bit 從節點DaemonSet傳送日誌,您可以新增組態,以包含來自網路政策的網路政策日誌。您可以使用下列範例組態:

[INPUT] Name tail Tag eksnp.* Path /var/log/aws-routed-eni/network-policy-agent*.log Parser json DB /var/log/aws-routed-eni/flb_npagent.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

包含的 eBPF 開發套件

適用於 Kubernetes 的 Amazon VPC CNI 外掛程式會在節點上安裝 eBPF SDK 工具集合。您可以使用 eBPF SDK 工具來識別網路政策的問題。例如,下列命令會列出目前在節點上執行的程式。

sudo /opt/cni/bin/aws-eks-na-cli ebpf progs

若要執行此命令,您可以使用任何方法連接到節點。

已知問題和解決方案

下列各節說明 Amazon VPC CNI 網路政策功能及其解決方案的已知問題。

儘管 enable-policy-event-logs 設定為 false,但產生的網路政策日誌

問題:即使enable-policy-event-logs設定設為 ,EKS VPC CNI 也會產生網路政策日誌false

解決方案enable-policy-event-logs設定只會停用政策「決策」日誌,但不會停用所有網路政策代理程式日誌記錄。此行為記錄在 GitHub 上的 aws-network-policy-agent README 中。若要完全停用記錄,您可能需要調整其他記錄組態。

網路政策映射清除問題

問題:刪除 Pod 後,網路policyendpoint仍然存在且無法清除的問題。

解決方案:此問題是由 VPC CNI 附加元件 1.19.3-eksbuild.1 版的問題所造成。更新至較新版本的 VPC CNI 附加元件以解決此問題。

未套用網路政策

問題:在 Amazon VPC CNI 外掛程式中啟用網路政策功能,但網路政策未正確套用。

如果您建立網路政策,kind: NetworkPolicy但不會影響 Pod,請檢查政策端點物件是否在與 Pod 相同的命名空間中建立。如果命名空間中沒有policyendpoint物件,則網路政策控制器 (EKS 叢集的一部分) 無法為要套用的網路政策代理程式 (VPC CNI 的一部分) 建立網路政策規則。

解決方案:解決方案是修正 VPC CNI (ClusterRoleaws-node) 和網路政策控制器 (ClusterRoleeks:network-policy-controller) 的許可,並在 Kyverno 等任何政策強制執行工具中允許這些動作。確保 Kyverno 政策不會封鎖policyendpoint物件的建立。如需 中必要許可的許可,請參閱上一節新的 policyendpoints CRD 和許可

在嚴格模式下刪除政策後,Pod 不會返回預設拒絕狀態

問題:在嚴格模式下啟用網路政策時,Pod 會從預設拒絕政策開始。套用政策後,允許流量到指定的端點。不過,刪除政策時,Pod 不會返回預設拒絕狀態,而是進入預設允許狀態。

解決方案:此問題已在 VPC CNI 1.19.3 版中修正,其中包括網路政策代理程式 1.2.0 版。修正後,在啟用嚴格模式的情況下,一旦移除政策,Pod 會如預期回到預設拒絕狀態。

Pod 啟動延遲的安全群組

問題:在 EKS 中使用 Pod 安全群組功能時,Pod 啟動延遲會增加。

解決方案:延遲是由於資源控制器中CreateNetworkInterface來自 API 上的 API 限流的速率限制,VPC 資源控制器用於為 Pod 建立分支 ENIs。檢查您帳戶的此操作 API 限制,並視需要考慮請求提高限制。

由於 vpc.amazonaws.com/pod-eni 不足而FailedScheduling

問題:Pod 無法以錯誤排程: FailedScheduling 2m53s (x28 over 137m) default-scheduler 0/5 nodes are available: 5 Insufficient vpc.amazonaws.com/pod-eni. preemption: 0/5 nodes are available: 5 No preemption victims found for incoming pod.

解決方案:與上一個問題一樣,將安全群組指派給 Pod 會增加 Pod 排程延遲,並且可能會增加超過 CNI 閾值的時間來新增每個 ENI,導致啟動 Pod 的失敗。這是使用 Pod 安全群組時的預期行為。設計工作負載架構時,請考慮排程的影響。

IPAM 連線問題和分割錯誤

問題:發生多個錯誤,包括 IPAM 連線問題、限流請求和分割錯誤:

  • Checking for IPAM connectivity …​

  • Throttling request took 1.047064274s

  • Retrying waiting for IPAM-D

  • panic: runtime error: invalid memory address or nil pointer dereference

解決方案:如果您systemd-udev在 AL2023 上安裝 ,就會發生此問題,因為檔案會以中斷政策重新寫入。當更新到具有更新套件或手動更新套件本身releasever的不同 時,可能會發生這種情況。避免在 AL2023 節點systemd-udev上安裝或更新 。

無法依名稱尋找裝置錯誤

問題:錯誤訊息: {"level":"error","ts":"2025-02-05T20:27:18.669Z","caller":"ebpf/bpf_client.go:578","msg":"failed to find device by name eni9ea69618bf0: %!w(netlink.LinkNotFoundError={0xc000115310})"}

解決方案:此問題已在最新版本的 Amazon VPC CNI 網路政策代理程式 (v1.2.0) 中識別和修正。更新至 VPC CNI 的最新版本,以解決此問題。

Multus CNI 映像中的 CVE 漏洞

問題:增強型 EKS ImageScan CVE 報告可識別 Multus CNI 映像版本 v4.1.4-eksbuild.2_thick 中的漏洞。

解決方案:更新至 Multus CNI 映像的新版本,以及沒有漏洞的新網路政策控制器映像。您可以更新掃描器,以解決先前版本中找到的漏洞。

日誌中的流程資訊 DENY 判定

問題:網路政策日誌顯示 DENY 判定: {"level":"info","ts":"2024-11-25T13:34:24.808Z","logger":"ebpf-client","caller":"events/events.go:193","msg":"Flow Info: ","Src IP":"","Src Port":9096,"Dest IP":"","Dest Port":56830,"Proto":"TCP","Verdict":"DENY"}

解決方案:此問題已在新版本的網路政策控制器中解決。更新至最新的 EKS 平台版本,以解決記錄問題。

從 Calico 遷移後的 Pod-to-pod 通訊問題

問題:將 EKS 叢集升級至 1.30 版,並針對網路政策從 Calico 切換到 Amazon VPC CNI 之後,套用網路政策時 pod-to-pod 通訊會失敗。刪除網路政策時會還原通訊。

解決方案:VPC CNI 中的網路政策代理程式無法擁有與 Calico 相同的指定連接埠數量。請改用網路政策中的連接埠範圍。網路政策中每個通訊協定ingress:egress:選擇器中每個通訊協定的唯一連接埠組合數目上限為 24。使用連接埠範圍來減少唯一連接埠的數量,並避免此限制。

網路政策代理程式不支援獨立 Pod

問題:套用至獨立 Pod 的網路政策可能有不一致的行為。

解決方案:網路政策代理程式目前僅支援部署為部署/複本一部分的 Pod。如果網路政策套用至獨立 Pod,則行為中可能會有一些不一致。此頁面頂端、 考量事項 GitHub 的 aws-network-policy-agent GitHub 問題編號 327 GitHub。將 Pod 部署為部署或複本的一部分,以實現一致的網路政策行為。