如何解決 Amazon EKS 的 Amazon VPC CNI 外掛程式問題?
Amazon Elastic Kubernetes Service (Amazon EKS) 的 Amazon Virtual Private Cloud (Amazon VPC) 容器網路介面 (CNI) 外掛程式有問題,我想解決。
解決方法
檢查您的許可與組態
若要讓 Amazon VPC CNI 外掛程式正常運作,您必須指派適當的 Pod IP 位址。
檢查您是否具有下列許可和組態:
- AWS Identity and Access Management (IAM) 許可,包括附加到工作節點 IAM 角色的 AmazonEKS_CNI_Policy。或者,您透過服務帳戶的 IAM 角色 (IRSA) 所提供的 IAM 許可。
- 可從工作節點連線的 Amazon EKS API 伺服器端點。
- 對 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Registry (Amazon ECR) 及 Amazon Simple Storage Service (Amazon S3) 的 API 端點的網路存取權。
- 您的子網路中有足夠的可用 IP 位址。
- 成功執行的 kube-proxy,以便 aws-node Pod 進入 Ready 狀態。
- 與 Amazon EKS 叢集版本一致的 kube-proxy 版本和 VPC CNI 版本。
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱 Troubleshooting errors for the AWS CLI (對 AWS CLI 錯誤進行疑難排解)。此外,請確認您使用的是最新版 AWS CLI。
檢查 aws-node Pod 狀態與日誌
VPC CNI 外掛程式會以 DaemonSet Pod 形式執行,在 kube-system 命名空間中稱為 aws-node。您叢集中的每個工作節點都會執行一個 aws-node Pod。
若要確認 aws-node Pod 是否正在每個工作節點上執行,請執行下列 kubectl get 命令:
kubectl get pods -n kube-system -l k8s-app=aws-node -o wide
注意: 請將 k8s-app=aws-node 替換為您的標籤選擇器。如需 get 命令的資訊,請參閱 Kubernetes 網站上的 kubectl get。
如果命令輸出顯示 RESTARTS 次數大於 0,請驗證容器狀態與錯誤訊息。執行下列 kubectl describe 命令:
kubectl describe pod aws-node-pod-name -n kube-system
注意: 請將 aws-node-pod-name 替換為您的 AWS 節點 Pod 名稱。如需 describe 命令的資訊,請參閱 Kubernetes 網站上的 kubectl describe。
如果 aws-node Pod 卡在 ContainerCreating 狀態,則 describe 命令的輸出可能會顯示下列錯誤訊息:
"Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"
若要解決此問題,請參閱為什麼 Amazon EKS Pod 卡在 ContainerCreating 狀態,並顯示「failed to create pod sandbox」錯誤?
若要檢視 aws-node Pod 的日誌並檢查錯誤,請執行下列其中一個 kubectl logs 命令:
kubectl logs daemonset/aws-node -n kube-system
-或-
kubectl logs aws-node-pod-name -n kube-system
注意: 請將 aws-node-pod-name 替換為您的 aws-node Pod 名稱。如需 logs 命令的資訊,請參閱 Kubernetes 網站上的 kubectl logs。
若要檢查工作節點上 VPC CNI 外掛程式日誌中的錯誤,請登入工作節點,然後前往 /var/log/aws-routed-eni/ 目錄。尋找檔名為 plugin.log 與 ipamd.log 的檔案。
若要確認工作節點是否可以存取您的 Amazon EKS 叢集的 API 伺服器端點,請使用 SSH 或 Session Manager (AWS Systems Manager 的功能) 來登入您的工作節點。
接著,執行下列命令:
curl -ivk https://eks-api-server-endpoint-url
注意: 請將 eks-api-server-endpoint-url 替換為您的 Amazon EKS API 伺服器端點網址。
檢查 VPC CNI 版本
檢查您的 VPC CNI 外掛程式版本是否為最新,並與您的 Amazon EKS 叢集版本相容。
若要檢查目前的 VPC CNI 版本,請執行下列命令:
kubectl describe daemonset aws-node -n kube-system | grep Image | cut -d "/" -f 2
將您目前的版本與 GitHub 網站上,Amazon VPC CNI 外掛程式版本中提供的最新版本進行比較。
如果您的版本已過時,請將 VPC CNI 外掛程式更新為最新版本。
驗證網路組態和需求
檢查您是否已正確設定 Amazon EKS 叢集的安全群組與子網路組態。
驗證安全群組規則
安全群組必須允許控制平面與資料平面之間的連線。
如果您對工作節點使用自訂安全群組,請檢查連接埠。最小節點群組規則允許來自控制平面安全群組的連接埠 10250 傳入流量,以及到控制平面安全群組的 443 傳出流量。如需更多資訊,請參閱Network security (網路安全性)。
如果 Pod 安全群組功能處於作用中狀態,請檢查您是否已達到安全群組配額。如果您達到每個彈性網路介面的安全群組配額,則您的 Pod 網路組態可能會失敗。
如需更多必要安全群組規則的資訊,請參閱檢視叢集的 Amazon EKS 安全群組需求。
驗證子網路組態
若要列出 VPC 中每個子網路中的可用 IP 位址,請執行下列 describe-subnets AWS CLI 命令:
aws ec2 describe-subnets --filters "Name=vpc-id,Values=VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'
注意: 請將 VPCID 替換為您的 VPC ID。
確認您子網路的工作節點的網路存取控制清單 (網路 ACL) 規則允許與 Amazon EKS API 伺服器進行通訊。如需更多如何設定網路 ACL 的資訊,請參閱 Control subnet traffic with network access control lists (使用網路存取控制清單控制子網路流量)。
確認您的控制平面子網路是否有足夠的可用 IP 位址。每個控制平面子網路都必須至少有六個可供 Amazon EKS 使用的 IP 位址。最佳實務是為每個子網路設定至少 16 個 IP 位址。在您啟動 Pod 的子網路中,AvailableIpAddressCount 必須大於 0。如需更多資訊,請參閱 Subnet requirements and considerations (子網路需求與注意事項)。
確認 kube-proxy Pod 處於 Running 狀態
kube-proxy Pod 必須正在執行以保持網路連線。
若要確認 kube-proxy 是否正在執行,請執行以下命令:
kubectl get pods -n kube-system -l k8s-app=kube-proxy
如果 kube-proxy 沒有在執行,請檢查 Pod 日誌中的錯誤:
kubectl logs -n kube-system POD-NAME
注意: 請將 POD-NAME 替換為您的 kube-proxy Pod 名稱。
確認 WARM_PREFIX_TARGET 的值
如果開啟了首碼委派,請檢查日誌檔案中是否有下列錯誤訊息:
"Error: Setting WARM_PREFIX_TARGET = 0 is not supported while WARM_IP_TARGET/MINIMUM_IP_TARGET is not set.Please configure either one of the WARM_{PREFIX/IP}_TARGET or MINIMUM_IP_TARGET env variable"
若要解決此問題,請將 WARM_PREFIX_TARGET 設定為大於或等於 1 的值。如果您開啟了首碼委派且 WARM_PREFIX_TARGET 值為 0,請執行下列命令將值更新為至少 1:
kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1
檢查子網路中的保留空間
開啟首碼委派後,請確認您的子網路中有足夠可用的 /28 IP CIDR 區塊。全部 16 個 IP 位址都必須連續。
也請檢查日誌檔案是否有下列錯誤訊息:
"InsufficientCidrBlocks"
若要解決此問題,請建立新的子網路,然後從新的子網路啟動 Pod。使用 Amazon EC2 子網路 CIDR 預留在已指派首碼的子網路內預留空間。
驗證自訂網路組態
若要判定您的 Amazon EKS 叢集是否啟用了自訂網路,請執行下列命令:
kubectl describe pod -n kube-system $(kubectl get pods -n kube-system -l k8s-app=aws-node -o jsonpath='{.items.metadata.name}')
如果此變數設為 True,則代表已啟用自訂網路。
如果自訂網路處於作用中狀態,您必須設定 ENIConfig CRD 以符合叢集的網路需求。
執行下列命令以擷取所有 ENIConfig CRD 的清單:
kubectl get ENIConfig -A -o yaml
若要描述特定的 ENIConfig,請執行下列命令:
kubectl describe ENIConfig eni-config-name
注意: 請將 eni-config-name 替換為您的 ENIConfig 名稱。
確認每個 ENIConfig 對於每個可用區域,都具有正確的子網路和安全群組組態。
確認 ENIConfig 中指定的子網路與工作節點的可用區域相符。
如需自訂網路的更多資訊,請參閱 Deploy Pods in alternate subnets with custom networking (使用自訂網路在備用子網路中部署 Pod)。
設定衝突解決方法以防止回復
當您將 AWS Cloud Development Kit (AWS CDK)、AWS CloudFormation 或 eksctl 與受管附加元件搭配使用時,請定義衝突解決方法以防止回復。
選擇下列其中一種方法:
- 如果您未定義方法,則預設值為 NONE。當系統偵測到衝突時,CloudFormation 堆疊的更新會回復,而且不會進行任何變更。
- 若要設定附加元件的預設組態,請使用 OVERWRITE 方法。當您從自行管理附加元件移轉到 Amazon EKS 受管附加元件時,您必須使用 OVERWRITE。
- 當您使用自訂定義的組態時,例如 WARM_IP_TARGET 或自訂網路,請使用 PRESERVE 方法。
若要設定衝突解決方案方法,請參閱 Update add-on (AWS Console) (更新附加元件 (AWS 主控台))。
- 語言
- 中文 (繁體)

This article was reviewed and updated on 2026-03-06.
相關內容
已提問 3 年前
已提問 24 天前