Intercalación práctica de K8s (18) -k8s almacenamiento NFS
1 Introducción a NFS
NFS es la abreviatura de Network File System, es decir, sistema de archivos de red. NFS es uno de los sistemas de archivos compatibles con FreeBSD. NFS se basa en la implementación de RPC (llamada a procedimiento remoto), que permite que un sistema comparta directorios y archivos con otros en la red. Al usar NFS, los usuarios y los programas pueden acceder a archivos en sistemas remotos como archivos locales. NFS es un sistema de archivos de red muy estable y portátil. Con características como escalabilidad y alto rendimiento, ha alcanzado estándares de calidad de aplicaciones a nivel empresarial. Debido al aumento de la velocidad de la red y la disminución de la latencia, el sistema NFS siempre ha sido una opción competitiva para proporcionar servicios de sistema de archivos a través de la red.
1.1 Principio NFS
NFS utiliza el mecanismo RPC (llamada a procedimiento remoto) para la implementación. RPC permite al cliente llamar a las funciones del servidor. Al mismo tiempo, debido a la existencia de VFS, el cliente puede utilizar el sistema de archivos NFS como otros sistemas de archivos normales. A través del kernel del sistema operativo, la solicitud de llamada del sistema de archivos NFS se envía al servicio NFS del servidor a través de TCP / IP. El servidor NFS realiza operaciones relacionadas y devuelve los resultados de la operación al cliente.
Los principales procesos del servicio NFS incluyen:
-
rpc.nfsd: el proceso NFS más importante, gestiona si el cliente puede iniciar sesión
-
rpc.mountd: montar y desmontar el sistema de archivos NFS, incluida la gestión de permisos
-
rpc.lockd: No es necesario, administre los bloqueos de archivos para evitar errores de escritura simultáneos
-
rpc.statd: no esencial, verifica la consistencia del archivo y repara los archivos
Las herramientas clave de NFS incluyen:
-
Archivo de configuración principal: / etc / export;
-
Comando de mantenimiento del sistema de archivos NFS: / usr / bin / exportfs;
-
Archivo de registro de recursos compartidos: / var / lib / nfs / * tab;
-
Comando de recurso compartido de consulta del cliente: / usr / sbin / showmount;
-
Configuración del puerto: / etc / sysconfig / nfs.
1.2 Configuración compartida
Cuando el archivo de configuración principal del servidor NFS es / etc / export, el directorio de archivos compartidos se puede configurar a través de este archivo de configuración. Cada registro de configuración consta de tres partes: directorio compartido NFS, dirección del cliente NFS y parámetros. El formato es el siguiente:
[Directorio compartido NFS] [dirección 1 del cliente NFS (parámetro 1, parámetro 2, parámetro 3 ...)] [dirección del cliente 2 (parámetro 1, parámetro 2, parámetro 3 ...)]
-
Directorio compartido de NFS: el directorio de archivos compartido en el servidor;
-
Dirección del cliente NFS: la dirección del cliente del servidor NFS al que se le permite acceder, que puede ser la dirección IP del cliente o un segmento de red (192.168.64.0/24);
-
Parámetros de acceso: elementos separados por comas entre paréntesis, principalmente algunas opciones de permisos.
1) Parámetros de autoridad de acceso
2) Cuadro de parámetros de asignación de usuarios
3) Otras tablas de parámetros de configuración
2 configuración del servidor NFS
Antes de que nfs se utilice como un sistema de almacenamiento de archivos en red, primero debe instalar los servicios nfs y rpcbind; luego, debe crear usuarios que usen el directorio compartido; luego, debe configurar el directorio compartido, que es un elemento relativamente importante y paso complicado; finalmente, es necesario iniciar los servicios rpcbind y nfs para el uso de la aplicación.
2.1 Instalar el servicio nfs
1) Instale el servicio nfs y el servicio rpcbind a través del directorio yum:
1 |
|
2) Verifique si el servicio nfs está instalado normalmente
1 |
|
2.2 Crear usuario
Agregue usuarios para el servicio NFS, cree un directorio compartido y configure el usuario para configurar los permisos de acceso del directorio compartido:
1 2 3 |
|
2.3 Configurar el directorio compartido
Configure el directorio compartido para el cliente en el servidor nfs:
1 |
|
La configuración entra en vigor ejecutando el siguiente comando:
1 |
|
2.4 Iniciar servicio
1) Debido a que el servicio rpcbind debe iniciarse primero, y luego el servicio nfs, para que el servicio nfs pueda registrarse correctamente en el servicio rpcbind:
1 |
|
2) Inicie el servicio nfs:
1 |
|
3) Configure rpcbind y nfs-server para que se inicien:
1 2 |
|
2.5 Verifique si el servicio nfs se inicia normalmente
1 2 |
|
3 NFS como volumen
nfs se puede utilizar directamente como un volumen de almacenamiento. A continuación se muestra un archivo de configuración YAML para la implementación de redis. En este ejemplo, los datos persistentes de redis en el contenedor se almacenan en el directorio / data; el volumen de almacenamiento usa nfs, la dirección de servicio de nfs es: 192.168.8.150 y la ruta de almacenamiento es: / k8s-nfs / redis / datos. El contenedor determina el volumen de almacenamiento utilizado por el valor de volumeMounts.name.
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
revisionHistoryLimit: 2
template:
metadata:
labels:
app: redis
spec:
containers:
# 应用的镜像
- image: redis
name: redis
imagePullPolicy: IfNotPresent
# 应用的内部端口
ports:
- containerPort: 6379
name: redis6379
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: REDIS_PASSWORD
value: "redis"
# 持久化挂接位置,在docker中
volumeMounts:
- name: redis-persistent-storage
mountPath: /data
volumes:
# 宿主机上的目录
- name: redis-persistent-storage
nfs:
path: /k8s-nfs/redis/data
server: 192.168.8.150
4 NFS como PersistentVolum
En la versión actual de Kubernetes, se puede crear un volumen de almacenamiento persistente de tipo nfs para proporcionar volúmenes de almacenamiento para PersistentVolumClaim. En el archivo de configuración de PersistenVolume YAML a continuación, se define un volumen de almacenamiento persistente llamado nfs-pv. Este volumen de almacenamiento proporciona espacio de almacenamiento 5G y solo puede ser leído y escrito por un PersistentVolumClaim. La dirección del servidor NFS que utiliza este volumen de almacenamiento persistente es 192.168.5.150 y la ruta de almacenamiento es / tmp.
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
# 此持久化存储卷使用nfs插件
nfs:
# nfs共享目录为/tmp
path: /tmp
# nfs服务器的地址
server: 192.168.5.150
El volumen de almacenamiento persistente anterior se puede crear ejecutando el siguiente comando:
kubectl create -f {path}/nfs-pv.yaml
Una vez que el volumen de almacenamiento se haya creado correctamente, estará en un estado utilizable, esperando a que PersistentVolumClaim lo use. PersistentVolumClaim seleccionará automáticamente el volumen de almacenamiento apropiado según el modo de acceso y el espacio de almacenamiento, y lo vinculará.
5 NFS se proporciona como almacenamiento dinámico
5.1 comisiones fs nfs
Seleccione el volumen de almacenamiento para almacenar el estado y los datos para la instancia nfs-provisioner y adjunte el volumen de almacenamiento al comando / export del contenedor.
...
volumeMounts:
- name: export-volume
mountPath: /export
volumes:
- name: export-volume
hostPath:
path: /tmp/nfs-provisioner
...
Elija un nombre de proveedor para StorageClass y configúrelo en deploy / kubernetes / deployment.yaml.
args:
- "-provisioner=example.com/nfs"
...
El contenido del archivo deployment.yaml completo es el siguiente:
kind: Service
apiVersion: v1
metadata:
name: nfs-provisioner
labels:
app: nfs-provisioner
spec:
ports:
- name: nfs
port: 2049
- name: mountd
port: 20048
- name: rpcbind
port: 111
- name: rpcbind-udp
port: 111
protocol: UDP
selector:
app: nfs-provisioner
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
containers:
- name: nfs-provisioner
image: quay.io/kubernetes_incubator/nfs-provisioner:v1.0.8
ports:
- name: nfs
containerPort: 2049
- name: mountd
containerPort: 20048
- name: rpcbind
containerPort: 111
- name: rpcbind-udp
containerPort: 111
protocol: UDP
securityContext:
capabilities:
add:
- DAC_READ_SEARCH
- SYS_RESOURCE
args:
# 定义提供者的名称,存储类通过此名称指定提供者
- "-provisioner=nfs-provisioner"
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: SERVICE_NAME
value: nfs-provisioner
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
imagePullPolicy: "IfNotPresent"
volumeMounts:
- name: export-volume
mountPath: /export
volumes:
- name: export-volume
hostPath:
path: /srv
Después de configurar el archivo deploy / kubernetes / deployment.yaml, implemente nfs-provisioner en el clúster de Kubernetes mediante el comando kubectl create.
kubectl create -f {path}/deployment.yaml
5.2 Crear StorageClass
El siguiente es el archivo de configuración StorageClass de example-nfs. Este archivo de configuración define una clase de almacenamiento llamada nfs-storageclass. El proveedor de esta clase de almacenamiento es nfs-provisioner.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storageclass
provisioner: nfs-provisioner
Utilice el archivo de configuración anterior para crear con el comando kubectl create -f:
# kubectl create -f deploy/kubernetes/class.yaml
storageclass “example-nfs” created
Una vez que la clase de almacenamiento se crea correctamente, puede crear un PersistenetVolumeClaim para solicitar StorageClass, y StorageClass creará automáticamente un PersistentVolume disponible para PersistenetVolumeClaim.
5.3 Crear PersistenetVolumeClaim
PersistenetVolumeClaim es una declaración para PersistenetVolume, es decir, PersistenetVolume es el proveedor de almacenamiento y PersistenetVolumeClaim es el consumidor de almacenamiento. El siguiente es el archivo de configuración YAML de PersistentVolumeClaim. Este archivo de configuración especifica la clase de almacenamiento utilizada por el campo metadata.annotations []. Volume.beta.kubernetes.io/storage-class.
En este archivo de configuración, use la clase de almacenamiento nfs-storageclass para crear PersistenetVolume para PersistenetVolumeClaim. El espacio de almacenamiento de PersistenetVolume requerido es 1Mi, que se puede leer y escribir en varios contenedores.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
annotations:
volume.beta.kubernetes.io/storage-class: "nfs-storageclass"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
Cree la declaración de volumen de almacenamiento persistente antes mencionada mediante el comando kubectl create:
1 |
|
5.4 Crear una implementación usando PersistenVolumeClaim
Defina aquí un archivo de configuración YAML de implementación llamado busybox-deployment, y la imagen utilizada es busybox. Los contenedores basados en la imagen de busybox deben conservar los datos en el directorio / mnt. Especifique PersistenVolumeClaim llamado nfs en el archivo YAML para conservar los datos del contenedor.
# This mounts the nfs volume claim into /mnt and continuously
# overwrites /mnt/index.html with the time and hostname of the pod.
apiVersion: v1
kind: Deployment
metadata:
name: busybox-deployment
spec:
replicas: 2
selector:
name: busybox-deployment
template:
metadata:
labels:
name: busybox-deployment
spec:
containers:
- image: busybox
command:
- sh
- -c
- 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'
imagePullPolicy: IfNotPresent
name: busybox
volumeMounts:
# name must match the volume name below
- name: nfs
mountPath: "/mnt"
#
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs-pvc
Cree una implementación de implementación ocupada a través de kubectl create:
1 |
|