Share Your AWS re:Post Experience - Quick 3 Question Survey and Earn a re:Post Badge
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey
Wie kann ich in Amazon EKS für die Notfallwiederherstellung einen ständigen EBS-Speicher-Snapshot wiederherstellen, seine Größe ändern oder erstellen, wenn die EBS-Änderungsrate überschritten ist?
Ich möchte einen ständigen Speicher-Snapshot von Amazon Elastic Block Store (Amazon EBS) in Amazon Elastic Kubernetes Service (Amazon EKS) für die Notfallwiederherstellung verwenden. Wie erstelle ich einen solchen Snapshot, ändere ihn oder stelle ihn wieder her? Oder ich habe meine Amazon EBS-Änderungsrate überschritten. Aber ich muss immer noch die Größe meines persistenten Amazon EBS-Speichers in Amazon EKS ändern, wiederherstellen oder einen Snapshot davon erstellen.
Kurzbeschreibung
Sie ändern Ihren persistenten Amazon EBS-Speicher in Amazon EKS und Sie erhalten die folgende Fehlermeldung:
Fehlercode: Client.Volume-Änderungsrate überschritten
ErrorMessage: Sie haben die maximale Änderungsrate pro Volumenlimit erreicht. Warten Sie mindestens 6 Stunden zwischen den Änderungen pro EBS-Volume
Nachdem Sie ein Volume geändert haben, müssen Sie mindestens sechs Stunden warten, bevor Sie mit dem Ändern des Volumes fortfahren können. Stellen Sie sicher, dass sich das Volume im Status Wird verwendet oder verfügbar befindet, bevor Sie es erneut ändern.
Ihr Unternehmen hat möglicherweise ein Notfallwiederherstellungs (DR) -Ziel mit einem Recovery Time Objective (RTO) von weniger als sechs Stunden. Erstellen Sie für RTOs, die weniger als sechs Stunden dauern, einen Snapshot und stellen Sie Ihr Volume mithilfe des Amazon EBS Container Storage Interface (CSI) -Treibers wieder her.
Lösung
Hinweis: Wenn Sie beim Ausführen von Befehlen von AWS Command Line Interface (AWS CLI) Fehlermeldungen erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.
Verwenden Sie den Amazon EBS CSI-Treiber und den externen Snapshotter für Folgendes:
- Erstellen Sie einen Amazon EBS-Snapshot des PersistentVolumeClaim.
- Stellen Sie den PersistentVolumeClaim wieder her.
- Binden Sie den PersistentVolumeClaim an die Workload.
Voraussetzungen:
- Ein vorhandener Amazon EKS-Cluster mit Worker-Knoten. Wenn Sie noch keinen haben, erstellen Sie Ihren Amazon EKS-Cluster.
- Die neuesten Versionen von AWS CLI, eksctl und kubectl.
- Eine AWS Identity and Access Management (IAM) -Rolle des Amazon EBS CSI-Treibers für Dienstkonten.
Installieren Sie den Amazon EBS CSI-Treiber mit dem externen Snapshotter
1. Prüfen Sie, ob Sie einen vorhandenen IAM-OpenID Connect (OIDC)-Anbieter für Ihren Cluster haben:
% 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
Hinweis: Ersetzen Sie cluster_name durch Ihren Clusternamen.
Beispielausgabe:
"Arn": "arn:aws:iam::XXXXXXXXXX:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/B7E2BC2980D17C9A5A3889998CB22B23"
Hinweis: Wenn Sie keinen IAM-OIDC-Anbieter haben, erstellen Sie einen für Ihren Cluster.
2. Installieren Sie den externen Snapshotter.
Hinweis: Sie müssen den externen Snapshotter installieren, bevor Sie das Amazon EBS CSI-Add-on installieren. Außerdem müssen Sie die externen Snapshotter-Komponenten in der folgenden Reihenfolge installieren:
CustomResource Definition (CRD) für Volume-Snapshot-Klassen, Volume-Snapshots und Volume-Snapshot-Inhalte
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, wie ClusterRole, und ClusterRoleBinding
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
Controller-Bereitstellung
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
3. Erstellen Sie Ihre Amazon EBS CSI-Plugin-IAM-Rolle mit 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. Fügen Sie das Amazon-EBS-CSI-Add-on mit eksctl hinzu:
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
Hinweis: Ersetzen Sie account_id durch Ihre AWS-Konto-ID.
5. Stellen Sie sicher, dass der Amazon EBS CSI-Treiber und die externen Snapshotter-Pods ausgeführt werden:
% kubectl get pods -A | egrep "csi|snapshot"
Erstellen Sie ein StatefulSet mit persistentem Amazon EBS-Speicher
1. Laden Sie die Manifeste von der GitHub-Website herunter.
2. Erstellen Sie die StorageClass und VolumeSnapshotClass:
% kubectl apply -f manifests/classes/
Beispielausgabe:
volumesnapshotclass.snapshot.storage.k8s.io/csi-aws-vsc created storageclass.storage.k8s.io/ebs-sc created
3. Stellen Sie StatefulSet zusammen mit dem PersistentVolumeClaim auf Ihrem Cluster bereit:
% kubectl apply -f manifests/app/
Beispielausgabe:
service/cassandra created StatefulSet.apps/cassandra created
4. Prüfen Sie, ob sich die Pods im Status Ausführen befinden:
% kubectl get pods
Beispielausgabe:
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. Stellen Sie sicher, dass PersistenVolumeClaim an Ihr persisentVolume gebunden ist:
% kubectl get pvc
Beispielausgabe:
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 ...
Hinweis: Notieren Sie sich die Namen der einzelnen PersistentVolumeClaim, die mit den PersistentVolumeClaim-Namen im Snapshot-Manifest verglichen werden sollen.
6. Um StatefulSet zu testen, schreiben Sie Inhalt in den PersistentVolumeClaim:
for i in {0..2}; do kubectl exec "cassandra-$i" -- sh -c 'echo "$(hostname)" > /cassandra_data/data/file.txt'; done
Snapshot erstellen
Der Wert persistentVolumeClaimName im Snapshot-Manifest muss mit dem Namen von PersistentVolumeClaim übereinstimmen, den Sie für jeden Pod in StatefulSet erstellt haben. Beispiel:
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. Erstellen Sie einen Snapshot aus jedem persistenVolumeClaim:
% kubectl apply -f manifests/snapshot/
Beispielausgabe:
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. Stellen Sie nach Abschluss des Status sicher, dass die Snapshots auf der Amazon Elastic Compute Cloud (Amazon EC2) -Konsole verfügbar sind:
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 | +------------------------------------------------------------+-------+-------------------------+------------+-------------------------+
Den Snapshot wiederherstellen
Sie können einen PersistentVolumeClaim aus einem Snapshot wiederherstellen, der aus einem vorhandenen PersistentVolumeClaim erstellt wurde, indem Sie denselben Namen wie PersistentVolumeClaim verwenden. Wenn Sie StatefulSet neu erstellen, stellt PersistentVolumeClaim dynamisch ein PersistentVolume bereit und wird automatisch an die StatefulSet-Pods gebunden. Das StatefulSet PersistenVolumeClaim Namensformat ist: PVC\_TEMPLATE\_NAME-STATEFULSET\_NAME-REPLICA\_INDEX
.
Gehen Sie folgendermaßen vor um einen Snapshot wiederherzustellen:
1. Löschen Sie den vorhandenen StatefulSet-Workload:
kubectl delete -f manifests/app/Cassandra_statefulset.yaml
Hinweis: Durch das Löschen der Workload werden auch die StatefulSet-Pods gelöscht. Der Snapshot, den Sie erstellt haben, dient als Backup.
Beispielausgabe:
statefulset.apps "cassandra" deleted
2. Löschen Sie gewaltsam den PersistentVolume-Anspruch:
for i in {0..2} do kubectl delete pvc cassandra-data-cassandra-$i --force done
Hinweis: Durch das Löschen des PersistentVolumeClaim wird auch das PersistentVolume gelöscht.
3. Stellen Sie PersistentVolumeClaim aus dem Snapshot wieder her, indem Sie denselben Namen des von Ihnen erstellten PersistentVolumeClaim verwenden:
kubectl apply -f manifests/snapshot-restore/
Beispielausgabe:
persistentvolumeclaim/cassandra-data-cassandra-0 created persistentvolumeclaim/cassandra-data-cassandra-1 created persistentvolumeclaim/cassandra-data-cassandra-2 created
4. Stellen Sie sicher, dass sich jeder PersistentVolumeClaim im Status Ausstehend befindet:
kubectl get pvc
Beispielausgabe:
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. Erstellen Sie das StatefulSet mit dem ursprünglichen Manifest neu:
kubectl apply -f manifests/app-restore/
Hinweis: Um die Größe des Speichers zu ändern, definieren Sie StatefulSet mit einer neuen Speichergröße.
Beispielausgabe:
StatefulSet.apps/cassandra created
6. Überprüfen Sie den Inhalt des Amazon EBS-Speichers, um sicherzustellen, dass der Snapshot und die Wiederherstellung funktionieren:
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
Ändern der Größe des PersistentVolume-Anspruchs
Sie können die .spec.resources.requests.storage von PersistentVolumeClaim so ändern, dass sie automatisch die Größe widerspiegelt, die Sie im StatefulSet-Manifest definiert haben:
for i in {0..2} do echo "Resizing cassandra-$i" kubectl patch pvc cassandra-data-cassandra-$i -p '{ "spec": { "resources": { "requests": { "storage": "4Gi" }}}}' done
Hinweis: 4Gi ist ein Beispiel für eine Speichergröße. Definieren Sie eine Speichergröße, die für Ihren Anwendungsfall geeignet ist.
Vergewissern Sie sich, dass die neue Speichergröße auf der Amazon EC2-Konsole und in den Pods angezeigt wird:
% 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...
Führen Sie die folgenden Kubectl-Befehle aus, um Ihr StatefulSet zu bereinigen
Um die Ressourcen zu löschen, die Sie für Ihr StatefulSet erstellt haben, führen Sie die folgenden kubectl-Befehle aus:
App-Wiederherstellung
kubectl delete -f manifests/app-restore
Snapshot-Wiederherstellung
kubectl delete -f manifests/snapshot-restore
Snapshot
kubectl delete -f manifests/snapshot
Klassen
kubectl delete -f manifests/classes
Cassandra
kubectl delete -f manifests/app/Cassandra_service.yaml
Ähnliche Informationen

Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 5 Monaten
- AWS OFFICIALAktualisiert vor 10 Monaten