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?

Letzte Aktualisierung: 09.11.2022

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:

  1. Erstellen Sie einen Amazon EBS-Snapshot des PersistentVolumeClaim.
  2. Stellen Sie den PersistentVolumeClaim wieder her.
  3. Binden Sie den PersistentVolumeClaim an die Workload.

Voraussetzungen:

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

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?