¿Cómo puedo restaurar, cambiar el tamaño o crear una instantánea de almacenamiento persistente de EBS en Amazon EKS para casos de recuperación de desastres o superación de la tasa de modificaciones de EBS?

8 minutos de lectura
0

Quiero usar una instantánea de almacenamiento persistente de Amazon Elastic Block Store (Amazon EBS) en Amazon Elastic Kubernetes Service (Amazon EKS) para la recuperación de desastres. ¿Cómo creo, redimensiono o restauro una instantánea de este tipo? O bien, he superado mi tasa de modificaciones de Amazon EBS. Sin embargo, aún tengo que cambiar el tamaño, restaurar o crear una instantánea de mi almacenamiento persistente de Amazon EBS en Amazon EKS.

Descripción corta

Está modificando su almacenamiento persistente de Amazon EBS en Amazon EKS y aparece el siguiente error:

errorCode: Client.VolumeModificationRateExceeded
errorMessage: You've reached the maximum modification rate per volume limit. Wait at least 6 hours between modifications per EBS volume
(errorCode: Client.VolumeModificationRateExceeded. errorMessage: Ha alcanzado la tasa máxima límite de modificaciones por volumen. Espere al menos 6 horas entre modificaciones por volumen de EBS)

Después de modificar un volumen, debe esperar al menos seis horas antes de poder seguir modificándolo. Asegúrese de que el volumen esté en uso o disponible antes de volver a modificarlo.

Es posible que su organización tenga un objetivo de recuperación de desastres (disaster recovery, DR) con un objetivo de tiempo de recuperación (RTO) inferior a seis horas. Para los RTO de menos de seis horas, cree una instantánea y restaure el volumen mediante el controlador de la interfaz de almacenamiento de contenedores (Container Storage Interface, CSI) de Amazon EBS.

Resolución

Nota: Si se producen errores al ejecutar los comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de que utiliza la versión más reciente de AWS CLI.

Utilice el controlador CSI de Amazon EBS y el generador de instantáneas externo para hacer lo siguiente:

  1. Cree una instantánea de Amazon EBS de la PersistentVolumeClaim.
  2. Restaure la PersistentVolumeClaim.
  3. Vincule la PersistentVolumeClaim a la carga de trabajo.

Requisitos previos:

Instalar el controlador CSI de Amazon EBS con el generador de instantáneas externo

1.    Verifique si tiene un proveedor de OpenID Connect (OIDC) de IAM existente para el clúster:

% cluster_name=ebs
% oidc_id=$(aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
% aws iam list-open-id-connect-providers | grep $oidc_id

Nota: sustituya cluster-name por el nombre de su clúster.

Resultado de ejemplo:

"Arn": "arn:aws:iam::XXXXXXXXXX:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/B7E2BC2980D17C9A5A3889998CB22B23"

Nota: Si no tiene un proveedor de OIDC de IAM, cree uno para su clúster.

2.    Instale el generador de instantáneas externo.
Nota: Debe instalar el generador de instantáneas externo antes de instalar el complemento CSI de Amazon EBS. Además, debe instalar los componentes externos del generador de instantáneas en el siguiente orden:

CustomResourceDefinition (CRD) para volumesnapshotclasses, volumesnapshots, y volumesnapshotcontents

mkdir crd
cd crd
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/kustomization.yaml
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
kubectl apply -k ../crd

RBAC, como ClusterRole y ClusterRoleBinding

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml

Implementación del controlador

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

3.    Cree su rol de IAM del complemento CSI de Amazon EBS con eksctl:

eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster cluster_name \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole

4.    Agregue el complemento CSI de Amazon EBS mediante eksctl:

eksctl create addon --name aws-ebs-csi-driver --cluster cluster_name --service-account-role-arn arn:aws:iam::account_id:role/AmazonEKS_EBS_CSI_DriverRole --force

Nota: sustituya account_id por el ID de su cuenta de AWS.

5.    Confirme que el controlador CSI de Amazon EBS y los pods de instantáneas externos se están ejecutando:

% kubectl get pods -A | egrep "csi|snapshot"

Crear un StatefulSet con almacenamiento persistente de Amazon EBS

1.    Descargue los manifiestos del sitio web de GitHub.

2.    Cree las clases StorageClass y VolumeSnapshotClass:

% kubectl apply -f manifests/classes/

Resultado de ejemplo:

volumesnapshotclass.snapshot.storage.k8s.io/csi-aws-vsc created
storageclass.storage.k8s.io/ebs-sc created

3.    Implemente el StatefulSet en su clúster junto con la PersistentVolumeClaim:

% kubectl apply -f manifests/app/

Resultado de ejemplo:

service/cassandra created
StatefulSet.apps/cassandra created

4.    Compruebe si los pods están en estado Running (En ejecución):

% kubectl get pods

Resultado de ejemplo:

NAME         READY  STATUS   RESTARTS  AGE
cassandra-0  1/1    Running  0         33m
cassandra-1  1/1    Running  0         32m
cassandra-2  1/1    Running  0         30m

5.    Verifique que la PersistentVolumeClaim esté vinculada a su PersisentVolume:

% kubectl get pvc

Resultado de ejemplo:

NAME                                              STATUS  VOLUME                                    CAPACITY ACCESS MODES STORAGECLASS  AGE

persistentvolumeclaim/cassandra-data-cassandra-0  Bound   pvc-b3ab4971-37dd-48d8-9f59-8c64bb65b2c8  2Gi      RWO          ebs-sc        28m
persistentvolumeclaim/cassandra-data-cassandra-1  Bound   pvc-6d68170e-2e51-40f4-be52-430790684e51  2Gi      RWO          ebs-sc        28m
persistentvolumeclaim/cassandra-data-cassandra-2  Bound   pvc-d0403adb-1a6f-44b0-9e7f-a367ad7b7353  2Gi      RWO          ebs-sc        26m
...

Nota: Anote los nombres de cada PersistentVolumeClaim para compararlos con los nombres de la PersistentVolumeClaim del manifiesto de instantáneas.

6.    Para probar el StatefulSet, escriba contenido en la PersistentVolumeClaim:

for i in {0..2}; do kubectl exec "cassandra-$i" -- sh -c 'echo "$(hostname)" > /cassandra_data/data/file.txt'; done

Crear una instantánea

El valor de PersistentVolumeClaimName en el manifiesto de instantáneas debe coincidir con el nombre de la PersistentVolumeClaim que creó para cada pod del StatefulSet. Por ejemplo:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: cassandra-data-snapshot-0
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: cassandra-data-cassandra-0

1.    Cree una instantánea de cada PersistentVolumeClaim:

% kubectl apply -f manifests/snapshot/

Resultado de ejemplo:

volumesnapshot.snapshot.storage.k8s.io/cassandra-data-snapshot-0 created
volumesnapshot.snapshot.storage.k8s.io/cassandra-data-snapshot-1 created
volumesnapshot.snapshot.storage.k8s.io/cassandra-data-snapshot-2 created

2.    Una vez completado el estado, compruebe que las instantáneas estén disponibles en la consola de Amazon Elastic Compute Cloud (Amazon EC2):

aws ec2 describe-snapshots --filters "Name=tag-key,Values=*ebs*" --query 'Snapshots[*].{VOL_ID:VolumeId,SnapshotID:SnapshotId,State:State,Size:VolumeSize,Name:[Tags[?Key==`Name`].Value] [0][0]}' --output table
---------------------------------------------------------------------------------------------------------------------------------------
|                                                          DescribeSnapshots                                                          |
+------------------------------------------------------------+-------+-------------------------+------------+-------------------------+
|                            Name                            | Size  |       SnapshotID        |   State    |         VOL_ID          |
+------------------------------------------------------------+-------+-------------------------+------------+-------------------------+
|  ebs-dynamic-snapshot-c6c9cb3c-2dab-4833-9124-40a0abde170d |  2    |  snap-057c5e2de3957d855 |  pending   |  vol-01edf53ee26a615f5  |
|  ebs-dynamic-snapshot-1c1ad0c5-a93a-468f-ab54-576db5d630d4 |  2    |  snap-02bf49a3b78ebf194 |  completed |  vol-0289efe54525dca4a  |
|  ebs-dynamic-snapshot-760c48e7-33ff-4b83-a6fb-6ef13b8d31b7 |  2    |  snap-0101c3d2efa40af19 |  completed |  vol-0fe68c9ac2f6375a4  |
+------------------------------------------------------------+-------+-------------------------+------------+-------------------------+

Restaurar la instantánea

Puede restaurar la PersistentVolumeClaim a partir de una instantánea creada con base en una PersistentVolumeClaim existente con el mismo nombre de la PersistentVolumeClaim. Al recrear el StatefulSet, la PersistentVolumeClaim aprovisiona de manera dinámica un PersistentVolume y se vincula de forma automática a los pods del StatefulSet. El formato de nombre de PersistentVolumeClaim de StatefulSet es: PVC\_TEMPLATE\_NAME-STATEFULSET\_NAME-REPLICA\_INDEX.

Para restaurar una instantánea, siga estos pasos:

1.    Elimine la carga de trabajo del StatefulSet existente:

kubectl delete -f manifests/app/Cassandra_statefulset.yaml

Nota: Al eliminar la carga de trabajo, también se eliminarán los pods del StatefulSet. La instantánea que ha creado actúa como copia de seguridad.

Resultado de ejemplo:

statefulset.apps "cassandra" deleted

2.    Elimine de manera forzosa la PersistentVolumeClaim:

for i in {0..2}
do
  kubectl delete pvc cassandra-data-cassandra-$i --force
done

Nota: Al eliminar la PersistentVolumeClaim, también se elimina el PersistentVolume.

3.    Restaure la PersistentVolumeClaim a partir de la instantánea con el mismo nombre de la PersistentVolumeClaim que creó:

kubectl apply -f manifests/snapshot-restore/

Resultado de ejemplo:

persistentvolumeclaim/cassandra-data-cassandra-0 created
persistentvolumeclaim/cassandra-data-cassandra-1 created
persistentvolumeclaim/cassandra-data-cassandra-2 created

4.    Verifique que PersistentVolumeClaim tenga el estado Available (Pendiente):

kubectl get pvc

Resultado de ejemplo:

NAME                         STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cassandra-data-cassandra-0   Pending                                      ebs-sc         24s
cassandra-data-cassandra-1   Pending                                      ebs-sc         23s
cassandra-data-cassandra-2   Pending                                      ebs-sc         22s

5.    Vuelva a crear el StatefulSet con el manifiesto original:

kubectl apply -f manifests/app-restore/

Nota: Para cambiar el tamaño del almacenamiento, defina el StatefulSet con un nuevo tamaño de almacenamiento.

Resultado de ejemplo:

StatefulSet.apps/cassandra created

6.    Compruebe el contenido del almacenamiento de Amazon EBS para confirmar que la instantánea y la restauración funcionan:

for i in {0..2}; do kubectl exec "cassandra-$i" -- sh -c 'cat /cassandra_data/data/file.txt'; done
cassandra-0
cassandra-1
cassandra-2

Redimensionar la PersistentVolumeClaim

Puede modificar el valor .spec.resources.requests.storage de la PersistentVolumeClaim para que refleje automáticamente el tamaño que definió en el manifiesto del StatefulSet:

for i in {0..2}
do
  echo "Resizing cassandra-$i"
  kubectl patch pvc cassandra-data-cassandra-$i -p '{ "spec": { "resources": { "requests": { "storage": "4Gi" }}}}'
done

Nota: 4Gi es un ejemplo de tamaño de almacenamiento. Defina un tamaño de almacenamiento adecuado para su caso de uso.

Confirme que el nuevo tamaño de almacenamiento se refleje en la consola de Amazon EC2 y en los pods:

% aws ec2 describe-volumes --filters "Name=tag-key,Values=*pvc*" --query 'Volumes[*].{ID:VolumeId,Size:Size,Name:[Tags[?Key==`Name`].Value] [0][0]}' --output table
-------------------------------------------------------------------------------------------
|                                     DescribeVolumes                                     |
+------------------------+--------------------------------------------------------+-------+
|           ID           |                         Name                           | Size  |
+------------------------+--------------------------------------------------------+-------+
|  vol-01266a5f1f8453e06 |  ebs-dynamic-pvc-359a87f6-b584-49fa-8dd9-e724596b2b43  |  4    |
|  vol-01b63a941450342d9 |  ebs-dynamic-pvc-bcc6f2cd-383d-429d-b75f-846e341d6ab2  |  4    |
|  vol-041486ec92d4640af |  ebs-dynamic-pvc-fa99a595-84b7-49ad-b9c2-1be296e7f1ce  |  4    |
+------------------------+--------------------------------------------------------+-------+

% for i in {0..2}
do
  echo "Inspecting cassandra-$i"
  kubectl exec -it cassandra-$i -- lsblk
  kubectl exec -it cassandra-$i -- df -h
done...

Ejecute los siguientes comandos Kubectl para limpiar su StatefulSet

Para eliminar los recursos que creó para su StatefulSet, ejecute los siguientes comandos de kubectl:

app-restore

kubectl delete -f manifests/app-restore

snapshot-restore

kubectl delete -f manifests/snapshot-restore

snapshot

kubectl delete -f manifests/snapshot

classes

kubectl delete -f manifests/classes

Cassandra

kubectl delete -f manifests/app/Cassandra_service.yaml

Información relacionada

ModifyVolume

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año