ディザスタリカバリのために、または EBS 変更レートを超過した場合に、Amazon EKS で EBS 永続ストレージスナップショットを復元、サイズ変更、作成するにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) で Amazon Elastic Block Store (Amazon EBS) 永続ストレージスナップショットをディザスタリカバリのために使用したいと考えています。このようなスナップショットを作成したり、サイズを変更したり、復元したりするにはどうすればよいですか? または、Amazon EBS の変更レートを超過しました。しかし、それでも Amazon EKS で Amazon EBS 永続ストレージのサイズを変更したり、復元したり、スナップショットを作成したりする必要があります。
簡単な説明
Amazon EKS で Amazon EBS 永続ストレージを変更しようとすると、次のエラーが表示されます。
errorCode: Client.VolumeModificationRateExceeded
errorMessage: You've reached the maximum modification rate per volume limit.Wait at least 6 hours between modifications per EBS volume (errorMessage: ボリューム制限ごとの最大変更レートに達しました。EBS ボリュームごとに各変更の間が 6 時間以上空くようにしてください)
ボリュームを変更した後は、ボリュームの変更を続行できるようになるまで 6 時間以上待つ必要があります。ボリュームを再度変更する前に、ボリュームが [in-use] (使用中) または [available] (使用可能) 状態であることを確認してください。
組織によっては、6 時間未満の目標復旧時間 (RTO) が設定されたディザスタリカバリ (DR) 目標がある場合があります。RTO が 6 時間未満の場合は、Amazon EBS Container Storage Interface (CSI) ドライバーを使用してスナップショットを作成し、ボリュームを復元します。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon EBS CSI ドライバーと外部スナップショットツールを使用して、次の操作を実行します。
- PersistentVolumeClaim の Amazon EBS スナップショットを作成します。
- PersistentVolumeClaim を復元します。
- PersistentVolumeClaim をワークロードにバインドします。
前提条件:
- ワーカーノードを含む既存の Amazon EKS クラスター。Amazon EKS クラスターがない場合は作成します。
- 最新バージョンの AWS CLI、eksctl、kubectl。
- サービスアカウント用の Amazon EBS CSI ドライバーの AWS Identity and Access Management (IAM) ロール。
外部スナップショットツールを使用して Amazon EBS CSI ドライバーをインストールする
1. クラスター用の既存の IAM OpenID Connect (OIDC) プロバイダーがあるかどうかを確認します。
% 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
注意: cluster_name を使用しているクラスター名に置き換えます。
出力例:
"Arn": "arn:aws:iam::XXXXXXXXXX:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/B7E2BC2980D17C9A5A3889998CB22B23"
注: IAM OIDC プロバイダーがない場合は、クラスター用に作成します。
2. 外部スナップショットツールをインストールします。
注: Amazon EBS CSI アドオンをインストールする前に、外部スナップショットツールをインストールする必要があります。また、外部スナップショットツールのコンポーネントは次の順序でインストールする必要があります。
CustomResourceDefinition (CRD) for volumesnapshotclasses、volumesnapshots、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
ClusterRole などの RBAC、ClusterRoleBinding
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
コントローラーのデプロイ
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
3. eksctl を使用して Amazon EBS CSI プラグインの IAM ロールを作成します。
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. eksctl を使用して Amazon EBS CSI アドオンを追加します。
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
注意: $account_idをお使いの AWS アカウントIDに置き換えます。
5. Amazon EBS CSI ドライバーと外部スナップショットツールのポッドが実行されていることを確認します。
% kubectl get pods -A | egrep "csi|snapshot"
Amazon EBS 永続ストレージで StatefulSet を作成する
1. GitHub ウェブサイトからマニフェストをダウンロードします。
2. StorageClass と VolumeSnapshotClass を作成します。
% kubectl apply -f manifests/classes/
出力例:
volumesnapshotclass.snapshot.storage.k8s.io/csi-aws-vsc created storageclass.storage.k8s.io/ebs-sc created
3. PersistentVolumeClaim とともに StatefulSet をクラスターにデプロイします。
% kubectl apply -f manifests/app/
出力例:
service/cassandra created StatefulSet.apps/cassandra created
4. ポッドが [Running] (実行中) ステータスであることを確認します。
% kubectl get pods
出力例:
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. PersistenVolumeClaim が PersisentVolume にバインドされていることを確認します。
% kubectl get pvc
出力例:
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 ...
注: 各 PersistentVolumeClaim の名前を書き留めて、スナップショットマニフェストの PersistentVolumeClaim の名前と比較してください。
6. StatefulSet をテストするには、PersistentVolumeClaim にコンテンツを書き込みます。
for i in {0..2}; do kubectl exec "cassandra-$i" -- sh -c 'echo "$(hostname)" > /cassandra_data/data/file.txt'; done
スナップショットを作成する
スナップショットマニフェストの persistentVolumeClaimName は、StatefulSet 内の各ポッド用に作成した PersistentVolumeClaim の名前と一致する必要があります。例:
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. 各 PersistenVolumeClaim からスナップショットを作成します。
% kubectl apply -f manifests/snapshot/
出力例:
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. ステートが完了したら、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 | +------------------------------------------------------------+-------+-------------------------+------------+-------------------------+
スナップショットを復元する
PersistentVolumeClaim は、既存の PersistentVolumeClaim と同じ名前を使用して、その PersistentVolumeClaim から作成されたスナップショットから復元できます。StatefulSet を再作成すると、PersistentVolumeClaim は PersistentVolume を動的にプロビジョニングし、自動的に StatefulSet のポッドにバインドされます。StatefulSet の PersistenVolumeClaim の名前の形式は、PVC\_TEMPLATE\_NAME-STATEFULSET\_NAME-REPLICA\_INDEX
です。
スナップショットを復元するには、次のステップを実行します。
1. 既存の StatefulSet ワークロードを削除します。
kubectl delete -f manifests/app/Cassandra_statefulset.yaml
注: ワークロードを削除すると、StatefulSet のポッドも削除されます。作成したスナップショットはバックアップとして機能します。
出力例:
statefulset.apps "cassandra" deleted
2. PersistentVolumeClaim を強制的に削除します:
for i in {0..2} do kubectl delete pvc cassandra-data-cassandra-$i --force done
注: PersistentVolumeClaim を削除すると、PersistentVolume も削除されます。
3. 作成した PersistentVolumeClaim と同じ名前を使用して、スナップショットから PersistentVolumeClaim を復元します。
kubectl apply -f manifests/snapshot-restore/
出力例:
persistentvolumeclaim/cassandra-data-cassandra-0 created persistentvolumeclaim/cassandra-data-cassandra-1 created persistentvolumeclaim/cassandra-data-cassandra-2 created
4. 各 PersistentVolumeClaim が [Pending] (保留中) ステータスになっていることを確認します。
kubectl get pvc
出力例:
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. StatefulSet を元のマニフェストで再作成します。
kubectl apply -f manifests/app-restore/
注: ストレージのサイズを変更するには、StatefulSet を新しいストレージサイズで定義します。
出力例:
StatefulSet.apps/cassandra created
6. Amazon EBS ストレージの内容をチェックして、スナップショットと復元が機能していることを確認します。
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
PersistentVolumeClaim のサイズを変更する
PersistentVolumeClaim の .spec.resources.requests.storage を変更して、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
注: 4Gi はストレージサイズの例です。ユースケースに適したストレージサイズを定義してください。
新しいストレージサイズが Amazon EC2 コンソールとポッドに反映されていることを確認します。
% 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...
次の Kubectl コマンドを実行して、StatefulSet をクリーンアップします
StatefulSet 用に作成したリソースを削除するには、次の 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
関連情報
関連するコンテンツ
- 質問済み 7ヶ月前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 3ヶ月前