Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何解决在 Amazon EKS 中挂载 Amazon EFS 卷时出现的问题?
当我尝试在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中挂载 Amazon Elastic File System (Amazon EFS) 卷时收到错误。
解决方法
先决条件:
- 确保您的 Amazon EFS 文件系统在可用区的每个 Worker 节点子网中都有挂载目标。
- 确认您使用 efs.csi.aws.com 来定义 Amazon EFS 存储类别。有关详细信息,请参阅 GitHub 网站上的 EFS storage class(EFS 存储类别)。
- 验证您使用的是否为 PersistentVolumeClaim 和 PersistentVolume。有关详细信息,请参阅 GitHub 网站上的 PersistentVolumeClaim 和 PersistentVolume。
**注意:**如果您使用动态配置,则无需使用 PersistentVolumeClaim 和 PersistentVolume。有关信息,请参阅 GitHub 网站上的 Dynamic Provisioning(动态配置)。 - 确保已在 EKS 集群中安装 Amazon EFS CSI 驱动程序附加组件。
验证您是否已正确配置从 EKS Worker 节点到 Amazon EFS API 的网络
确保您可以从 EFS Worker 节点和 EFS 控制器容器组访问 Amazon EFS API。
如果您未将网络配置为访问 Amazon EFS API,则可能会收到以下错误消息之一:
- “failed to provision volume with StorageClass "xxxx": rpc error: code = DeadlineExceeded desc = context deadline exceeded”
- “Could not start amazon-efs-mount-watchdog, unrecognized init system "bash" Mount attempt x/3 failed due to timeout after 15 sec”
- “Unable to attach or mount volumes: timed out waiting for the condition”
如果您使用没有出站互联网访问权限的私有集群,则必须在您的 VPC 中包含 com.amazonaws.region.elasticfilesystem 虚拟私有云 (VPC) 端点。为 VPC 端点的安全组创建入站规则,允许流量从您的 Worker 节点和容器组子网流向端口 443。确认附加到 VPC 端点的策略具有所需的权限。
验证您是否已正确配置 Amazon EFS 挂载目标
确保已在 EKS 节点运行的每个可用区中创建 Amazon EFS 挂载目标。例如,如果您将 Worker 节点分布在 us-east-1a 和 us-east-1b 上,请在两个可用区中为要挂载的 EFS 文件系统创建挂载目标。
如果您未正确配置挂载目标,则可能会收到以下错误消息:
“Output: Failed to resolve "fs-xxxxxx.efs.us-east-1.amazonaws.com" - The file system mount target ip address cannot be found”
验证与您的 Amazon EFS 文件系统和 Worker 节点关联的安全组是否允许 NFS 流量
如果安全组不允许流量,则您可能会收到以下错误消息之一:
- “Could not start amazon-efs-mount-watchdog, unrecognized init system "bash" Mount attempt x/3 failed due to timeout after 15 sec”
- “failed to provision volume with StorageClass "xxxx": rpc error: code = DeadlineExceeded desc = context deadline exceeded”
- “Unable to attach or mount volumes: timed out waiting for the condition”
Amazon EFS 文件系统的安全组必须包含一条入站规则,允许来自您的集群 VPC 的无类别域间路由 (CIDR) 的网络文件系统 (NFS) 流量。允许端口 2049 用于入站流量。
针对容器组无法挂载 EFS 卷的 Worker 节点,与其关联的安全组必须包含一条出站规则。出站规则必须允许从端口 2049 到 EFS 文件系统的 NFS 流量。
验证您是否在 Amazon EFS 文件系统中创建了子目录路径
如果您在永久卷中添加子目录路径,Amazon EFS CSI 驱动程序不会在相关文件系统中创建子目录路径。文件系统中必须已经有子目录才能成功执行挂载操作。如果子目录不在文件系统中,则您可能会收到以下错误消息:
“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”
要验证子目录是否存在于 EFS 文件系统中,请将 EFS 文件系统挂载在 EC2 实例上并列出其内容。如果子目录不存在,请使用 mkdir 命令创建它。
确认集群的 VPC 是否使用 Amazon DNS 服务器
当您使用 Amazon EFS CSI 驱动程序挂载 EFS 卷时,必须为 VPC 使用 Amazon DNS 服务器。
**注意:**只有 Amazon 提供的 DNS 才能解析 Amazon EFS 服务的文件系统 DNS。
要验证 DNS 服务器,请登录到 Worker 节点,然后运行以下命令:
nslookup fs-4fxxxxxx.efs.region.amazonaws.com AMAZON_PROVIDED_DNS_IP
**注意:**请将 region 替换为您的 AWS 区域。将 AMAZON_PROVIDED_DNS_IP 替换为您的 DNS IP 地址。
如果自定义 DNS 服务器未转发请求,则您可能会收到以下错误消息:
“Output: Failed to resolve "fs-xxxxxx.efs.us-west-2.amazonaws.com" - The file system mount target ip address cannot be found”
如果集群 VPC 使用自定义的 DNS 服务器,请将此 DNS 服务器配置为将所有 *.amazonaws.com 请求转发到 Amazon DNS 服务器。
使用限制性文件系统策略时,请验证 PersistentVolume 定义中是否有 iam 挂载选项
使用限制性文件系统策略时,如果您没有添加 iam 挂载选项,则容器组会失败,并显示以下错误消息:
“mount.nfs4: access denied by server while mounting 127.0.0.1:/”
如果您已将 Amazon EFS 文件系统配置为仅允许特定的 AWS Identity and Access Management (IAM) 角色拥有挂载权限,请使用 -o iam 挂载。添加 spec.mountOptions 属性以允许 CSI 驱动程序添加 IAM 挂载选项。
示例:
apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv1 spec: mountOptions: - iam
验证是否已将 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_DriverRole
要确认该账户是否具有正确的 AWS Identity and Access Management (IAM) 角色和权限,请验证集群的 IAM OIDC 提供商。检查与 efs-csi-controler-sa 服务账户关联的 IAM 角色是否具有执行 EFS API 调用所需的权限。然后,验证该 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": { "StringLike": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
验证此 EFS CSI 驱动程序容器组是否正在运行
运行以下命令以验证这些容器组是否正在您的集群中运行:
kubectl get all -l app.kubernetes.io/name=aws-efs-csi-driver -n kube-system
在容器组无法挂载文件系统的 EC2 Worker 节点上检查 EFS 挂载操作
登录到容器组的 Amazon EKS Worker 节点。然后,使用 EFS 挂载助手手动将 EFS 文件系统挂载到该 Worker 节点。要测试挂载操作,请运行以下命令:
sudo mount -t efs -o tls file-system-dns-name efs-mount-point/
如果该 Worker 节点可以挂载相关文件系统,请查看来自 CSI 控制器和 CSI 节点容器组的 efs-plugin 日志。
查看 EFS 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
- 语言
- 中文 (简体)
