協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Amazon EKS 的 Kubernetes 網路政策進行故障診斷
這是 Amazon VPC CNI 網路政策功能的疑難排解指南。
本指南涵蓋:
-
安裝資訊、CRD 和 RBAC 許可 新的 policyendpoints CRD 和許可
-
診斷網路政策問題時要檢查的日誌 網路政策日誌
-
執行 eBPF SDK 工具集合以進行疑難排解
-
已知問題和解決方案 已知問題和解決方案
注意
請注意,網路政策僅適用於 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
檔案中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-node
DaemonSet
資訊清單中aws-network-policy-agent
容器的額外 1 個 vCPU。
Amazon EKS 附加元件
- AWS Management Console
-
-
開啟 Amazon EKS 主控台
。 -
在左側導覽窗格中,選取叢集,然後選取您要為其設定 Amazon VPC CNI 附加元件的叢集名稱。
-
選擇附加元件索引標籤。
-
選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。
-
在設定
Amazon VPC CNI
頁面上:-
在版本下拉式清單中,選取
v1.14.0-eksbuild.3
或更高版本。 -
展開選用組態設定。
-
輸入最上層 JSON 金鑰
"nodeAgent":
,且值為具有組態值中的金鑰"enablePolicyEventLogs":
與"true"
的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用,網路政策日誌會傳送至 CloudWatch Logs:{ "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "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 '{"nodeAgent": {"enablePolicyEventLogs": "true"}}'
-
自我管理附加元件
- Helm
-
如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式
helm
,您可以更新組態以寫入網路政策日誌。-
執行下列命令以啟用網路政策。
helm upgrade --set nodeAgent.enablePolicyEventLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
-
- kubectl
-
如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式
kubectl
,您可以更新組態以寫入網路政策日誌。-
在您的編輯器中開啟
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
在 VPC CNI
aws-node
DaemonSet
資訊清單中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/
對於自我管理的 K8S 叢集,日誌將放置在 下cluster-name
/cluster//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
-
-
開啟 Amazon EKS 主控台
。 -
在左側導覽窗格中,選取叢集,然後選取您要為其設定 Amazon VPC CNI 附加元件的叢集名稱。
-
選擇附加元件索引標籤。
-
選取附加元件方塊右上方的方塊,然後選擇 Edit (編輯)。
-
在設定
Amazon VPC CNI
頁面上:-
在版本下拉式清單中,選取
v1.14.0-eksbuild.3
或更高版本。 -
展開選用組態設定。
-
輸入最上層 JSON 金鑰
"nodeAgent":
,且值為具有組態值中的金鑰"enableCloudWatchLogs":
與"true"
的值之物件。產生的文字必須是有效的 JSON 物件。下列範例顯示網路政策和網路政策日誌已啟用,日誌會傳送至 CloudWatch Logs:{ "enableNetworkPolicy": "true", "nodeAgent": { "enablePolicyEventLogs": "true", "enableCloudWatchLogs": "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 '{"nodeAgent": {"enablePolicyEventLogs": "true", "enableCloudWatchLogs": "true"}}'
-
自我管理附加元件
- Helm
-
如果您已透過 安裝適用於 Kubernetes 的 Amazon VPC CNI 外掛程式
helm
,您可以更新組態,將網路政策日誌傳送至 CloudWatch Logs。-
執行下列命令來啟用網路政策日誌,並將其傳送至 CloudWatch Logs。
helm upgrade --set nodeAgent.enablePolicyEventLogs=true --set nodeAgent.enableCloudWatchLogs=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
-
- kubectl
-
-
在您的編輯器中開啟
aws-node
DaemonSet
。kubectl edit daemonset -n kube-system aws-node
-
false
將 取代true
為兩個命令引數--enable-cloudwatch-logs=false
中的 ,--enable-policy-event-logs=false
並在 VPC CNIaws-node
DaemonSet
資訊清單中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 (ClusterRole
:aws-node
) 和網路政策控制器 (ClusterRole
:eks: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