Amazon EKSで使えるPersistentVolumeについて比べてみた

# はじめに
- Amazon EKSでステートフルアプリケーションを構築する際にPersistentVolumeをどのストレージサービスで提供するのが良いのかを考えてみた。
- 可能な限り公式の情報を参照しているが、万が一誤った情報があればひたすら陳謝するのみである。
- 2022年3月時点での情報なので将来どうなるかは神のみぞ知る。

# まずはググる
- 「eks persistentvolume」というキーワードでググってみると、検索結果の最上位に以下の記事が出てきた。こちらの記事によると、Amazon EBSかAmazon EFSを使えるらしい。
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-persistent-storage/
    ![amazon_eks_pv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/88ebc401-fde3-3762-7bae-468aa0768369.png)

- ちょっとググり方を変えて「eks csi driver」キーワードでググってみると、検索結果の最上位に以下の記事が出てきた。こちらの記事はEBS用のCSI driverの情報であるが、ドキュメントを遡るとEKSのPersistentVolumeとして使えるのはAmazon EBSか、Amazon EFSか、Amazon FSx for Lustreか、Amazon FSx for NetApp ONTAPの4択とのこと。
    - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/ebs-csi.html
    ![amazon_eks_csi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/9a9858d0-9a58-dc31-44ed-996aec1498c3.png)

- Amazon FSx for Lustreは用途が限られていてあまり汎用的ではない気がするので、より汎用的に使えそうな次の3択で比較することとする。
    1. Amazon EBS（以下、EBS）
    1. Amazon EFS（以下、EFS）
    1. Amazon FSx for NetApp ONTAP（以下、FSx for ONTAP）

# 比べてみた
## ストレージサービス自体の比較
- まずは単純にストレージサービス自体を比較をしてみた。
- 比較項目は、一般的にストレージ選定にあたり考えておくべきポイントを網羅しているつもりである。
- 前提として、EBSは一般的によく本番利用する可能性が高いであろうgp2/gp3/io1/io2を対象とした。

### 比較表
|比較項目|EBS|EFS|FSx for ONTAP|
|---|---|---|---|
|容量|<ul><li>gp2/gp3: 1GB～16TB</li><li>io1/io2: 4GB～16GB</li></ul>|無制限|<ul><li>プライマリストレージ: 1TB～192TB</li><li>容量プール: 無制限</li></ul>|
|プロトコル|iSCSI|NFS（v4.0、v4.1）|<ul><li>SMB（2、3.1.1）</li><li>NFS（v3、v4.0、v4.1）</li><li>iSCSI</li></ul>|
|AZ冗長性|シングルAZ（EBS単体ではSPOF）|マルチAZ|マルチAZ|
|可用性|<ul><li>gp2/gp3/io1: 99.8%～99.9%</li><li>io2: 99.999%</li></ul>|99.99%|99.99%|
|バックアップ（格納データ自体の保護）|EBSスナップショット|<ul><li>AWS Backup</li><li>EFS-to-EFS バックアップ</li></ul>|<ul><li>NetApp Snapshot</li><li>FSxのバックアップ</li></ul>|
|バックアップ（ボリューム障害からの保護）|EBSスナップショット|<ul><li>AWS Backup</li><li>EFS-to-EFS バックアップ</li></ul>|FSxのバックアップ|
|バックアップ（リージョン障害からの保護）|EBSスナップショットのリージョン間コピー|クロスリージョンレプリケーション|SnapMirror（ONTAPのレプリケーション機能）|
|ストレージ効率化機能|なし|Intelligent-Tiering|<ul><li>ストレージ階層化</li><li>重複排除/圧縮</li><li>シンプロビジョニング</li></ul>|
|最大IOPS/ボリューム|<ul><li>gp2/gp3: 16,000IOPS</li><li>io1/io2: 64,000IOPS</li></ul>|<ul><li>汎用モード: <ul><li>読み取り: 35,000IOPS</li><li>書き込み: 7,000IOPS</li></ul></li><li>最大I/Oモード: <ul><li>読み取り: 500,000IOPS以上</li><li>書き込み 100,000IOPS以上</li></ul>|<ul><li>デフォルト: TBあたり3,000IOPS</li><li>オプション: デフォルト（TBあたり3,000IOPS）に加えて最大80,000IOPSまで追加可能</li></ul>|
|最大スループット/ボリューム|<ul><li>gp2: 250MB/s</li><li>gp3/io1/io2: 1,000MB/s</li></ul>|<ul><li>バーストスループットモード: TBあたり最大100MB/s（バーストクレジットが使用可能な場合）</li><li>プロビジョンドスループットモード: 1024MB/s</li></ul>|2048MB/s|
|月額コスト（参考）|1,357.83 USD|921.60 USD|500.66 USD|

- 月額コストについては、課金体系が異なるので以下条件で[AWS Pricing Calculator](https://calculator.aws/#/)で比較してみた。条件によって大きく変わるのであくまで参考情報。
    - リージョン: 東京リージョン
    - サイズ: 1TB（FSx for ONTAPの最低容量に合わせた。）
    - 性能: プロビジョンドスループット128MB/s（FSx for ONTAPの最低スループットに合わせた。EBSの場合IOPS指定なので適当にブロックサイズ8KBとしてIOPSに換算して16,384‬IOPSのio1を選択した。）
    - バックアップ: 今回は無しで計算
    - 階層化や重複排除/圧縮などのストレージ効率化機能: 今回は無しで計算

### 所感
- 性能（IOPS、スループット）はサービス毎に仕様が違い過ぎて横並びで比較が難しそうなので一旦スルーしておく。
- コストについてもあくまで参考情報なので深く言及はしないが、EBSはio1でプロビジョンするIOPS次第ではかなりいいお値段になってしまうことがわかった。PersistentVolume用途に限らず、ストレージ性能が求められる場合は考え無しにEBSを使うのも見直した方がいいかもしれない。
- EBSはio2以外は可用性も低く、シングルAZのみというのは本番環境のPersistentVolumeとしては致命的な気がする。
- EFSは容量の制限が無いところが良さそう。NFSv3が未サポートなのはちょっと慎重になるケースもあるかもしれない。
- FSx for ONTAPは容量が1TBからと少し大きめだが、バックアップやストレージ効率化などの機能が充実しているので運用面やコスト面で良さそう。NFS（v3含め）とiSCSIの両方に対応しているのはより汎用性が高そう。


## CSI driverの比較
- KubernetesからストレージをPersistentVolumeとして扱うにはCSI driverが必要ということで、CSI driverの観点でも比較してみる。
- 前提として、EBSとEFS用のCSI driverはAWSが提供しているもの、FSx for ONTAP用のCSI driver（Tridentという名前）はNetAppが提供しているもの、という違いがある。どちらも無償で使える。

### 比較表
|比較項目|EBS|EFS|FSx for ONTAP|
|---|---|---|---|
|アクセスモード|Read/Write Single Pod|Read/Write Multiple Pods|Read/Write Multiple Pods|
|Dynamic Provisioning|〇|〇|〇|
|サポートする機能|<ul><li>Raw Block</li><li>Snapshot</li><li>Expansion</li></ul>|-|<ul><li>Raw Block</li><li>Snapshot</li><li>Expansion</li><li>Cloning</li><li>Topology</li></ul>|

### 所感
- EBS用CSI driverは、普通に使う分にはさほど問題なさそう。
- EFS用CSI driverは、[Kubernetes CSI Developer Documentation](https://kubernetes-csi.github.io/docs/drivers.html)や[EFS CSI driverのGutHub](https://github.com/kubernetes-sigs/aws-efs-csi-driver)をなどを参照する限り、機能としてのExpansionは無いがEFS自体が容量を指定するものではなく自動拡張していく、というか無限に使えるものなので実質拡張はできる。（厳密には、Kubernetes側の仕様上何かしら適当な容量を指定しないといけないけど、CSI driverのAPIではそれをEFSに渡さず無視して容量としては無限に使えるという仕組みのよう。）SnapshotやCloningなどは対応していないのでKubernetesのレイヤーからこのようなオペレーションをしたい場合は採用できない。
- FSx for ONTAP用CSI driver（Trident）は、最も機能が充実しており、まず困ることはなさそう。

# 結論: 最有力候補はFSx for ONTAP
- EBSは、可用性があまり高くないのとシングルAZのみということが不安材料。可用性と性能の要件が高くなければEBSでも良いかもしれない。
- EFSは、性能を確保しようとすると割高になり、機能面があまり充実していないので、遅くても良くてシンプルに使うだけであれば良いかもしれない。
- FSx for ONTAPは、可用性や性能の要件が高い場合は最もコスト効率よく使えそう。CSI driver側の機能も充実しているところも高評価。
- PersistentVolumeはそれなりに可用性や性能が求められるであろうデータベースで使う場合が多いと思うので、EKSで使うPersistentVolumeとしてはFSx for ONTAPが一番汎用性が高そう。
- ということで、Amazon EKSでステートフルアプリケーションを構築するときはまずFSx for ONTAPを検討しよう。

# 主な参照元
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-persistent-storage/
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/storage.html
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html
- https://docs.aws.amazon.com/ja_jp/efs/latest/ug/efs-backup-solutions.html
- https://aws.amazon.com/jp/blogs/news/new-replication-for-amazon-elastic-file-system-efs/
- https://aws.amazon.com/jp/efs/features/
- https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.html
- https://aws.amazon.com/jp/fsx/netapp-ontap/features/
- https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/performance.html
- https://calculator.aws/#/
- https://kubernetes-csi.github.io/docs/drivers.html
- https://aws.amazon.com/jp/blogs/news/amazon-efs-csi-dynamic-provisioning/
- https://github.com/kubernetes-sigs/aws-efs-csi-driver