跳至內容

如何解決 Amazon EKS 的 Amazon VPC CNI 外掛程式問題?

3 分的閱讀內容
0

我想解決 Amazon Elastic Kubernetes Service (Amazon EKS) 的 Amazon VPC CNI 外掛程式問題。

解決方法

Amazon EKS 需要正確的 Pod IP 指派,Amazon Virtual Private Cloud (Amazon VPC) Container Network Interface (CNI) 外掛程式才能正常運作。若要解決 VPC CNI 外掛程式問題,請驗證以下組態:

  • AWS Identity and Access Management (IAM) 權限,包括附加到工作節點 IAM 角色的 AmazonEKS_CNI_Policy。或者,您透過服務帳戶 IAM 角色提供的 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 才能進入就緒狀態。
  • 與 Amazon EKS 叢集版本一致的 Kube-proxy 版本VPC CNI 版本

請完成以下疑難排解步驟,以解決 VPC CNI 外掛程式問題。

驗證 aws-node Pod 處於「執行中」狀態

VPC CNI 外掛程式會以名為 aws-node 的 DaemonSet Pod 在 kube-system 命名空間中執行。您叢集中的每個工作節點都會執行一個 aws-node Pod。

  1. 若要驗證每個工作節點上的 aws-node Pod 是否正在執行,請執行以下命令:

    kubectl get pods -n kube-system -l k8s-app=aws-node -o wide

    **注意:**請將 k8s-app=aws-node 替換為您的標籤選取器。

  2. 如果命令輸出顯示 RESTARTS 計數大於 0,請驗證容器狀態和錯誤訊息。執行以下 describe 命令:

    kubectl describe pod aws-node-pod-name -n kube-system

    **注意:**請將 aws-node-pod-name 替換為您的 AWS 節點 Pod 名稱。

  3. 如果 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」錯誤?中的步驟

  4. 若要檢視 aws-node Pod 的日誌,請執行以下 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 名稱。

  5. 檢查工作節點上 VPC CNI 外掛程式的日誌。登入工作節點,然後前往 /var/log/aws-routed-eni/ 目錄。找出名為 plugin.logipamd.log 的檔案,然後檢查這些檔案中的日誌。

  6. 驗證工作節點是否可連線到您的 Amazon EKS 叢集 API 伺服器端點。若要登入工作節點,請使用 SSH 或 AWS Systems Manager Session 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 VPC CNI (Amazon EKS 附加元件)

驗證網路組態和需求

檢查您的 Amazon EKS 叢集安全群組和子網路組態是否設定正確。

驗證安全群組規則

安全群組必須允許控制平面與資料平面之間的連線。

如果您對工作節點使用自訂安全群組,請檢查連接埠。最小節點群組規則允許來自控制平面安全群組的連接埠 10250 傳入流量,以及到控制平面安全群組的 443 傳出流量。如需更多資訊,請參閱網路安全性

如果 Pod 安全群組功能已啟用,請檢查您的安全群組限制是否已達上限。如果您達到每個彈性網路介面的安全群組限制,您的 Pod 網路組態可能會失敗。如需更多資訊,請參閱 Amazon VPC 配額

如需更多必要安全群組規則的資訊,請參閱檢視叢集的 Amazon EKS 安全群組需求

驗證子網路組態

若要列出 Amazon VPC ID 中每個子網路的可用 IP 位址,請執行以下命令:

aws ec2 describe-subnets —filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'

驗證工作節點子網路的網路存取控制清單規則,是否允許與 Amazon EKS API 伺服器通訊。如需更多如何設定網路 ACL 的資訊,請參閱使用網路存取控制清單控制子網路流量

驗證您的控制平面子網路是否有足夠的可用空閒 IP 位址。每個控制平面子網路都必須至少有六個可供 Amazon EKS 使用的 IP 位址。不過,AWS 建議每個子網路至少有 16 個 IP 位址。Pod 啟動所在子網路的 AvailableIpAddressCount 必須大於 0。如需更多資訊,請參閱子網路需求與考量事項

驗證 kube-proxy Pod 處於「執行中」狀態

kube-proxy Pod 必須正在執行,網路連線才能正常運作。

若要驗證 kube-proxy 是否正在執行,請執行以下命令:

kubectl get pods -n kube-system -l k8s-app=kube-proxy

確認所有 kube-proxy Pod 都處於「執行中」狀態。如果 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 保留,在具有已指派首碼的子網路內保留空間。如需更多資訊,請參閱子網路 CIDR 保留

驗證自訂網路組態

若要判斷您的 Amazon EKS 叢集是否已啟用自訂網路,請執行以下命令:

kubectl describe pod -n kube-system $(kubectl get pods -n kube-system -l k8s-app=aws-node -o jsonpath='{.items[0].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 中指定的子網路與工作節點的可用區域相符。

如需自訂網路的更多資訊,請參閱使用自訂網路將 Pod 部署到替代子網路

設定衝突解決方法以防止回復

當您將 AWS Cloud Development Kit (AWS CDK)、AWS CloudFormation 或 eksctl 與受管附加元件搭配使用時,請定義衝突解決方法以防止回復。

正確的方法為 NONEOVERWRITEPRESERVE

  • 如果未定義方法,預設值則為 NONE。當系統偵測到衝突時,CloudFormation 堆疊的更新會回復,而且不會進行任何變更。
  • 若要為附加元件設定預設組態,請使用 overwrite 方法。當您從自行管理附加元件移轉到 Amazon EKS 受管附加元件時,您必須使用 OVERWRITE
  • 當您使用自訂定義的組態時,例如 WARM_IP_TARGET 或自訂網路,請使用 PRESERVE 方法。

如需設定衝突解決方法的更多資訊,請參閱更新 Amazon EKS 附加元件

AWS 官方已更新 3 個月前