如何解决在 Amazon EKS 中挂载 Amazon EFS 卷时出现的问题?

3 分钟阅读
0

我想解决在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中挂载 Amazon Elastic File System (Amazon EFS) 卷时出现的错误。

解决方法

当您在 Amazon EKS 集群中挂载 Amazon EFS 卷时,您的容器组(pod)中可能会出现以下错误之一:

  • “输出:mount.nfs4:挂载 fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ 失败,服务器给出的原因: 没有这样的文件或目录”
  • “输出: 解析“fs-xxxxxx.efs.us-west-2.amazonaws.com”失败-检查您的文件系统编号是否正确”
  • “mount.nfs4:挂载 127.0.0.1:/ 时服务器拒绝访问”
  • “mount.nfs: 连接超时”
  • “无法连接或挂载卷:等待状态时超时”

在开始执行故障排除步骤之前,请验证以下条件是否已满足:

请验证相关挂载目标已正确配置

请务必在运行 EKS 节点的每个可用区中创建 EFS 挂载目标。例如,假设您的 Worker 节点分布在 us-east-1aus-east-1b 上。在这种情况下,请同时在两个可用区中为要挂载的 EFS 文件系统创建挂载目标。如果您未正确创建挂载目标,则挂载 EFS 文件系统的容器组(pod)会返回一个类似于以下消息的错误消息:

“输出: 解析“fs-xxxxxx.efs.us-west-2.amazonaws.com”失败-检查您的文件系统编号是否正确。”

验证与您的 EFS 文件系统和 Worker 节点关联的安全组是否允许 NFS 流量

您的 EFS 文件系统的安全组必须具有一个入站规则,允许来自您的集群 VPC 的 CIDR 的 NFS 流量。允许端口 2049 用于入站流量。

针对容器组(pod)无法挂载 EFS 卷的 Worker 节点,与其关联的安全组必须具有一个出站规则。具体而言,此出站规则必须允许 NFS 流量(端口 2049)到相关 EFS 文件系统。

如果该安全组不允许 NFS 流量,则挂载相关文件系统的容器组(pod)会返回以下错误:

  • “mount.nfs: 连接超时”
  • “无法连接或挂载卷:等待状态时超时”

如果您准备将容器组(pod)挂载到一个子目录,请验证是否已在您的 EFS 文件系统中创建了对应的子目录

您在永久卷中添加子目录路径时,EFS CSI 驱动程序不会在相关文件系统中创建对应的子目录路径。这些目录必须已经存在,挂载操作才能成功。如果相关文件系统中不存在对应的子目录路径,则容器组(pod)会失败并显示以下错误:

“输出:mount.nfs4:挂载 fs-18xxxxxx.efs.us-east-1.amazonaws.com:/path-in-dir:/ 失败,服务器给出的原因: 没有这样的文件或目录”

确认集群的 VPC 使用了亚马逊 DNS 服务器

当您使用 EFS CSI 驱动程序挂载 EFS 时,EFS 挂载助手会要求您的 VPC 使用亚马逊 DNS 服务器

**请注意:**EFS 服务的文件系统 DNS 具有 AWS 架构限制。只有亚马逊提供的 DNS 才能解析 EFS 服务的文件系统 DNS。

要验证 DNS 服务器,请登录到 Worker 节点并运行以下命令:

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

请注意:区域替换为您的 AWS 区域。将“亚马逊\ _提供的\ _DNS\ _IP”替换为您的 DNS IP 地址。默认情况下,这是 VPC 网址范围 (10.0.0.0) 加上 2。

如果集群 VPC 使用自定义的 DNS 服务器,则将此 DNS 服务器配置为将所有 *.amazonaws.com 请求转发到亚马逊 DNS 服务器。如果这些请求没有被转发,则容器组(pod)会失败,并显示一个类似于以下消息的错误消息:

“输出: 解析“fs-4 fxxxxxx.efs.us-west-2.amazonaws.com”失败-检查您的文件系统编号是否正确。”

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

在某些情况下,EFS 文件系统策略配置为限制特定的 IAM 角色的挂载权限。在这种情况下,EFS 挂载助手要求在挂载操作期间添加 -o iam 挂载选项。添加 spec.mountOptions 属性以允许 CSI 驱动程序添加 iam 挂载选项(来自 GitHub 网站)。

以下是一个 PersistentVolume 规范示例:

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

使用限制性文件系统策略时,如果您没有添加 iam 挂载选项,则容器组(pod)会失败,并显示一条类似于以下消息的错误消息:

“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-controler-sa 服务账户关联的 IAM 角色具有执行 EFS API 调用所需的权限(来自 GitHub 网站)。
  • 该 IAM 角色的信任策略信任此服务账户 efs-csi-controler-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 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
AWS 官方
AWS 官方已更新 1 年前