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

3 分的閱讀內容
0

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

簡短描述

若要使用您的 CNI 外掛程式 (在 Kubernetes 網站上) 向工作節點上的 Pod 指派並執行 IP 位址,您必須具有下列組態:

  • AWS Identity and Access Management (IAM) 許可,包括連接至您工作節點之 IAM 角色的 CNI 政策。或者,您透過服務帳戶 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 版本

解決方法

確認 aws-node Pod 在每個工作節點是否處於「執行中」狀態

若要確認 aws-node Pod 在工作節點上是否處於執行中狀態,請執行下列命令:

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

如果命令輸出顯示 RESTARTS 計數為 0,則 aws-node Pod 處於執行中狀態。請嘗試確認子網路是否有足夠可用的 IP 位址部分中的步驟。

如果命令輸出顯示 RESTARTS 計數大於 0,請確認工作節點是否可以連線 Amazon EKS 叢集的 API 伺服器端點。執行下列命令:

curl -vk https://eks-api-server-endpoint-url

驗證與您的 Amazon EKS 叢集的連線

1.    確認您的工作節點的 Amazon EKS 安全群組設定已正確設定。如需詳細資訊,請參閱 Amazon EKS 安全群組要求和考量

2.    確認您子網路的工作節點的網路存取控制清單 (網路 ACL) 規則允許與 Amazon EKS API 伺服器端點進行通訊。

**重要:**允許連接埠 443 上的傳入和傳出流量。

3.    確認 kube-proxy Pod 在每個工作節點上處於執行中狀態:

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

4.    確認您的工作節點可以存取 Amazon EC2、Amazon ECR 和 Amazon S3 的 API 端點。

**注意:**透過公有端點AWS PrivateLink 來設定這些服務。

確認您的子網路有足夠的可用 IP 位址

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

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

**注意:**啟動 Pod 的子網路的 AvailableIpAddressCount 必須大於 0

檢查是否已達到安全群組限制

如果達到安全群組每個彈性網路介面的限制,則 Pod 聯網組態可能會失敗。

如需詳細資訊,請參閱 Amazon VPC 配額

確認您執行的是 CNI 外掛程式的最新穩定版本

若要確認您擁有最新版本的 CNI 外掛程式,請參閱更新用於 Kubernetes 自我管理附加元件的 Amazon VPC CNI 外掛程式

如需其他疑難排解,請參閱 AWS GitHub 問題頁面和 CNI 外掛程式的版本備註

檢查工作節點上 VPC CNI 外掛程式的日誌

如果您建立 Pod,但未指派 IP 位址給容器,則會收到下列錯誤:

failed to assign an IP address to container

若要檢查日誌,請前往 /var/log/aws-routed-eni/ 目錄,然後找到檔案名稱 plugin.logipamd.log

確認您的 kubelet 可提取 Docker 容器映像

如果您的 kubelet 沒有提取 kube-proxyamazon-k8s-cni 容器的 Docker 容器映像,則會收到下列錯誤:

network plugin is not ready: cni config uninitialized

確定您可以從工作節點連線 Amazon EKS API 伺服器端點。

確認 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 的值。如果設定為 0,則會收到下列錯誤:

如需詳細資訊,請參閱 GitHub 網站上的 CNI 組態變數

檢查子網路中的預留空間

**注意:**這僅在字首委派開啟時才適用。如果開啟了字首委派,請檢查下列記錄的錯誤訊息:

InsufficientCidrBlocks

確定子網路中有足夠可用的 /28 IP CIDR (16 個 IP) 區塊。所有 16 個 IP 都必須是連續的。如果您沒有 /28 範圍的連續 IP,則會收到 InsufficientCidrBlocks 錯誤。

若要解決錯誤,請建立新的子網路,然後從那裡啟動 Pod。此外,您也可以使用 Amazon EC2 子網路 CIDR 保留在具有指定字首的子網路中保留空間。如需詳細資訊,請參閱使用子網路 CIDR 保留

使用基礎設施即程式碼 (IaC) 進行的更新會隨著衝突而回復

如果您使用 Amazon EKS 受管附加元件,當衝突方法未定義時,使用下列服務的更新錯誤會回復:

正確的方法是 NONEOVERWRITEPRESERVE

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

節點處於「未就緒」狀態

當您有未處於執行中狀態的 aws-node 時,節點通常處於未就緒狀態。如需詳細資訊,請參閱如何將節點狀態從「未就緒」或「不明」狀態變更為「就緒」狀態?

自訂聯網組態挑戰

當自訂聯網為 VPC CNI 啟用時,ENIConfig 自訂資源定義 (CRD) 必須定義正確的子網路和安全群組。

若要驗證自訂聯網是否處於作用中狀態,請描述 kube-system 名稱空間中的 aws-node Pod。然後,查看下列環境變數是否設定為 true

AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG

如果自訂聯網處於作用中狀態,請檢查 CRD 是否已正確設定。

kubectl get ENIConfig -A -o yaml

描述與可用區域名稱相符的每個項目。子網路 ID 與 VPC 與工作節點位置相符。安全群組可存取或與叢集安全群組共用。如需最佳實務的詳細資訊,請參閱 GitHub 網站上的 Amazon EKS 最佳實務指南


AWS 官方
AWS 官方已更新 1 年前