es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EKS: ¿Es posible mover el PV de un StatefulSet a una zona de disponibilidad diferente eliminándolo?

Tengo un clúster de EKS ejecutando un StatefulSet utilizando nodos EC2 y volúmenes EBS para la storageclass. Quiero mover un pod del StatefulSet del nodo 1 al nodo 2. Drené el nodo 1 de la siguiente manera:

kubectl drain --ignore-daemonsets --delete-emptydir-data node1

El problema es que el pod no aparece en el nodo 2, porque el PV se ha creado en us-east-1a y no se puede adjuntar al nodo 2 que está en us-east-1b (problema de zona cruzada descrito aquí: https://stackoverflow.com/a/55514852/1259990).

Cuando describo el pod, obtengo el siguiente error de programación:

1 nodo(s) tuvo conflicto de afinidad de volumen

Me pregunto si puedo recrear el PV en us-east-1b sin tener que eliminar/volver a implementar el StatefulSet. Si elimino el PV de mi clúster (y posiblemente también el PVC):

kubectl delete pv pv-in-us-east-1a

¿Recrearía el StatefulSet el PV en la zona correcta, si node2 es el único nodo programable? Si no es así, ¿hay otra forma de lograr esto sin eliminar/volver a crear el StatefulSet completo? Los datos en el PV no son importantes y no es necesario guardarlos.

(Me gustaría intentar eliminar el PV, pero en realidad no quiero interrumpir este servicio en particular si el PV no se recrea).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Sí, puedes recrear el PV en us-east-1b sin borrar/volver a implementar el StatefulSet. Sin embargo, hay algunas cosas que debes considerar antes de hacerlo.

    Cuando borras el PV de tu clúster, el PVC correspondiente también se eliminará. Por lo tanto, deberás recrear el PVC también, con la clase de almacenamiento adecuada y el modo de acceso adecuado.

    Asegúrate de que el nodo2 sea el único nodo programable cuando recrees el PV/PVC. Puedes lograr esto aplicando un nodeSelector o una regla de NodeAffinity al PV/PVC, especificando que solo debe programarse en el nodo2. Esto evitará que el PV/PVC se programe en el nodo1 nuevamente.

    Una vez que se haya recreado el PV/PVC, el StatefulSet debería poder usarlo para programar la vaina en el nodo2.

    Aquí tienes los pasos para recrear el PV/PVC:

    1. Primero, borra el PV y el PVC:
      kubectl delete pv pv-in-us-east-1a
      kubectl delete pvc pvc-in-us-east-1a
      
    2. Crea un nuevo PVC con la clase de almacenamiento adecuada y el modo de acceso adecuado:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
       name: pvc-in-us-east-1b
      spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 10Gi
       storageClassName: <nombre-de-tu-clase-de-almacenamiento>
       selector:
         matchLabels:
           zone: us-east-1b
      

      Ten en cuenta el campo selector en la especificación del PVC. Esto asegura que el PVC se programe solo en nodos con la etiqueta zone=us-east-1b.

    3. Crea un nuevo PV con la clase de almacenamiento adecuada, el modo de acceso adecuado y la misma capacidad que el PV eliminado:

      apiVersion: v1
      kind: PersistentVolume
      metadata:
       name: pv-in-us-east-1b
      spec:
       capacity:
         storage: 10Gi
       accessModes:
         - ReadWriteOnce
       persistentVolumeReclaimPolicy: Retain
       storageClassName: <nombre-de-tu-clase-de-almacenamiento>
       awsElasticBlockStore:
         volumeID: <id-del-volumen-ebs-de-tu-us-east-1b>
         fsType: ext4
         partition: 1
      

      Ten en cuenta el campo awsElasticBlockStore en la especificación del PV. Debes especificar el volumeID de tu volumen EBS existente en us-east-1b. Puedes obtener este valor desde la consola de AWS o desde AWS CLI.

      También ten en cuenta el campo persistentVolumeReclaimPolicy. Configurarlo como Retain asegura que el PV no se borre cuando se borre el PVC.

    4. Aplica los manifiestos del PVC y PV usando kubectl apply -f.

    Una vez que se haya recreado el PV/PVC, deberías ver un nuevo PV y PVC en tu clúster. El StatefulSet debería poder usar el nuevo PV para programar la vaina en el nodo2.

    Ten en cuenta que si tienes más de un StatefulSet que utiliza este PV/PVC, todos ellos deberán actualizarse para usar el nuevo PV/PVC.

Comments are closed.