ディザスタリカバリのために、または EBS 変更レートを超過した場合に、Amazon EKS で EBS 永続ストレージスナップショットを復元、サイズ変更、作成するにはどうすればよいですか?

所要時間5分
0

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 ドライバーと外部スナップショットツールを使用して、次の操作を実行します。

  1. PersistentVolumeClaim の Amazon EBS スナップショットを作成します。
  2. PersistentVolumeClaim を復元します。
  3. PersistentVolumeClaim をワークロードにバインドします。

前提条件:

外部スナップショットツールを使用して 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 volumesnapshotclassesvolumesnapshotsvolumesnapshotcontents

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 などの RBACClusterRoleBinding

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.    StorageClassVolumeSnapshotClass を作成します。

% 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.    PersistenVolumeClaimPersisentVolume にバインドされていることを確認します。

% 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 を再作成すると、PersistentVolumeClaimPersistentVolume を動的にプロビジョニングし、自動的に 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

関連情報

ModifyVolume

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ