Intercalación práctica de K8s (18) -k8s almacenamiento NFS

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

rpcinfo -p localhost

2) Verifique si el servicio nfs está instalado normalmente 

1

rpcinfo -p localhost

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

useradd -u nfs

mkdir -p /nfs-share

chmod a+w /nfs-share

2.3 Configurar el directorio compartido

Configure el directorio compartido para el cliente en el servidor nfs:

1

echo "/nfs-share 172.16.0.0(rw,async,no_root_squash)" >> /etc/exports

La configuración entra en vigor ejecutando el siguiente comando:

1

exportfs -r

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

systemctl start rpcbind

 2) Inicie el servicio nfs: 

1

systemctl start nfs-server

3) Configure rpcbind y nfs-server para que se inicien: 

1

2

systemctl enable rpcbind

systemctl enable nfs-server

2.5 Verifique si el servicio nfs se inicia normalmente

1

2

showmount -e localhost

mount -t nfs 127.0.0.1:/data /mnt

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

kubectl create -f {path}/claim.yaml

   

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

kubectl create -f {path}/nfs-busybox-deployment.yaml

Supongo que te gusta

Origin blog.csdn.net/yucaifu1989/article/details/107712042
Recomendado
Clasificación