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 ロールの作成が含まれています。AWS は AmazonEBSCSIDriverPolicy と呼ばれる 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 リソースを紹介します。PersistentVolume と PersistentVolumeClaim です。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 プロジェクトの助けになることを願っています。

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