如何排查 Amazon EKS 中的 Amazon EFS 卷挂载问题?

上次更新日期:2021 年 12 月 22 日

我在 Amazon Elastic Kubernetes Service(Amazon EKS)集群中挂载 Amazon Elastic File System(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"
  • "Output: Failed to resolve "fs-xxxxxx.efs.us-west-2.amazonaws.com" - check that your file system ID is correct"
  • "mount.nfs4: access denied by server while mounting 127.0.0.1:/"
  • "mount.nfs: Connection timed out"

如何排查此问题?

解决方法

在开始执行以下问题排查步骤之前,请确认您具备以下内容:

验证挂载目标的配置是否正确

确保在运行 EKS 节点的每个可用区中创建 EFS 挂载目标。例如,如果您的 Worker 节点跨 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.

确认与您的 EFS 文件系统关联的安全组是否允许 NFS 流量

与您的 EFS 文件系统关联的安全组必须具有入站规则,该规则允许来自集群 VPC 的 CIDR 的 NFS 流量(端口 2049)。如果 EFS 挂载目标的安全组不允许 NFS 流量,则挂载 EFS 文件系统的 pod 将返回类似以下内容的错误:

"mount.nfs: Connection timed out"

如果要将 pod 挂载到子目录,请确认是否在 EFS 文件系统中创建了该子目录

在持久性卷中添加子路径时,EFS CSI 驱动程序不会在 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

确认集群的 VPC 使用的是 Amazon DNS 服务器

当您使用 EFS CSI 驱动程序挂载 EFS 时,EFS CSI 驱动程序中的 EFS 挂载帮助程序要求 VPC 将 Amazon DNS 服务器用于 VPC。注意:EFS 服务的文件系统 DNS 有 AWS 架构限制。只有 Amazon 提供的 DNS 才能解析 EFS 服务的文件系统 DNS。

通过登录 Worker 节点并运行以下命令来验证 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>

注意:请将 region 替换为您的 AWS 区域。

如果集群 VPC 正在使用自定义 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.

使用限制性文件系统策略时,验证持久性卷定义中是否有“iam”挂载选项

在某些情况下,EFS 文件系统策略配置为将挂载权限限制为特定 IAM 角色。如果是这种情况,那么 EFS CSI 驱动程序中的 EFS 挂载帮助程序要求在挂载操作期间传递 -o iam 挂载选项。包含 spec.mountOptions 属性,以便 CSI 驱动程序可以添加 iam 挂载选项(从 GitHub 网站)。

PersistentVolume 规范示例:

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:/

验证 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_Driver_Policy

验证是否已创建集群的 IAM OIDC 提供程序,以及 IAM 角色是否具有执行 EFS API 调用所需的权限(从 GitHub 网站)。此外,还要验证 IAM 角色的信任策略是否信任服务账户 efs-csi-controller-sa

验证 EFS CSI 驱动程序 pod 是否正在运行

EFS CSI 驱动程序由作为部署运行的控制器 pod 和作为守护进程集运行的节点 pod 构成。运行以下命令以验证这些 pod 是否在您的集群中运行:

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

验证 pod 无法挂载文件系统的 EC2 Worker 节点的 EFS 挂载操作

登录到调度此 pod 的 Amazon EKS Worker 节点。然后,使用 EFS 挂载帮助程序尝试将 EFS 文件系统手动挂载到 Worker 节点。您可以运行下列命令来测试:

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

如果 Worker 节点可以挂载文件系统,请查看来自 CSI 控制器和 CSI 节点 pod 的 efs-plugin 日志。

查看 EFS CSI 驱动程序 pod 日志

查看 CSI 驱动程序 pod 日志以确定挂载失败的原因。如果无法挂载卷,请查看 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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?