Amazon EKS の Amazon EFS ボリュームのマウントに関する問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 12 月 22 日

Amazon Elastic Kubernetes Service (Amazon EKS) クラスターに Amazon Elastic File System (Amazon EFS) ボリュームをマウントすると、ポッドで次のエラーが発生します。

  • 「出力 mount.nfs4: mounting fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ 失敗、サーバーによって提供された理由: そのようなファイルまたはディレクトリはありません」
  • 「出力:「fs-xxxxxx.efs.us-west-2.amazonaws.com」を解決できませんでした - ファイルシステム ID が正しいことを確認してください」
  • 「mount.nfs4:127.0.0.1 のマウント中にサーバーによってアクセスが拒否されました:/」
  • 「mount.nfs: 接続がタイムアウトしました」

これを解決するにはどうすれば良いですか?

解決方法

次のトラブルシューティング手順を開始する前に、次のことを確認してください:

マウントターゲットが正しく設定されていることを確認します

EKSノードが実行されている各アベイラビリティーゾーンにEFS マウントターゲットを必ず作成してください。たとえば、ワーカーノードが us-east-1aus-east-1bに分散している場合は、マウントしようとしている EFS ファイルシステムの両方のアベイラビリティーゾーンにマウントターゲットを作成してください。マウントターゲットを正しく作成しないと、EFS ファイルシステムをマウントしている ポッド から次のようなエラーが返されます:

Output: Failed to resolve "fs-xxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct.

EFS ファイルシステムに関連付けられているセキュリティグループが NFS トラフィックを許可していることを確認します。

EFSファイルシステムに関連付けられているセキュリティグループには、クラスターの VPC の CIDR からの NFS トラフィック (ポート 2049) を許可するインバウンドルールが必要です。EFS マウントターゲットのセキュリティグループが NFS トラフィックを許可していない場合、EFS ファイルシステムをマウントするポッドは次のようなエラーを返します:

"mount.nfs: Connection timed out"

ポッドをサブディレクトリにマウントする場合は、EFS ファイルシステムにサブディレクトリが作成されていることを確認します

永続ボリュームにサブパスを追加する場合、EFS CSIドライバーは、マウント操作の一部としてEFSファイルシステムにサブディレクトリパスを作成しません。マウントオペレーションを成功させるには、ディレクトリがすでに存在している必要があります。サブパスがファイルシステムに存在しない場合、ポッドは次のエラーで失敗します:

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

クラスターの VPC が Amazon DNS サーバーを使用していることを確認します

EFS CSI ドライバーを使用して EFS をマウントする場合、EFS CSI ドライバーの EFS マウントヘルパーは VPC が VPC に Amazon DNS サーバーを使用する必要があります。注:EFS サービスのファイルシステム DNS には AWS アーキテクチャ上の制限があります。EFS サービスのファイルシステム DNS を解決できるのは、Amazon が提供する DNSのみです。

ワーカーノードにログインし、次のコマンドを実行して DNS サーバーを確認します:

nslookup fs-4fxxxxxx.efs.region.amazonaws.com <amazon provided DNS IP>
<amazon provided DNS IP = VPC network(10.0.0.0) range plus two>

注: リージョンをAWS リージョンに置き換えます。

クラスター VPC がカスタム DNS サーバーを使用している場合、すべての*.amazonaws.comリクエストを Amazon DNS サーバーに転送するようにカスタム DNS サーバーを設定する必要があります。これらのリクエストが転送されない場合、ポッドは次のようなエラーで失敗します:

Output: Failed to resolve "fs-4 fxxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct.

制限付きのファイルシステムポリシーを使用している場合は、パーシステントボリューム定義に「iam」マウントオプションがあることを確認します。

EFS ファイルシステムポリシーは、マウント許可を特定の IAM ロールに制限するように設定されている場合があります。この場合、EFS CSI ドライバーの EFS マウントヘルパーは、マウントオペレーション中に-o iam mount オプションを渡す必要があります。spec.mountOptions プロパティを含めて、CSI ドライバーが (GitHub Web サイトから) iam マウントオプションを追加できるようにします。

PersistentVolumeの仕様の例:

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

制限付きファイルシステムポリシーを使用するときに iamマウントオプションを追加しないと、ポッドは次のようなエラーで失敗します:

mount.nfs4: access denied by server while mounting 127.0.0.1:/

Amazon EFS CSI ドライバーコントローラーサービスアカウントに正しい IAM ロールのアノテーションが付けられており、IAM ロールに必要なアクセス許可があることを確認します

以下のコマンドを実行して、efs-csi-controllerポッドで使用されるサービスアカウントに正しいアノテーションが付いていることを確認します:

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

次のアノテーションがあることを確認します:

eks\.amazonaws\.com/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EFS_CSI_Driver_Policy

クラスターの IAM OIDC プロバイダーが作成され、IAM ロールに EFS API コールを実行するために必要な許可(GitHub Webサイトから)があることを確認します。 また、IAM ロールの信頼ポリシーがサービスアカウント efs-csi-controller-sa を信頼していることを確認します。

EFS CSI ドライバー ポッドが実行中であることを確認します。

EFS CSIドライバーは、デプロイメントとして実行されるコントローラーポッドと、デーモンセットとして実行されるノードポッドで構成されます。次のコマンドを実行して、これらの ポッドがクラスターで実行されているかどうかを確認します:

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

ポッドがファイルシステムのマウントに失敗している EC2 ワーカーノードからの EFS マウントオペレーションを確認します。

ポッドがスケジュールされている Amazon EKS ワーカーノードにログインします。次に、 EFS マウントヘルパーを使用して、EFS ファイルシステムをワーカーノードに手動でマウントしてみます。次のコマンドを実行してテストできます:

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

ワーカーノードがファイルシステムをマウントできる場合は、CSI コントローラーと CSI ノードポッドからの efs-plugin ログを確認します。

EFS CSI ドライバー ポッドログを確認します

CSI ドライバーポッドログを確認して、マウントの失敗の原因を特定します。ボリュームのマウントに失敗した場合は、efs-plugin ログを確認します。次のコマンドを実行して、efs-pluginコンテナログを取得します:

kubectl logs deployment/efs-csi-controller -n kube-system -c efs-plugin
kubectl logs daemonset/efs-csi-node -n kube-system -c efs-plugin

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?