[Almacenamiento de Kubernetes] Explicación detallada del almacenamiento persistente PV y PVC

1. Teoría del almacenamiento persistente de PV y PVC

Documentos oficiales de referencia chinos:

1. ¿Qué son la fotovoltaica y el PVC?

  • PersistentVolume (PV) es una pieza de almacenamiento en el clúster, que puede ser NFS, iSCSI, almacenamiento local, etc., configurado por el administrador o configurado dinámicamente mediante clases de almacenamiento . PV define atributos como la capacidad de almacenamiento, el modo de acceso y el tipo de almacenamiento persistente. El ciclo de vida de un PV es independiente del Pod. Incluso si se elimina el Pod, el PV aún existe y puede ser utilizado por otros Pods.
  • PersistentVolumeClaim (PVC) es un volumen de almacenamiento persistente . Podemos definir un volumen de almacenamiento de tipo PVC al crear un pod. El PVC se puede usar para acceder a varios tipos de almacenamiento persistente, como almacenamiento local, almacenamiento en red, almacenamiento en la nube, etc. sin tener que preocuparse por la ubicación real y el tipo de estos recursos , el uso de PVC puede hacer que las aplicaciones sean más flexibles y portátiles, al mismo tiempo que mejora la utilización de los recursos de almacenamiento.
  • Existe una correspondencia biunívoca entre PVC y PV. Si un PV está vinculado a un PVC, no puede ser utilizado por otros PVC.

2. Método de suministro fotovoltaico

Los dos tipos son estáticos y dinámicos:

  • Aprovisionamiento estático: el administrador crea manualmente un objeto PV y lo vincula a un backend de almacenamiento específico, y luego el Pod puede solicitar vincularse al PV a través de un PVC (reclamo de volumen persistente).
  • Aprovisionamiento dinámico: los administradores definen un conjunto de backends de almacenamiento a través de StorageClass, y luego los pods pueden vincularse a StorageClass a través de solicitudes de PVC, y los K8 crearán automáticamente un objeto PV y lo vincularán a un backend de almacenamiento disponible.

3. Estrategias de reciclaje para PV y PVC

Cuando creamos un pod, si usamos pvc como volumen de almacenamiento, se vinculará a pv. Cuando eliminemos el pod, se liberará el enlace entre pvc y pv. Después del lanzamiento, ¿qué se debe hacer con los datos en el volumen fotovoltaico unido a pvc?Los siguientes tipos:

Hay tres estrategias de reciclaje fotovoltaico en Kubernetes:

  • Retener: retiene el PV, pero no elimina los recursos de almacenamiento subyacentes. Esto significa que los datos en el PV aún existen, pero deben limpiarse manualmente.
  • Eliminar: elimine PV y recursos de almacenamiento subyacentes. Esto significa que los datos del PV se eliminarán de forma permanente.
  • Reciclar: elimina los datos en el PV, pero no elimina los recursos de almacenamiento subyacentes. Esto significa que los datos del PV se borrarán, pero los recursos de almacenamiento subyacentes se pueden reutilizar. (no recomendado, puede eliminarse en 1.15)

Hay dos estrategias de reciclaje de PVC en Kubernetes:

  • Retener: el PVC se retiene, pero los recursos de almacenamiento subyacentes no se eliminan. Esto significa que los datos en el PVC todavía están allí, pero deben limpiarse manualmente.
  • Eliminar: elimine PVC y recursos de almacenamiento subyacentes. Esto significa que los datos en el PVC se eliminarán de forma permanente.

Cabe señalar que la política de reciclaje de un PVC debe coincidir con la política de reciclaje del PV al que está vinculado. Por ejemplo, si la política de reciclaje del PV es Retener, la política de reciclaje del PVC también debe ser Retener . De lo contrario, se pueden producir pérdidas de datos o fugas de recursos de almacenamiento.

2. Caso: Demostración de casos de almacenamiento persistente de PV y PVC

1. Construya un servidor NFS

PV utiliza NFS como almacenamiento.

Nota: Es necesario instalar todos los nodos del clúster K8Snfs-utils

yum install nfs-utils -y
mkdir /data/volumes/v{
    
    1..3} -p

vim /etc/exports
/data/volumes/v1 *(rw,no_root_squash)
/data/volumes/v2 *(rw,no_root_squash)
/data/volumes/v3 *(rw,no_root_squash)

Cargue la configuración para que surta efecto && inicie el servicio NFS

exportfs -arv
systemctl enable nfs --now

Pruebe si NFS se puede montar normalmente en otros nodos Node:

yum install nfs-utils -y
mkdir /test
mount 16.32.15.200:/data/volumes/v1 /test

df -hT /test/

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-ekJ4U0X0-1686473061750) (D:\MD Archives\IMG\image-20230611135004109. png)]

Bien, como se muestra en la figura anterior, NFS se puede montar normalmente, lo que significa que hasta ahora no hay ningún problema con la configuración de NFS.

2. Cree un PV y use NFS para compartir almacenamiento

Cree tres PV, utilizando diferentes directorios y diferentes módulos de acceso respectivamente. El YAML es el siguiente:

cat pv.yaml 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1
  labels:
    app: pv-1
spec:
  nfs:
    path: /data/volumes/v1   # PV使用NFS路径
    server: 16.32.15.200     # NFS 服务端IP地址
  accessModes: ["ReadWriteOnce"]  # 访问模式: ReadWriteOnce,卷可以被一个节点以读写方式挂载
  capacity:
    storage: 1Gi                  # 存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-2
  labels:
    app: pv-2
spec:
  nfs:
    path: /data/volumes/v2
    server: 16.32.15.200
  accessModes: ["ReadOnlyMany"] # 访问模式: ReadOnlyMany,可以被多个节点只读方式挂载
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-3
  labels:
    app: pv-3
spec:
  nfs:
    path: /data/volumes/v3
    server: 16.32.15.200
  accessModes: ["ReadWriteMany"] # 访问模式: ReadWriteMany,可以被多个节点读写方式挂载
  capacity:
    storage: 3Gi
...

Modo de acceso explicado:

  • ReadWriteOnce: Montado por un nodo en modo lectura-escritura (explicación oficial, pero no se puede reflejar, debería ser un BUG).
  • ReadOnlyMany: montado en modo de solo lectura por varios nodos.
  • ReadWriteMany: montado por varios nodos en modo de lectura y escritura.

Ejecute el archivo YAML:

kubectl apply -f pv.yaml

Ver los recursos PV creados:

kubectl get pv

[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-qIdR6GdY-1686473061751) (D:\MD Archives\IMG\image-20230611140856919. png)]

3. Cree un PVC y vincúlelo al PV

Cree tres PVC y vincule los tres PV anteriores con YAML de la siguiente manera:

cat pvc.yaml 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-1
  labels:
    app: pvc-1
spec:
  accessModes: ["ReadWriteOnce"]   # PVC访问模式,必须和PV访问模式一致
  selector:
    matchLabels:
      app: pv-1                   # 标签选择器,选择具有 app=pv-1 PV绑定
  resources: 
    requests: 
      storage: 1Gi                # 容量,必须和PV容量保持一致
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-2
  labels:
    app: pvc-2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: pv-2
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-3
  labels:
    app: pvc-3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: pv-3
  resources:
    requests:
      storage: 3Gi
...

Ejecute el archivo de manifiesto YAML:

kubectl apply -f pvc.yaml

Verifique si un PVC está asociado con un PV:

kubectl get pvc

[La transferencia de la imagen del enlace externo falló, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-TQTsbz18-1686473061752) (D:\MD Archives\IMG\image-20230611151351851.png )]

4. Cree un pod y monte un volumen de PVC

cat pod-pvc.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
  labels:
    app: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pvc-test
  template:
    metadata:
      labels:
        app: pvc-test
    spec:
      volumes:
      - persistentVolumeClaim:     # 使用PVC类型
          claimName: pvc-2         # 指定使用PVC名字
        name: web-html-path        # 卷名称
      containers:
      - name: pvc-test
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: web-html-path      # 使用卷名称,和上面卷名称对应上
          mountPath: /usr/share/nginx/html  # 容器内挂载目录

Ejecute el archivo YAML:

kubectl apply -f pod-pvc.yaml 

Estamos usando permisos de solo lectura pvc-2, y el directorio correspondiente es /data/volumes/v2/agregar el archivo index.html en el directorio

echo "PVC-DEMO" > /data/volumes/v2/index.html

Visite el sitio web de Pods:

kubectl get pods -o wide

[La transferencia de la imagen del enlace externo falló, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-NZN6DVxq-1686473061752) (D:\MD Archives\IMG\image-20230611161521242.png )]

Ingresemos al contenedor y creemos un archivo para probar:

kubectl exec -it pvc-test-d65964fd4-jmkmg -- /bin/bash

Como se muestra en la figura a continuación, estoy usando un PVC de solo lectura. No debería haber permiso para crear archivos en el contenedor, pero los archivos sí se pueden crear en el contenedor. Consulté con expertos en el campo nativo de la nube. Esto debería ser un error de PVC K8S Mi versión actual de K8S es: v1.27.0

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-gbyw4p4M-1686473061752) (D:\MD Archives\IMG\image-20230611161652570.png )]

5. Los pasos correctos para eliminar PVC

  • pvc y pv están vinculados, si usa la política de reciclaje predeterminada retener, luego de eliminar pvc, pv estará en estado liberado, queremos continuar usando este pv, necesitamos eliminar manualmente pv, kubectl delete pv pv_name, delete pv , pv no se eliminará Los datos en el pvc se vincularán al mejor pv coincidente cuando recreamos el pvc Los datos seguirán siendo los datos originales y no se perderán.

  • Después de la prueba, si la estrategia de recuperación es Eliminar, elimine el PV y los datos almacenados en el backend de PV no se eliminarán.

  • Política de reciclaje Campo: pv.spec.persistentVolumeReclaimPolicycampo

Paso 1: Primero elimine el Pod usando PVC

Paso dos: quitar el PVC

Paso 3: Eliminar PV

Supongo que te gusta

Origin blog.csdn.net/weixin_45310323/article/details/131154956
Recomendado
Clasificación