本文介绍使用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挂载点的权限组允许使用root用户访问文件系统,即用户权限配置为用户不匿名(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
操作,后续挂载NAS存储卷时挂载时间将恢复正常。关于fsGroupChangePolicy
参数的更多信息,请参见为Pod或容器配置安全性上下文。
挂载NAS存储卷时,提示unknown filesystem type "xxx"
问题现象
挂载NAS存储卷时,提示unknown filesystem type "xxx"
。
问题原因
当前Pod调度的节点未安装对应存储的依赖资源。
解决方案
检查存储卷相关配置是否正确。
Pod使用两个PVC挂载NAS存储卷时,一直处于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协议文件系统传输加密。
修改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
时使用,默认不开启。
多个容器应用是否可以使用同一个NAS存储卷?
NAS为共享存储,可以同时为多个Pod提供共享存储服务,即一个PVC可以同时被多个应用使用。
关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
关于如何挂载NAS存储卷,请参见创建CNFS管理NAS文件系统(推荐)、使用NAS静态存储卷、使用NAS动态存储卷。
使用
使用NAS存储卷时,无法创建或修改目录
问题现象
使用NAS存储卷时,无法创建或修改目录。
问题原因
非root用户无权写入PV,不允许创建或修改目录。
解决方案
您可以通过以下两种方式,使用chmod
或chown
命令修改挂载目录权限,然后再对目录进行操作。
使用root权限启动Init Container挂载PV,使用
chmod
或chown
命令修改挂载目录权限。将
fsGroupChangePolicy
配置为OnRootMismatch
,则在首次启动时会自动执行chmod
或chown
命令来修改挂载目录权限。
读写文件时,提示NFS Stale File Handle
问题现象
客户端读写文件时,提示NFS Stale File Handle
。
问题原因
容器挂载使用NAS存储卷时,NAS不会保证数据一致性。两个客户端挂载同一个NAS,客户端1打开文件获取文件的fd,此时若客户端2删除了当前文件,则客户端1在读写文件时,会提示NFS Stale File Handle。
解决方案
NAS不会保证数据一致性,您需要根据业务场景自行解决数据一致性问题。
卸载
卸载NAS存储卷超时,Pod一直处于Terminating状态
问题现象
删除挂载了NAS存储卷的Pod时,无法卸载NAS存储卷,Pod一直处于Terminating状态。
问题原因
由于csi-plugin直接挂载了/var/run
导致。可通过以下命令确认,若输出不为空,则存在直接挂载/var/run
。
kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'
解决方案
请通过以下命令手动修复csi-plugin的YAML文件,修复之后问题即可解决。
kubectl patch -n kube-system daemonset csi-plugin -p '
spec:
template:
spec:
containers:
- name: csi-plugin
volumeMounts:
- mountPath: /host/var/run/efc
name: efc-metrics-dir
- mountPath: /host/var/run/ossfs
name: ossfs-metrics-dir
- mountPath: /host/var/run/
$patch: delete
volumes:
- name: ossfs-metrics-dir
hostPath:
path: /var/run/ossfs
type: DirectoryOrCreate
- name: efc-metrics-dir
hostPath:
path: /var/run/efc
type: DirectoryOrCreate
- name: fuse-metrics-dir
$patch: delete'