Amazon Web Services ブログ

AWS Fargate がより大きなエフェメラルストレージのサポートを開始

この記事は AWS Fargate adds support for larger ephemeral volumes (記事公開日 : 2023 年 8 月 1 日) の翻訳です。

導入

AWS Fargate は、従量課金で利用可能なサーバーレスコンピューティングエンジンです。AWS Fargate を使用することで、サーバーの管理不要でアプリケーションの構築にフォーカスできます。本日より、Amazon EKS の Fargate Pod 内のコンテナに対して、最大 175 GiB のエフェメラルストレージを割り当て可能になりました。以前は、すべての Fargate Pod にデフォルトで 20 GiB のエフェメラルストレージが割り当てられ、このストレージのコストは Fargate Pod の実行コストに含まれていました。

エフェメラルストレージの容量を設定した場合、コンテナに割り当てたエフェメラルストレージのうち、デフォルトの 20 GiB を超えて追加した分にのみ課金が発生します。AWS Fargate は、各コンテナのエフェメラルストレージの約 10% をファイルシステムのために確保し、加えて約 5 GiB を様々なシステムコンポーネントのために確保するため、実際にプロビジョニングされるエフェメラルストレージの容量は、要求した容量よりも常に大きくなります。以下の式を使用して、その容量を概算できます。

(エフェメラルストレージの要求 + (10% * エフェメラルストレージの要求) + 5 GiB)

例えば、それぞれ 50 GiB のエフェメラルストレージを要求する 2 つのコンテナで Pod を構成する場合、AWS Fargate は少なくとも 115 GiB (100 + (10% * 100) + 5) のエフェメラルストレージをプロビジョニングします。以下のコマンドを実行することで、実際にプロビジョニングされたエフェメラルストレージの容量と、そのうち割り当て可能な容量を確認できます。

kubectl get node <fargate_node_name> -o=jsonpath="{$.status.capacity.ephemeral-storage}"
kubectl get node <fargate_node_name> -o=jsonpath="{$.status.allocatable.ephemeral-storage}"

実際にプロビジョニングされたエフェメラルストレージの容量は、上式の計算結果とほぼ同じ、この例では約 115 GiB となります。しかし、デフォルトの 20 GiB が無料で含まれているため、課金が発生するのは約 95 GiB のストレージのみです。エフェメラルストレージのコストは、計算式から 20 GiB を差し引き、その結果に AWS Fargate の料金ページに記載されている該当リージョンの GiB あたりの時間単価を掛け合わせることで概算できます。

(訳注 : 上式の計算結果はあくまでも概算です。この後のウォークスルーでも、30 GiB と 70 GiB のエフェメラルストレージを要求するコンテナを含む Pod を作成しており、上式の計算結果は 115 GiB となります。しかし、実際には約 122.9 GiB のエフェメラルストレージがプロビジョニングされ、そのうち約 104 GiB がコンテナに割り当て可能となることを、上記コマンドにより確認できます。このとき、上記コマンドの出力単位は KiB であることに注意してください。)

最大で 175 GiB のエフェメラルストレージを利用できるようになったため、機械学習の推論やメディア変換、ETL 処理、非常に大きなデータセットやファイルを扱うデータ処理ワークロードなど、より幅広いワークロードを AWS Fargate 上で実行できます。

以下のセクションでは、エフェメラルストレージを持つ Pod を作成する方法と、AWS Fargate はどのような流れでプロビジョニングするエフェメラルストレージの容量を決定するのか、について説明します。

ウォークスルー

前提条件

この記事で利用するサンプルワークロードをデプロイするには、以下のツールが必要です。

Fargate Pod にエフェメラルストレージを割り当てる

このデモでは、Fargate プロファイルを持つ Amazon EKS クラスターを使用します。以下のように、eksctl を使用してクラスターを作成できます。

eksctl create cluster --fargate

--fargate を指定することで、eksctl は Pod 実行ロールと Fargate プロファイルを作成し、AWS Fargate 上で実行するように coredns を設定します。

サンプルワークロードのデプロイ

まず Deployment を作成し、エフェメラルストレージを割り当てた 2 つのコンテナを含む Pod をデプロイします。

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fargate-ephvol-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fargate-ephvol-test
  template:
    metadata:
      labels:
        app: fargate-ephvol-test
    spec:
      containers:
      - name: fargate-container1
        image: busybox
        command: [ "/bin/sh", "-c", "--" ]
        args: [ "while true; do sleep 30; done;" ]
        resources:
          limits:
            ephemeral-storage: 60Gi
          requests:
            ephemeral-storage: 30Gi
      - name: fargate-container2
        image: busybox
        command: [ "/bin/sh", "-c", "--" ]
        args: [ "while true; do sleep 30; done;" ]
        resources:
          requests:
            ephemeral-storage: 70Gi
EOF

この例では、AWS Fargate は 122.9 GiB のエフェメラルストレージをプロビジョニングし、Pod のルートボリュームにマウントします。その結果、2 つのコンテナはこのルートボリューム全体にアクセスでき、1 つ目のコンテナに対して 60 GiB のエフェメラルストレージの制限を定義しているにもかかわらず、そのコンテナはルートボリューム全体を使用できるようになります。これは、AWS Fargate がエフェメラルストレージの制限を無視するからです。つまり、fargate-container1 が使用するストレージ容量が 60 GiB を超えても、kubelet eviction manager は Pod を evict しません。2 つのコンテナは、どちらもボリュームが満杯になるまでルートボリュームに書き込むことができます。

Amazon Elastic Compute Cloud (Amazon EC2) のワーカーノードでは、コンテナの書き込み可能レイヤーとログの使用量がストレージの制限を超えると、kubelet がその Pod を eviction の対象にします。一方 EKS Fargate ではこの制限が無視されるため、Pod は evict されません。加えて、EKS Fargate のすべての Pod には、system-node-critical の PriorityClass が適用されます。

リソース制限は、ノイジーネイバー問題に対処するための Kubernetes の仕組みの 1 つです。リソース制限は、割り当てた容量を超えて Pod がリソースを消費し、ノード上の他の Pod に影響を与えてしまうことを防ぎます。しかし、AWS Fargate では、すべての Pod が個別のストレージ、ネットワーク、CPU、メモリを持つ専用の VM 上で実行されるため、Fargate Pod のリソース消費量を制限する必要はありません。

エフェメラルストレージの割り当て

EKS Fargate に Pod がスケジュールされると、エフェメラルストレージの要求 (要求が未定義の場合には制限) によって、プロビジョニングするエフェメラルストレージの容量が決まります。

  • すべての init コンテナ、あるいはすべての長時間起動するコンテナに対するエフェメラルストレージの要求のうち、大きい方の値 (最大 175 GiB) に基づいて、AWS Fargate がプロビジョニングするエフェメラルストレージの容量が決まります。
  • すべての Fargate Pod には、デフォルトで 20 GiB のエフェメラルストレージが割り当てられます。Pod が 20 GiB 以上のエフェメラルストレージを要求した場合、AWS Fargate は追加のエフェメラルストレージを割り当てます。
  • AWS Fargate は、要求が未定義の場合にのみ、エフェメラルストレージの制限に基づいてエフェメラルストレージを割り当てます。

他のリソースの要求や制限と同様に、リソースクォータまたは Limit Range を設定することで、割り当て可能なエフェメラルストレージの容量を制限できます。例えば、以下の Limit Range では、デフォルトのエフェメラルストレージの要求を 20 GiB、最大値を 175 GiB に設定しています。

apiVersion: v1
kind: LimitRange
metadata:
  name: storage-limit-range
spec:
  limits:
  - defaultRequest:
      ephemeral-storage: 20Gi
    max: 
      ephemeral-storage: 175Gi 
    type: Container

エフェメラルストレージの使用量の監視

kubectl describe node コマンドでエフェメラルストレージの容量を確認できます。

また、kubelet は Summary API でエフェメラルストレージの使用量をレポートします。

$ kubectl get --raw \
 "/api/v1/nodes/{node}/proxy/stats/summary"
 
...
"ephemeral-storage": {
    "time": "2023-04-26T00:21:41Z",
    "availableBytes": 43025469440,
    "capacityBytes": 80135319552,
    "usedBytes": 21474951168,
    "inodesFree": 4802640,
    "inodes": 4980736,
    "inodesUsed": 24
   }
...

現在 Kubernetes では、Prometheus に対してエフェメラルストレージのメトリクスを公開していません (GitHub issue)。

エフェメラルストレージの使用状況を監視する必要がある場合は、kubelet の stat API エンドポイントからデータをエクスポートする kubelet-stats-exporter などのオープンソースプロジェクトを使用できます。

後片付け

サンプルの Deployment を削除します。

kubectl delete deployment fargate-ephvol-test

EKS クラスターを新規作成した場合は、以下のコマンドでクラスターを削除します。

eksctl delete cluster <cluster name>

まとめ

この記事では、サーバーレスコンピューティングプラットフォームである AWS Fargate を使用することで、ノードのメンテナンスとスケーリングを抽象化し、運用・管理のオーバーヘッドを削減できることを紹介しました。AWS Fargate では、各 Pod は個別のストレージ、メモリ、CPU を持つ専用のコンピューティング環境で実行されます。今回のアップデートにより、最大で 175 GiB のエフェメラルストレージを Amazon EKS の Fargate Pod に割り当て可能になり、EKS Fargate を利用可能なユースケースが大きく広がりました。このストレージ容量の増加によってどのようなことが実現されるのか、非常に楽しみです。EKS Fargate を使い始める際は、Amazon EKS Fargate のドキュメントをご確認ください。