Amazon Web Services ブログ

新機能 – AWS Fargate for Amazon EKS が新たに Amazon EFS をサポート

AWS Fargate は、Amazon Elastic Kubernetes Service (EKS) と Amazon Elastic Container Service (ECS) の両方で利用できるコンテナ用のサーバーレスコンピューティングエンジンです。Fargate の使用により、デベロッパーはアプリケーションの構築に集中することができるようになるため、インフラストラクチャ関連の「Undifferentiated Heavy Lifting」(差別化につながらない重労働) を管理する必要がなくなります。

デベロッパーは Kubernetes ポッドごとにリソースを指定し、プロビジョニングされたコンピューティングリソースのみの料金が請求されます。Fargate の使用時は、各 EKS ポッドが独自のカーネルランタイム環境を実行し、CPU、メモリ、ストレージ、およびネットワークリソースが他のポッドと共有されることがないため、ワークロードが分離され、セキュリティが強化されます。

コンテナの性質はエフェメラルです。これらは動的に拡大/縮小され、保存された状態またはデータは終了時に消去されます。Fargate の EKS サポートを 2019 年に開始して以来、コンテナ化されたアプリケーションのデータの永続性と共有ストレージについての要件をお客様から多数お聞きした AWS では、2020 年 4 月に ECS 上の Fargate のための Amazon Elastic File System(EFS) サポートを発表しました。現在、多くのお客様がこれを使用してステートフルワークロードを運用しておられますが、EKS で Fargate を使用する場合の EFS のサポートをお求めのお客様もおられました。本日は、この EFS サポートの開始についてお知らせしたいと思います。

EFS は、AWS クラウドサービスでの使用のためのシンプルでスケーラブルなフルマネージド共有ファイルシステムを提供し、EFS に書き込まれるすべてのデータが複数の AWS アベイラビリティーゾーンに書き込まれるため、Kubernetes アプリケーションの可用性向上にも役立ちます。EFS は、アプリケーションを中断しない、オンデマンドでのペタバイト規模の拡大のために構築されており、ファイルの追加や削除に応じて自動的に拡大/縮小されることから、拡大に対応するために容量をプロビジョニングし、管理する必要がなくなります。EFS アクセスポイントは、ファイルシステム内のデータ転送時のデータを暗号化できるため、セキュリティセンシティブなワークロードにも最適です。

Kubernetes は、ブロックおよびファイルストレージシステムをコンテナ化されたワークロードに公開するための標準である「Container Storage Interface (CSI)」をサポートしています。EFS CSI ドライバーは、Kubernetes クラスター用の伸縮自在なファイルストレージの設定をシンプルにします。この更新が行われるまで、お客様はクラスターに接続された Amazon EC2 ワーカーノード経由で EFS を使用することができましたが、これからは、標準の Kubernetes API を使用して、Fargate で実行されているポッドを EFS ファイルシステムにアクセスするよう設定することも可能なります。この更新により、お客様は、可用性に優れたファイルシステムを必要とするステートフルワークロードに加えて、共有ストレージへのアクセスを必要とするワークロードも実行することが可能になります。EFS CSI ドライバーを使用すると、転送時のデータはすべてデフォルトで暗号化されます。

EKS 向けの Amazon EFS CSI ドライバーの一般提供バージョンは 2020 年 7 月にリリースされました。Amazon EFS CSI ドライバーを使用すると、標準の Kubernetes インターフェイスを使用して、AWS で実行される EKS クラスターとセルフマネージド Kubernetes クラスターの両方に伸縮自在なファイルストレージを簡単に設定できます。Kubernetes ポッドを終了して再起動する場合、そのポッドが異なる AWS アベイラビリティーゾーンで再起動されたとしても、CSI ドライバーが EFS ファイルシステムを再度接続します。 標準の EC2 ワーカーノードを使用する場合は、EFS CSI ドライバーをポッドと DaemonSet のセットとしてデプロイする必要がありますが、この新しい更新では、Fargate にこのステップが必要なく、EFS CSI ドライバーをインストールしなくてもよくなります。ドライバーは Fargate スタックにインストール済みで、EFS が設定なしでサポートされるからです。お客様は、CSI ドライバーをインストールして更新するための時間とリソースを費やすことなく、Fargate for EKS で EFS を使用することができます。

Fargate/EKS と EFS の統合を設定する方法

EKS 上の Fargate に EFS をマウントするには、3 つの Kubernetes 設定を使用する必要があります。これらの設定は、StorageClassPersistentVolume (PV)、および PersistentVolumeClaim (PVC) です。StorageClass と PV の設定は、アプリケーションデベロッパーが EFS ファイルシステムを利用できるようにするために管理者 (または同様の役割を持つ人) が行う手順です。PVC は、アプリケーションをデプロイする際の必要に応じて、既存の PV プールからの PV を割り当てるために使用されます。

StorageClass オブジェクトは、Kubernetes 管理者が特定のストレージタイプ (EFS、EBS など) と、設定 (スループット、バックアップポリシーなど) を登録するための手段を提供します。StorageClass が定義されると、そのクラス内に実際のストレージボリュームを作成するために PV オブジェクトが使用されます。StorageClass と PV は、実際のストレージサブシステムを抽象化し、Kubernetes ユーザーがそれらを使用する方法から切り離すことを可能にする Kubernetes のメカニズムです。例えば、Kubernetes 管理者は、特定のストレージサービスから特定のストレージの設定を正確に行う方法を知っておく必要がありますが、Kubernetes ユーザーにはストレージの抽象クラス内のボリュームしか表示されないため、その必要はありません。

最後のステップはバインディングです。Kubernetes ユーザーが、PVC オブジェクトと関連する API を介してこのボリュームへのアクセスをリクエストします。これらのボリュームは、ユーザーが PVC 経由でリクエストするときに動的に作成できますが、Kubernetes ユーザーが後で使用できるように、管理者が静的に事前作成する必要がある場合もあります。現在の EFS CSI ドライバーの実装では、PVC のバインディングを機能させるために、ボリュームを前もって静的に作成しておくことが必要です。

Kubernetes の永続ボリュームを初めて使用しており、それらがどのように動作するかについて詳しく知りたいという場合は、詳細がすべて記載されている Kubernetes ドキュメントのこのページを参照してください。

では、これを実際に見てみましょう。まず、同じ AWS リージョンに独自の EFS ファイルシステムを作成する必要があります。EFS になじみがないという場合は、EFS の入門ガイドが使用を開始する上での優れたリソースです。

EFS ファイルシステムを作成したら、ファイルシステム ID を取得します。マウントの設定は Kubernetes の StorageClass と PersistentVolume を使用して実行できます。以下は、YAML ファイルの例です。

CSIDriver オブジェクト

apiVersion: storage.k8s.io/v1beta1
kind: CSIDriver
metadata:
  name: efs.csi.aws.com
spec:
  attachRequired: false

現時点では、上記の EFS CSIDriver オブジェクトをクラスターに追加して、Fargate が自動的にインストールするドライバーを Kubernetes が検出できるようにする必要がありますが、将来はこのマニフェストが EKS クラスターにデフォルトで追加される予定です。

ストレージクラス

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com

PersistentVolume(PV)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: <EFS filesystem ID>

ファイルシステムの作成時に EFS サービスから volumeHandle が返されるので、それを使って CSI ドライバーを設定して PV を作成させる必要があります。EFS filesystem ID は AWS マネジメントコンソールから取得、または AWS CLI による以下のコマンドで取得できます。

aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

上記のマニフェストを適用することによって PV が作成されたところで、Kurbenetes ポッドのマニフェストに PersistentVolumeClaim を含めることによって、EFS ファイルシステムにアクセスするようポッドを設定します。以下は、これを実行する 2 つのマニフェストの例です。

PersistentVolumeClaim (PVC)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi

Pod manifest

apiVersion: v1
kind: Pod
metadata:
  name: app1
spec:
  containers:
  - name: app1 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out1.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

今すぐご利用いただけます

この機能更新は、本日から Kubernetes バージョン 1.17 で新たに作成された EKS クラスターでの利用が可能となります。AWS では、今後数週間のうちに EKS での追加の Kubernetes バージョンを使った本機能のサポートを公開する予定です。この更新は、Fargate with EKS が提供されているすべての AWS リージョンでご利用いただけます。詳細については、最新のドキュメントをご覧ください。

– Kame;