¿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?
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:
- Cree una instantánea de Amazon EBS de la PersistentVolumeClaim.
- Restaure la PersistentVolumeClaim.
- Vincule la PersistentVolumeClaim a la carga de trabajo.
Requisitos previos:
- Un clúster de Amazon EKS existente con nodos de trabajo. Si no tiene uno, cree su clúster de Amazon EKS.
- Las versiones más recientes de AWS CLI, eksctl y kubectl.
- Un rol de AWS Identity and Access Management (IAM) del controlador CSI de Amazon EBS para cuentas de servicio.
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
Contenido relevante
- OFICIAL DE AWSActualizada hace 3 meses
- OFICIAL DE AWSActualizada hace 8 meses
- OFICIAL DE AWSActualizada hace 2 meses
- OFICIAL DE AWSActualizada hace un año