Este tema proporciona respuestas a algunas preguntas frecuentes sobre los volúmenes de File Storage NAS (NAS).
¿Por qué el sistema muestra chown: Operation not permitted al montar un volumen NAS?
Problema
El sistema muestra chown: Operation not permitted cuando se monta un sistema de archivos NAS.
Causa
El rol que se usa para ejecutar el contenedor no tiene los permisos necesarios para gestionar el volumen NAS.
Solución
El usuario que inicia el proceso del contenedor no cuenta con permisos de root. Es necesario usar una cuenta root para ejecutar las operaciones chown y chgrp. Cuando el valor de
accessModesde un volumen persistente (PV) esReadWriteOnce, también puede utilizarsecurityContext.fsGrouppara configurar los permisos del volumen y la política de cambio de propietario en los pods. Para más información, consulte Configure volume permission and ownership change policy for Pods.Si el problema persiste después de usar una cuenta root, compruebe si el grupo de permisos del destino de montaje NAS establece los permisos de usuario en No Anonymity (no_squash). Esta configuración permite que los usuarios root accedan al sistema de archivos. Para más información, consulte Manage permission groups.
¿Qué debo hacer si la cola de tareas de alicloud-nas-controller está llena y no se pueden crear PV al usar un volumen NAS aprovisionado dinámicamente?
Problema
Al usar un volumen NAS aprovisionado dinámicamente, si la velocidad de creación de subdirectorios supera la de eliminación, la cola de tareas de alicloud-nas-controller puede llenarse. Como resultado, no se crean los PV.
Causa
En la configuración de la StorageClass que monta el volumen NAS aprovisionado dinámicamente, el parámetro reclaimPolicy tiene el valor Delete y el parámetro archiveOnDelete tiene el valor false.
Solución
Establezca archiveOnDelete en true. De este modo, cuando se elimina un PV, solo se modifica el nombre del subdirectorio montado en el sistema de archivos NAS. Los archivos dentro del subdirectorio no se eliminan.
Usted debe eliminar estos archivos manualmente. Por ejemplo, configure un nodo para que elimine automáticamente los archivos del directorio raíz según una programación. Otra opción es iniciar varios pods para eliminar de forma concurrente los archivos con formatos específicos en los subdirectorios.
¿Por qué tarda mucho tiempo en montarse un volumen NAS?
Problema
El montaje de un volumen NAS toma demasiado tiempo.
Causa
Si se cumplen las siguientes condiciones, se ejecuta la operación chmod o chown durante el montaje de los volúmenes, lo cual aumenta el tiempo de ejecución.
El parámetro AccessModes tiene el valor ReadWriteOnce en las plantillas del volumen persistente (PV) y de la solicitud de volumen persistente (PVC).
El parámetro securityContext.fsGroup está definido en la plantilla de la aplicación.
Solución
Si el parámetro securityContext.fsGroup está definido en la plantilla de la aplicación, elimine el parámetro fsGroup de la sección securityContext.
Si necesita configurar el identificador de usuario (UID) y el parámetro mode de los archivos en el directorio montado, monte el directorio manualmente en una instancia de Elastic Compute Service (ECS). Después, ejecute los comandos
chownychmodmediante la CLI y aprovisione el volumen NAS a través del plugin CSI. Para más información sobre cómo usar el plugin CSI para montar volúmenes NAS, consulte Use static NAS volumes o Use NAS dynamic volumes.Además de los métodos anteriores, en clústeres de Kubernetes 1.20 o versiones posteriores, establezca el parámetro fsGroupChangePolicy en OnRootMismatch. Así, la operación
chmodochownse ejecuta únicamente cuando el sistema inicia el pod por primera vez. El problema no ocurre al montar volúmenes NAS después de ese primer inicio. Para más información sobre fsGroupChangePolicy, consulte Set the security context for a pod or a container.
¿Qué debo hacer si no puedo crear ni modificar directorios en un volumen NAS?
Problema
No es posible crear ni modificar directorios dentro de un volumen NAS.
Causa
Los usuarios que no son root carecen de permisos para crear o modificar directorios en un PV.
Solución
Seleccione uno de los siguientes métodos para ejecutar el comando chmod o chown y modificar los permisos del directorio de montaje:
Inicie un init container con privilegios de root, monte un PV y ejecute el comando
chmodochownpara modificar los permisos del directorio de montaje. Después podrá crear y modificar directorios en el PV.Establezca el parámetro fsGroupChangePolicy en OnRootMismatch. Con esta configuración, cuando el sistema inicia el pod por primera vez, ejecuta el comando
chmodochownpara modificar los permisos del directorio de montaje. Luego podrá crear y modificar directorios en el PV.
¿Por qué el sistema muestra unknown filesystem type "xxx" al montar un volumen NAS?
Problema
El sistema muestra unknown filesystem type "xxx" cuando se monta un volumen NAS.
Causa
Las dependencias del volumen NAS no están instaladas en el nodo donde se despliega la aplicación.
Solución
Compruebe si el volumen NAS está configurado correctamente.
Para los volúmenes NAS, consulte Use CNFS to manage shared NAS volumes (recommended).
Para los volúmenes OSS, consulte Use an ossfs 1.0 static volume.
¿Por qué el sistema muestra NFS Stale File Handle cuando un cliente lee o escribe datos en un volumen NAS?
Problema
El sistema muestra NFS Stale File Handle cuando un cliente lee o escribe datos en un volumen NAS.
Causa
NAS no garantiza la consistencia de los datos después de montar un volumen NAS en un contenedor. Suponga que un volumen NAS está montado en dos clientes. El cliente 1 abre un archivo del volumen NAS para obtener el descriptor de archivo (FD). Si el cliente 2 elimina ese archivo, el cliente 1 no puede leerlo ni escribirlo, y el sistema muestra NFS Stale File Handle.
Solución
Debe resolver los problemas de consistencia de datos según los escenarios de su negocio.
¿Qué debo hacer si un pod que usa dos PVC para montar dos volúmenes NAS distintos permanece en el estado ContainerCreating?
Problema
El inicio de un pod que usa dos PVC para montar volúmenes NAS termina con errores, y el pod permanece en el estado ContainerCreating. El pod se inicia correctamente si se configura para usar solo uno de los PVC.
Causa
Los dos PV asociados a los dos PVC usan el mismo valor de spec.csi.volumeHandle. Por ello, kubelet no puede distinguirlos al procesar la lógica de montaje de los PV.
Solución
Establezca el parámetro spec.csi.volumeHandle de cada PV con el nombre real del PV correspondiente.
¿Cómo uso CSI para montar un sistema de archivos NAS con TLS habilitado?
NAS utiliza TLS para garantizar la seguridad de la transmisión de datos entre el cliente NAS y el servicio NAS, lo que evita el robo y la manipulación de la información. CSI le permite usar el cliente NAS (aliNAS) de Alibaba Cloud para montar volúmenes y habilitar TLS.
Precauciones
El cliente NAS emplea el proceso stunnel como capa de cifrado TLS. En aplicaciones de alto rendimiento, el proceso stunnel consume una gran cantidad de recursos de CPU para realizar el cifrado y descifrado. En casos extremos, cada operación de montaje ocupa un núcleo completo. Para más información, consulte Encryption in transit for NFS file systems.
Procedimiento
-
Instale el cliente NAS.
Modifique el ConfigMap del componente csi-plugin para reiniciar 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 -
Monte un volumen NAS aprovisionado estáticamente o uno aprovisionado dinámicamente con base en el siguiente código de ejemplo:
Montaje de un volumen NAS aprovisionado dinámicamente
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-tls mountOptions: - nolock,tcp,noresvport - vers=3 - tls # Add a TLS mount option. parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" mountProtocol: alinas # Declare to use the aliNAS client to mount the volume. 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: 20GiParámetro
Descripción
parameters.mountProtocol
Establezca este parámetro en alinas para usar el cliente aliNAS al montar el volumen. De forma predeterminada, el parámetro queda vacío y se utiliza NFS para el montaje.
mountOptions
Agregue la opción tls para habilitar TLS. Incluya esta opción únicamente cuando mountProtocol tenga el valor alinas. De forma predeterminada, TLS está deshabilitado.
Montaje de un volumen NAS aprovisionado estáticamente
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 # Enter the name of the PV. volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountProtocol: alinas # Declare to use the aliNAS client to mount the volume. mountOptions: - nolock,tcp,noresvport - vers=3 - tls # Add a 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-tlsParámetro
Descripción
spec.csi.volumeAttributes.mountProtocol
Establezca este parámetro en alinas para usar el cliente aliNAS al montar el volumen. De forma predeterminada, el parámetro queda vacío y se utiliza NFS para el montaje.
spec.mountOptions
Agregue la opción tls para habilitar TLS. Incluya esta opción únicamente cuando mountProtocol tenga el valor alinas. De forma predeterminada, TLS está deshabilitado.
¿Qué debo hacer si el desmontaje del volumen NAS excede el tiempo de espera y el pod permanece en el estado Terminating?
Problema
Al eliminar un pod con un volumen NAS montado, el volumen no se desmonta y el pod permanece en el estado Terminating.
Causa
El componente csi-plugin monta directamente el directorio /var/run. Ejecute el siguiente comando; si el resultado no está vacío, significa que el componente csi-plugin monta directamente el directorio /var/run.
kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'
Solución
Ejecute el siguiente comando para corregir manualmente el archivo YAML de csi-plugin y resolver el problema:
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'