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).
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:
Ten en cuenta el campo
selector
en la especificación del PVC. Esto asegura que el PVC se programe solo en nodos con la etiquetazone=us-east-1b
.Crea un nuevo PV con la clase de almacenamiento adecuada, el modo de acceso adecuado y la misma capacidad que el PV eliminado:
Ten en cuenta el campo
awsElasticBlockStore
en la especificación del PV. Debes especificar elvolumeID
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 comoRetain
asegura que el PV no se borre cuando se borre el PVC.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.