本文为您介绍NAS存储卷常见问题的处理方法。
使用NAS存储卷时,提示chown: Operation not permitted
问题现象
使用NAS时,提示chown: Operation not permitted。
问题原因
您启动容器时使用的宿主机角色,没有修改NAS的权限。
解决方案
启动容器进程的用户无root权限,请使用root用户执行chown、chgrp操作。当PV的
accessModes
为ReadWriteOnce
时,还支持使用securityContext.fsGroup
为Pod配置卷访问权限和属主变更策略。具体操作,请参见为Pod配置卷访问权限和属主变更策略。如果使用root用户操作依然报错,请检查确保NAS挂载点的权限组已使用所有用户不匿名(no_squash)。具体操作,请参见管理权限组。
使用NAS动态存储卷时,Controller的任务队列已满且无法创建新的PV
问题现象
使用NAS动态存储卷时,若创建子目录写入速度快于Controller删除子目录速度,将可能导致Controller的任务队列阻塞且无法创建新的PV。
问题原因
当集群使用动态NAS存储卷时,配置的StorageClass回收策略reclaimPolicy为Delete且archiveOnDelete为false。
解决方案
将archiveOnDelete配置为true,当删除PV时只是修改NAS文件系统中子目录的名称,而不是真正删除文件。
具体的文件删除操作需要您自行处理,例如:在某个节点过载根目录启动定时删除机制,或启动多个Pod并发删除某种格式的子目录。
NAS存储卷挂载时间延长
问题现象
NAS存储卷挂载时间延长。
问题原因
同时满足以下配置时,挂载的PV及PVC将执行chmod或chown,导致挂载时间延长。
在PV及PVC模板中配置的参数AccessModes值为ReadWriteOnce。
在应用模板中配置了securityContext.fsgroup参数。
解决方案
若应用模板中配置了securityContext.fsgroup参数,请删除securityContext下的fsgroup参数。
若需要将挂载目录内文件变成期望的UID和mode,可以手动将目标目录挂载到一台ECS。关于ECS实例挂载文件系统,请参见通过控制台实现ECS实例一键挂载文件系统。再通过命令行执行
chown
和chmod
,完成后通过CSI使用NAS存储卷。关于如何通过CSI使用NAS存储卷,请参见使用NAS静态存储卷或使用NAS动态存储卷。对于1.20及之后版本的Kubernetes集群,除了上述两种解决方法外,也可通过将fsGroupChangePolicy配置为OnRootMismatch,这时只有在首次启动时才会执行
chmod
或chown
操作,导致存在挂载时间延长的问题,后续挂载OSS存储卷时挂载时间将恢复正常。关于fsGroupChangePolicy参数的更多信息,请参见为Pod或容器配置安全性上下文。
使用NAS存储卷时,无法创建或修改目录
问题现象
使用NAS存储卷时,无法创建或修改目录。
问题原因
非root用户无权写入PV,不允许创建或修改目录。
解决方案
您可以通过以下两种方式,使用命令chmod
或chown
修改挂载目录权限,然后再对目录进行操作。
使用root权限启动Init Container挂载PV,使用命令
chmod
或chown
修改挂载目录权限。通过将fsGroupChangePolicy配置为OnRootMismatch,在首次启动时会执行
chmod
或chown
命令来修改挂载目录权限。
当工作负载挂载NAS存储卷时,提示unknown filesystem type "xxx"
问题现象
当工作负载挂载NAS存储卷时,提示unknown filesystem type "xxx"。
问题原因
当前工作负载调度的节点未安装对应存储的依赖资源。
解决方案
检查存储卷相关配置是否正确。
关于NAS存储卷配置,请参见使用CNFS管理NAS共享存储卷(推荐)。
关于CPFS相关配置,请参见CPFS2.0静态卷。
关于OSS相关配置,请参见使用OSS静态存储卷。
读写文件时,提示NFS Stale File Handle
问题现象
客户端读写文件时,提示NFS Stale File Handle。
问题原因
容器挂载使用NAS存储卷时,NAS不会保证数据一致性。两个客户端挂载同一个NAS,客户端1打开文件获取文件的fd,若客户端2删除了当前文件,客户端1在读写文件时,会提示NFS Stale File Handle。
解决方案
NAS不会保证数据一致性,您需要根据业务场景自行解决数据一致性问题。
当Pod使用两个PVC挂载NAS存储卷时,Pod一直处于ContainerCreating状态
问题现象
当Pod使用两个PVC挂载NAS存储卷时,Pod无法正常启动,一直处于ContainerCreating状态。但使用其中任意一个PVC挂载时,可成功挂载。
问题原因
两个PVC关联的PV声明了同样的spec.csi.volumeHandle
,导致Kubelet在处理PV挂载逻辑时,始终将两个PV当成同一个对待。
解决方案
您需要修改spec.csi.volumeHandle
字段的值,使其和对应的PV Name保持一致。
如何通过CSI使用TLS挂载NAS文件系统?
NAS支持通过TLS协议保护客户端与NAS服务之间网络传输链路上的数据安全,确保数据在传输过程中不被窃取或篡改。CSI支持通过配置挂载协议为alinas来使用阿里云NAS客户端挂载存储卷,开启TLS挂载选项。
注意事项
NAS客户端工具使用Stunnel监听进程进行TLS加密代理。对于吞吐密集型应用,Stunnel监听进程会消耗大量CPU执行加解密操作。在极端情况下,每个挂载会占用一整个核。更多信息,请参见NFS协议文件系统传输加密。
使用方法
开启NAS客户端安装。
修改csi-plugin ConfigMap后重启csi-plugin。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: csi-plugin namespace: kube-system data: cnfs-client-properties: | alinas-utils=true EOF kubectl rollout restart ds -n kube-system csi-plugin
参考以下示例,进行NAS动态卷和NAS静态卷的挂载。
使用NAS动态卷示例
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-tls mountOptions: - nolock,tcp,noresvport - vers=3 - tls # 增加tls mount option。 parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" mountProtocol: alinas # 声明使用alinas客户端进行挂载。 provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-tls spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-tls resources: requests: storage: 20Gi
参数
说明
parameters.mountProtocol
设置为alinas,表示使用阿里云NAS客户端挂载;默认为空,表示使用NFS协议挂载。
mountOptions
增加参数tls表示开启TLS,此参数必须在mountProtocol为alinas时使用,默认不开启。
使用NAS静态卷示例
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas-tls labels: alicloud-pvname: pv-nas-tls spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必须与PV Name保持一致。 volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountProtocol: alinas # 声明使用alinas客户端进行挂载。 mountOptions: - nolock,tcp,noresvport - vers=3 - tls # 增加 tls mount option --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas-tls spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas-tls
参数
说明
spec.csi.volumeAttributes.mountProtocol
设置为alinas,表示使用阿里云NAS客户端挂载;默认为空,表示使用NFS协议挂载。
spec.mountOptions
增加参数tls表示开启TLS,此参数必须在mountProtocol为alinas时使用,默认不开启。