Amazon Web Services ブログ

Amazon EKS クラスターでアドオンを活用し、Amazon EBS スナップショットを永続ストレージに使用する

この記事は Using Amazon EBS snapshots for persistent storage with your Amazon EKS cluster by leveraging add-ons (記事公開日: 2022 年 7 月 28 日) を翻訳したものです。

もともとは、コンテナはステートレスなアプリケーションに最適化されたものでした。しかし、多くのユースケースでは永続ストレージが必要であり、それがなければステートフルなワークロードは実現できません。Kubernetes は当初ステートフルなワークロードのサポートを In-tree ボリュームプラグインとして導入していました。これはつまり、プラグインコードが Kubernetes のコアコードの一部であり、Kubernetes バイナリとともに提供されることを意味します。そのため、各々のストレージプラットフォームに Kubernetes のサポートを追加したいベンダーにとっては、サポートの追加を標準的な Kubernetes のリリースサイクルに合わせる必要があり、難しい問題と考えられていました。

それが、Kubernetes のようなコンテナオーケストレーションの上で任意のブロック・ファイルストレージシステムをコンテナ化したワークロードに公開するための規格である Container Storage Interface (CSI) の開発につながりました。

Amazon Elastic Block Stock (Amazon EBS) は、Amazon EC2 インスタンスから専用のストレージボリュームへのダイレクトアクセスを提供するブロックストレージサービスです。Amazon EBS スナップショットは、Amazon EBS ボリュームなどのブロックストレージデータを保護するために設計された、シンプルでセキュアなデータ保護ソリューションです。

先ほど述べたとおり、Amazon EBS の最初のサポートは In-tree ボリュームプラグインとして開始されました。

CSI の仕様が公開された時に、私たちは Amazon EBS に対応するドライバーの開発を開始しました。2018 年、私たちは Amazon EBS CSI ドライバーを GitHub にリリースしました。最初のリリースから様々なリリースを経て、最新のリリースとその機能はこちらからご覧いただけます。

さらに Amazon EBS CSI ドライバーは、Amazon EKS アドオンで一般に利用できるようになりました。Amazon EKS アドオンは、Kubernetes アプリケーションに運用をサポートする機能を提供するソフトウェアですが、アプリケーションに特化したものではありません。Amazon EKS アドオンと Amazon EBS CSI ドライバーの詳細については、こちらの記事を参照してください。

ソリューション概要

この記事では、Amazon EBS CSI ドライバーの特定の機能に焦点を当てます。それが Kubernetes ボリュームスナップショットです。Kubernetes ボリュームスナップショットを使用すると、特定の時点における Amazon EBS ボリュームのコピーを作成できます。このコピーを使用して、ボリュームを以前の状態に戻したり、新しいボリュームをプロビジョニングしたりすることができます。

Kubernetes バージョン 1.17 以降から、以下のコンポーネントを用いて、Amazon EBS のボリュームスナップショットを作成し Pod にアタッチすることができます。

前提条件

  1. このチュートリアルを完了させるための前提条件は、Kubernetes バージョン 1.20 またはそれ以降で実行されている Amazon EKS クラスターがあることです。Amazon EKS クラスターを起動する方法についての解説が必要な場合は、Amazon EKS のドキュメントを参照してください。
  2. Amazon EKS CSI ドライバーのスナップショット機能を使用するには、EKS アドオンをインストールする前に、external-snapshotter をインストールする必要があります。external-snapshotter は以下のコンポーネントを順にインストールする必要があります。

Custom Resource Definition (CRD) は、Kubernetes API (Application Programming Interface) の拡張機能で、デフォルトの Kubernetes インストールで利用できるとは限りません。CRD は特定の Kubernetes インストールの拡張を表現しています。しかし、現在では多くの Kubernetes コア機能がカスタムリソースを使用して構築されており、Kubernetes をよりモジュール化することができます。

ボリュームスナップショットコントローラーは、Kubernetes ボリュームスナップショット CRD をウォッチし、CSI エンドポイントに対して、CreateSnapshot/DeleteSnapshot をトリガーします。詳細については、GitHub の CSI Snapshotter を参照してください。

  1. CSI ドライバーのインストールプロセスには、IAM ポリシーと、ServiceAccount 作成プロセスの一部で使用する IAM ロールの作成が含まれています。AWSAmazonEBSCSIDriverPolicy と呼ばれる AWS 管理ポリシーを提供しています。IAM ロール、Service Account を作成し、必要な AWS 管理ポリシーをアタッチする方法の詳細は、こちらを参照してください。
  2. IAM ロールと ServiceAccount の作成が完了したら、ドキュメントに従って、Amazon EBS CSI ドライバーを EKS アドオンとしてインストールします。

すべてが正しくインストールされたことを確認するために、以下のコマンドを実行してください。

eksctl get addon --name aws-ebs-csi-driver --cluster my-cluster

出力例は以下のようになります。

NAME                  VERSION              STATUS ISSUES 
aws-ebs-csi-driver    v1.5.1-eksbuild.1    ACTIVE 0   
Git

ウォークスルー

Storage Class と Persistent Volume Claim を作成する

ストレージの管理は、コンピュートインスタンスの管理とは性質が異なる課題です。Kubernetes の Persistent Volume (PV) 、Persistent Volume のサブシステムは、ストレージを提供する方法と利用する方法の詳細を抽象化した API をユーザーと管理者に提供します。ストレージの管理をおこなうための 2 つの API リソースを紹介します。PersistentVolumePersistentVolumeClaim です。PV は管理者によってプロビジョニングされた、あるいは StorageClass を使用して動的にプロビジョニングされた、クラスターのストレージの一部です。

  1. StorageClass と VolumeSnapshotClass を作成する
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/storageclass.yaml
  1. PersistentVolumeClaim とデモ用の Pod をクラスターにデプロイします。デモ用の Pod を例として使用し、 現在の日付と時刻を 5 秒間隔で out.txt というファイルに書き込んでいます。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/app/claim.yaml

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/app/pod.yaml
Git

kubectl get pods コマンドを実行して、Pod が動作していることを確認します。以下の図のような出力が表示されるはずです。

Pod が動作していることを確認した後に、以下のコマンドを実行することで、PersistentVolume に書き込まれている内容を確認できます。

kubectl exec -it app cat /data/out.txt | tail -n 3
Git

以下の図のような出力が表示されるはずです。

テスト:テスト用の Volume Snapshot Class と Snapshot を作成します。

  1. PersistentVolumeClaim 名を参照する VolumeSnapshot を作成します。
cat <<EOF | kubectl apply -f -
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: ebs-volume-snapshot
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: ebs-claim
EOF
YAML

AWS マネジメントコンソールで「 Amazon EC2 」の「ボリューム」ページに移動して、新しい Amazon EBS スナップショットが作成されていることを確認します。以下の図のような表示がされるはずです。

また以下のコマンドを実行することで、Volume Snapshot の作成を確認できます。

kubectl get volumesnapshot

以下の図のような出力が表示されるはずです。

検証
テストのため、セットアップ時に作成したアプリケーションを削除します。

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/app/pod.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/app/claim.yaml
Git

dataSource で VolumeSnapshot を参照する PersistentVolumeClaim を用いて、スナップショットからボリュームをリストアします。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-snapshot-restored-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 10Gi
  dataSource:
    name: ebs-volume-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
EOF
YAML

これでアプリケーションを再作成することができます。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/snapshot-restore/pod.yaml
Git

前のステップで作成したスナップショットから、新しい Amazon EBS ボリュームが自動的に作成されているはずです。以下の図のように、AWS マネジメントコンソールの Amazon EC2 の ボリュームタブに移動して確認することができます。

以下のコマンドを実行して、Pod にアタッチされている永続ボリュームにスナップショットのデータが存在することを確認してください。

kubectl exec app -- cat /data/out.txt | head -n 10
Git

このコマンドは以下の図に示すような情報を返すはずです。

以下のスクリーンショッで示すように、スナップショットから作成された Amazon EBS ボリュームは、元のボリュームと異なる容量を持つことができます。

この記事で通して解説してきた例を確認したい場合は、こちらの GitHub のリンクも参照してください。

結論

スナップショットに関するオペレーションは、ステートフルなワークロードにとっては重要な機能だと考えられています。Kubernetes API 内でスナップショット操作を実行する手段を提供することで、管理者は Kubernetes API を迂回することなくスナップショットのユースケースを処理できるようになりました。この記事では、Amazon EBS スナップショットと EBS ボリュームを活用して Pod に 永続ストレージを追加するために、Amazon EBS CSI ドライバーをうまく活用する方法を紹介しました。この記事があなたの Kubernetes プロジェクトの助けになることを願っています。

翻訳はソリューションアーキテクトの後藤が担当しました。原文はこちらです。