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 にアタッチすることができます。
前提条件
- このチュートリアルを完了させるための前提条件は、Kubernetes バージョン 1.20 またはそれ以降で実行されている Amazon EKS クラスターがあることです。Amazon EKS クラスターを起動する方法についての解説が必要な場合は、Amazon EKS のドキュメントを参照してください。
- Amazon EKS CSI ドライバーのスナップショット機能を使用するには、EKS アドオンをインストールする前に、external-snapshotter をインストールする必要があります。external-snapshotter は以下のコンポーネントを順にインストールする必要があります。
-
VolumeSnapshotClass
、VolumeSnapshot
およびVolumeSnapshotContent
の CustomResourceDefinition (CRD)- RBAC (
ClusterRole
、ClusterRoleBinding
など) - コントローラーの Deployment
Custom Resource Definition (CRD) は、Kubernetes API (Application Programming Interface) の拡張機能で、デフォルトの Kubernetes インストールで利用できるとは限りません。CRD は特定の Kubernetes インストールの拡張を表現しています。しかし、現在では多くの Kubernetes コア機能がカスタムリソースを使用して構築されており、Kubernetes をよりモジュール化することができます。
ボリュームスナップショットコントローラーは、Kubernetes ボリュームスナップショット CRD をウォッチし、CSI エンドポイントに対して、CreateSnapshot/DeleteSnapshot をトリガーします。詳細については、GitHub の CSI Snapshotter を参照してください。
- CSI ドライバーのインストールプロセスには、IAM ポリシーと、ServiceAccount 作成プロセスの一部で使用する IAM ロールの作成が含まれています。AWS は
AmazonEBSCSIDriverPolicy
と呼ばれる AWS 管理ポリシーを提供しています。IAM ロール、Service Account を作成し、必要な AWS 管理ポリシーをアタッチする方法の詳細は、こちらを参照してください。 - IAM ロールと ServiceAccount の作成が完了したら、ドキュメントに従って、Amazon EBS CSI ドライバーを EKS アドオンとしてインストールします。
すべてが正しくインストールされたことを確認するために、以下のコマンドを実行してください。
出力例は以下のようになります。
ウォークスルー
Storage Class と Persistent Volume Claim を作成する
ストレージの管理は、コンピュートインスタンスの管理とは性質が異なる課題です。Kubernetes の Persistent Volume (PV) 、Persistent Volume のサブシステムは、ストレージを提供する方法と利用する方法の詳細を抽象化した API をユーザーと管理者に提供します。ストレージの管理をおこなうための 2 つの API リソースを紹介します。PersistentVolume
と PersistentVolumeClaim
です。PV は管理者によってプロビジョニングされた、あるいは StorageClass を使用して動的にプロビジョニングされた、クラスターのストレージの一部です。
- StorageClass と VolumeSnapshotClass を作成する
- PersistentVolumeClaim とデモ用の Pod をクラスターにデプロイします。デモ用の Pod を例として使用し、 現在の日付と時刻を 5 秒間隔で out.txt というファイルに書き込んでいます。
kubectl get pods
コマンドを実行して、Pod が動作していることを確認します。以下の図のような出力が表示されるはずです。
Pod が動作していることを確認した後に、以下のコマンドを実行することで、PersistentVolume に書き込まれている内容を確認できます。
以下の図のような出力が表示されるはずです。
テスト:テスト用の Volume Snapshot Class と Snapshot を作成します。
PersistentVolumeClaim
名を参照するVolumeSnapshot
を作成します。
AWS マネジメントコンソールで「 Amazon EC2 」の「ボリューム」ページに移動して、新しい Amazon EBS スナップショットが作成されていることを確認します。以下の図のような表示がされるはずです。
また以下のコマンドを実行することで、Volume Snapshot の作成を確認できます。
kubectl get volumesnapshot
以下の図のような出力が表示されるはずです。
検証
テストのため、セットアップ時に作成したアプリケーションを削除します。
dataSource で VolumeSnapshot を参照する PersistentVolumeClaim を用いて、スナップショットからボリュームをリストアします。
これでアプリケーションを再作成することができます。
前のステップで作成したスナップショットから、新しい Amazon EBS ボリュームが自動的に作成されているはずです。以下の図のように、AWS マネジメントコンソールの Amazon EC2 の ボリュームタブに移動して確認することができます。
以下のコマンドを実行して、Pod にアタッチされている永続ボリュームにスナップショットのデータが存在することを確認してください。
このコマンドは以下の図に示すような情報を返すはずです。
以下のスクリーンショッで示すように、スナップショットから作成された Amazon EBS ボリュームは、元のボリュームと異なる容量を持つことができます。
この記事で通して解説してきた例を確認したい場合は、こちらの GitHub のリンクも参照してください。
結論
スナップショットに関するオペレーションは、ステートフルなワークロードにとっては重要な機能だと考えられています。Kubernetes API 内でスナップショット操作を実行する手段を提供することで、管理者は Kubernetes API を迂回することなくスナップショットのユースケースを処理できるようになりました。この記事では、Amazon EBS スナップショットと EBS ボリュームを活用して Pod に 永続ストレージを追加するために、Amazon EBS CSI ドライバーをうまく活用する方法を紹介しました。この記事があなたの Kubernetes プロジェクトの助けになることを願っています。
翻訳はソリューションアーキテクトの後藤が担当しました。原文はこちらです。