如何對 Amazon EKS 中 Amazon EFS 磁碟區掛載問題進行疑難排解?

3 分的閱讀內容
0

我想要針對在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中掛載 Amazon Elastic File System (Amazon EFS) 磁碟區時發生的錯誤進行疑難排解。

解決方法

當您在 Amazon EKS 叢集中掛載 Amazon EFS 磁碟區時,可能會在 Pod 出現下列其中一個錯誤:

  • 「Output: mount.nfs4: mounting fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ failed, reason given by server: No such file or directory (輸出:mount.nfs4: mounting fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ 失敗,伺服器給出的原因: 沒有此類檔案或目錄)」
  • 「Output: Failed to resolve "fs-xxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct (輸出:無法解析 "fs-xxxxxx.efs.us-west-2.amazonaws.com" – 請檢查您的檔案系統 ID 是否正確)」
  • 「mount.nfs4: access denied by server while mounting 127.0.0.1:/ (mount.nfs4︰掛載 127.0.0.1:/ 時伺服器拒絕存取)」
  • 「mount.nfs: Connection timed out (mount.nfs:連線逾時)」
  • 「Unable to attach or mount volumes: timed out waiting for the condition (無法連接或掛載磁碟區:等待條件逾時)」

開始疑難排解步驟之前,請確認您具有下列先決條件:

確認掛載目標是否設定正確

請務必在執行 EKS 節點的每個可用區域中建立 EFS 掛載目標。例如,假設您的工作節點分佈在 us-east-1aus-east-1b。在此情況下,請在您要掛載的 EFS 檔案系統的兩個可用區域中建立掛載目標。如果未正確建立掛載目標,則掛載 EFS 檔案系統的 Pod 會傳回類似於以下訊息的錯誤:

「Output: Failed to resolve "fs-xxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct (輸出:無法解析 "fs-xxxxxx.efs.us-west-2.amazonaws.com" – 請檢查您的檔案系統 ID 是否正確)」

確認與您的 EFS 檔案系統和工作節點相關聯的安全群組是否允許 NFS 通訊

EFS 檔案系統的[安全群組必須具有輸入規則](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#adding-security-group-rules),允許叢集 VPC 的 CIDR 傳輸 NFS 流量。允許連接埠 2049 用於輸入流量。

與 Pod 無法掛接 EFS 磁碟區的工作者節點相關聯的安全群組必須具有輸出規則。具體而言,此輸出規則必須允許將 NFS 流量 (連接埠 2049) 傳輸至 EFS 檔案系統。

如果安全群組不允許 NFS 流量,則掛載檔案系統的 Pod 會傳回下列錯誤:

  • 「mount.nfs: Connection timed out (mount.nfs:連線逾時)」
  • 「Unable to attach or mount volumes: timed out waiting for the condition (無法連接或掛載磁碟區:等待條件逾時)」

如果要將 Pod 掛載到子目錄,確認是否在 EFS 檔案系統中建立子目錄

當您在持續性磁碟區中新增子路徑時,EFS CSI 驅動程式不會在檔案系統中建立子目錄路徑。目錄必須已存在,掛載作業才能成功。如果子路徑不存在於檔案系統中,則 Pod 會失敗並顯示以下錯誤:

「Output: mount.nfs4: mounting fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ failed, reason given by server: No such file or directory (輸出:mount.nfs4: mounting fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ 失敗,伺服器給出的原因: 沒有此類檔案或目錄)」

確認叢集的 VPC 是使用 Amazon DNS 伺服器

使用 EFS CSI 驅動程式掛接 EFS 時,EFS 掛載協助程式會要求您使用適用於虛擬私人雲端的 Amazon DNS 伺服器

**注意:**EFS 服務的檔案系統 DNS 有 AWS 架構限制。只有 Amazon 提供的 DNS 可以解析 EFS 服務的檔案系統 DNS。

若要驗證 DNS 伺服器,請登入 Worker 節點並執行下列命令:

nslookup fs-4fxxxxxx.efs.region.amazonaws.com AMAZON\_PROVIDED\_DNS\_IP

**注意:**以您的 AWS 區域取代 region (區域)。將 AMAZON_PROVIDED_DNS_IP 替換為您的 DNS IP 地址。依預設,這是虛擬私人雲端網路範圍 (10.0.0.0) 加上兩個。

如果叢集虛擬私人雲端使用自訂 DNS 伺服器,則將此 DNS 伺服器設定為將所有 *.amazonaws.com 要求轉寄至 Amazon DNS 伺服器。如果這些請求未轉傳,則 Pod 會失敗並顯示類似於以下訊息的錯誤:

「Output: Failed to resolve "fs-4 fxxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct (輸出:無法解析 "fs-4 fxxxxxx.efs.us-west-2.amazonaws.com" – 請檢查您的檔案系統 ID 是否正確)」

使用限制性檔案系統政策時,請確認持續性磁碟區定義中有「iam」掛載選項

在某些情況下,EFS 檔案系統政策會設定為將掛載權限限制為特定 IAM 角色。在此情況下,EFS 掛載協助程式會要求在掛載作業期間通過 -o iam 掛載選項。納入 spec.mountOptions 屬性,藉此允許 CSI 驅動程式加入 iam 掛載選項 (來自 GitHub 網站)。

下列範例是永久性磁碟區規格:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv1
spec:
  mountOptions:
    - iam
. . . . . .

如果您未使用限制性檔案系統原則新增** iam** 掛載選項,則 Pod 會失敗並顯示類似下列訊息的錯誤:

「mount.nfs4: access denied by server while mounting 127.0.0.1:/ (mount.nfs4︰掛載 127.0.0.1:/ 時伺服器拒絕存取)」

確認 Amazon EFS CSI 驅動程式控制器服務帳戶已使用正確的 IAM 角色註釋,且 IAM 角色具有必要的許可

若要確認 efs-csi-controller Pod 所使用的服務帳戶具有正確的註解,請執行下列命令:

kubectl describe sa efs-csi-controller-sa -n kube-system

確認下列註解存在:

eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKS\_EFS\_CSI\_DriverRole

確認您已完成下列步驟:

  • 您已為叢集建立 IAM OIDC 提供者。
  • efs-csi-csi-sa 服務帳戶相關聯的 IAM 角色具有執行 EFS API 呼叫的必要權限 (來自 GitHub 網站)。
  • IAM 角色的信任政策信任服務帳戶 efs-csi-controller-sa。IAM 角色的信任政策看起來必須如下列範例所示:
{
	"Version": "2012-10-17",
	"Statement": \[{
		"Effect": "Allow",
		"Principal": {
			"Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
		},
		"Action": "sts:AssumeRoleWithWebIdentity",
		"Condition": {
			"StringEquals": {
				"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
			}
		}
	}\]
}

確認 EFS CSI 驅動程式 Pod 是否正在執行

EFS CSI 驅動程式由作為部署執行的控制器 Pod,以及作為 DaemonSet 執行的節點 Pod 組成。執行以下命令,確認這些 Pod 是否在您的叢集中執行:

kubectl get all -l app.kubernetes.io/name=aws-efs-csi-driver -n kube-system

確認 Pod 無法掛載檔案系統的 EC2 工作節點的 EFS 掛載操作

登入到排程 Pod 的 Amazon EKS 工作節點。然後,使用 EFS 掛載協助程式,嘗試手動將 EFS 檔案系統掛載到工作節點。若要測試掛載作業,請執行下列命令:

sudo mount -t -efs -o tls file-system-dns-name efs-mount-point/

如果工作者節點可以掛載檔案系統,請檢閱 CSI 控制器和 CSI 節點 Pod 中的 efs-plugin 日誌。

檢查 EFS CSI 驅動程式 Pod 日誌

檢查 CSI 驅動程式 Pod 日誌,以確定掛載失敗的原因。如果磁碟區無法掛載,則請檢閱 efs-plugin 日誌。若要擷取 EFS 外掛程式容器日誌,請執行下列命令:

kubectl logs deployment/efs-csi-controller -n kube-system -c efs-plugin
kubectl logs daemonset/efs-csi-node -n kube-system -c efs-plugin
AWS 官方
AWS 官方已更新 1 年前