Amazon Web Services ブログ
EKS on Bottlerocket で EFS を永続ストレージに使用する
この記事は Persistent Storage using EFS for EKS on Bottlerocket (記事公開日: 2021 年 7 月 9 日) を翻訳したものです。
この記事では Bottlerocket OS を使用した Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで、Amazon Elastic File System (Amazon EFS) を永続ストレージとして利用する方法について説明します。永続ストレージは、長時間実行されるステートフルアプリケーションが高可用性のために状態を永続化したり、共有データセットを中心にスケールアウトするために必要です。これは機械学習ワークロードを実行し、共有データセットやデータサイエンスのためのホームディレクトリを Amazon EFS に保存するお客様にも当てはまります。Amazon EFS を永続ストレージとして利用することにより、複数のコンテナにまたがって並行してモデルをトレーニングし、個々のデータサイエンスノートブックコンテナからデータにアクセスできます。機械学習用のオープンソースプラットフォームの例としては、MXNet、TensorFlow、Jupyter、Jupyterhub、Kubeflow などがあります。
この記事で紹介に入る前に、各コンポーネントとサービスの概要を説明します。
Bottlerocket はオープンソースの Linux ベース OS です。コンテナワークロードを実行するために構築、最小化されています。コンテナセキュリティのベストプラクティスに従った安全な設計になっています。コンテナの実行に必要なツールのみが含まれており、攻撃対象領域 (アタックサーフェス)と脆弱性の影響を大幅に軽減します。最小化されていることで Bottlerocket を実行するノードは起動時間が短く、さまざまなトラフィックパターンやワークロードの変化に基づいてクラスターを迅速に拡張できます。
Amazon Elastic File System (Amazon EFS) は、ストレージのプロビジョニングや管理を行わずにファイルデータを共有できる、シンプルでサーバーレスで伸縮自在なファイルシステムを提供します。AWS のサービスやオンプレミスのリソースと併用でき、アプリケーションを中断することなくオンデマンドでペタバイト規模まで拡張できるように構築されています。
Bottlerocket OS は読み取り専用のファイルシステムを使用して、ホスト OS の全体的なセキュリティ体制 (security posture) を改善します。これを考慮して、クラスターノードとその上で実行されている Pod 間の共有ストレージソリューションを実装するためには特定のステップを踏む必要があります。この記事では、Bottlerocket OS で EFS を活用してステートフルなワークロードを実行し、データを永続化する方法を示します。
図 1: Amazon EFS と Bottlerocket を使用した Amazon EKS クラスター
この例では、Bottlerocket OS を実行し EFS を共有する 3 つのワーカーノードを持つ EKS クラスターを構築しました。busybox アプリケーション app1 と app2 の 2 つをデプロイし、共通/データマウントを共有します。
前提条件
EKS クラスターの使用を開始するにはいくつかの必須の前提条件があります。Amazon EKS の開始方法の内容にしたがって、eksctl、kubectl、AWS コマンドラインインターフェイス (CLI)、Helm CLI をインストールして設定する必要があります。
クラスターを作成するには、適切な IAM ロールとアクセス権限を持つことが重要です。
Bottlerocket を使用した Amazon EKS クラスターをセットアップする手順については、こちらをご覧ください。
1. EKS クラスターのセットアップ後、次のコマンドを実行してノードが Bottlerocket OS 上で実行されていることを確認します。
図 2: EKS ワーカーノードの一覧
Amazon EFS CSI ドライバーのインストールと設定手順
2. EFS のファイルシステムを作成します。
EFS ファイルシステムを作成するには次のコマンドを使用します。
この例では、ファイルシステムに「eks-efs」という名前を付けています。
3. EKS クラスターが実行されている VPC の ID を取得します。
次のコマンドを実行して VPC の ID を取得します。
4. ステップ 3 で取得した VPC ID を使用して、CIDR ブロックを取得します。
5. ステップ 3 で取得した VPC ID を使用して、セキュリティグループを作成します。
この例では、セキュリティグループに「efs-test-sg」という名前を付けています。
6. ステップ 4 で取得した CIDR ブロックと、ステップ 5 で出力されたセキュリティグループの ID を使用して、クラスターの VPC の CIDR からのインバウンド NFS トラフィックを許可するインバウンドルールを作成します。
7. EFS のマウントターゲットを作成します。
サブネット ID ごとに以下のコマンドを実行してマウントターゲットを作成します。
Helm を使用して CSI ドライバをインストールする手順
次のコマンドを実行して aws-efs-csi-driver が起動したことを確認します。
次の GitHub リポジトリをクローンします。
PV (Persistence Volume)、PVC (Persistence Volume Claim)、StorageClass、および PV を使用する Pod を作成します。
pv.yaml のボリュームハンドルの値を、新しい EFS ファイルシステムに一致するように書き換えてから、次のコマンドを実行します。
Pod (pod1 と pod2) が同じ EFS ファイルシステムに同時に書き込みます。
以下のコマンドを使用して Pod が実行されていることを確認します。
両方の Pod からデータが EFS ファイルシステムに書き込まれていることを確認します。
データの永続化の検証
データが維持されているかどうかを確認するには、Pod app1、app2 を再起動し、ファイル out1.txt と out2.txt が /data の下のマウントに残っていることを検証します。
まとめ
Bottlerocket OS で実行されている EKS ワーカーノードと Amazon EFS を統合することで、全体的なセキュリティ体制と基盤となるパフォーマンスを向上させながら、ステートフルなワークロードを実行できます。Amazon EFS では、数千もの Pod または EC2 インスタンスが共有ボリュームに対して同時に読み書きできます。この記事は、EKS ワーカーノード間でセキュアな共有ストレージを必要とするワークロードのデプロイに役立ちます。
翻訳はソリューションアーキテクト加治が担当しました。原文はこちらです。