Amazon FSx for NetApp ONTAPをAmazon EKSのPersistentVolumeのバックエンドとして使ってみた（本編）

# はじめに
- [前々回の記事](https://qiita.com/seijitanabe/items/f16af0425d2f2f00af24)でAmazon EKSで使えるPersistentVolumeについて調べて、[前回の記事](https://qiita.com/seijitanabe/items/00e2051b8ee638aea518)で検証するための環境を準備した。
- 今回は、PersistentVolumeのバックエンドとしてAmazon FSx for NetApp ONTAP（以下、FSx for ONTAP）を使ってみる。
- 今できている環境はこんな感じ。
  ![archetecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/c2800e01-9026-cabe-860d-56734ee847e5.png)


# やってみた
## Astra Tridentのインストール
### まずはインストール方法の確認
- FSx for ONTAPをKubernetes側から扱うためのCSI driverはNetAppが提供するAstra Tridentというもの。まずはこれをインストールする必要がある。
- Astra TridentはKubernetesクラスター上にPodとしてデプロイされる。
- [インストール方法](https://docs.netapp.com/ja-jp/trident/trident-get-started/kubernetes-deploy.html)は以下の3通り。今回は3つ目のHelmでインストール。
    1. 手動でtridentctlを用いたイントール
    2. 手動でTrident Operatorを用いたインストール
    3. HelmでTrident Operatorを用いたインストール

### いざ、インストール
- Trident用のNamespaceを作成。
  ```
  $ kubectl create ns trident
  namespace/trident created
  ```
- [GitHub](https://github.com/NetApp/trident)からインストーラをダウンロード（今回はv21.10.1）
  ```
  $ wget https://github.com/NetApp/trident/releases/download/v21.10.1/trident-installer-21.10.1.tar.gz
  --2022-04-08 12:59:20--  https://github.com/NetApp/trident/releases/download/v21.10.1/trident-installer-21.10.1.tar.gz
  Resolving github.com (github.com)... 52.192.72.89
  Connecting to github.com (github.com)|52.192.72.89|:443... connected.
  HTTP request sent, awaiting response... 302 Found
  Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/77179634/4ec45234-8d16-4b89-bbe3-5307e5253b30?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220408%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220408T125920Z&X-Amz-Expires=300&X-Amz-Signature=e92ca56462e8b30bf091c71ff9605828e7aa8a2655df4d4e0c24151942a4e0a4&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=77179634&response-content-disposition=attachment%3B%20filename%3Dtrident-installer-21.10.1.tar.gz&response-content-type=application%2Foctet-stream [following]
  --2022-04-08 12:59:20--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/77179634/4ec45234-8d16-4b89-bbe3-5307e5253b30?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220408%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220408T125920Z&X-Amz-Expires=300&X-Amz-Signature=e92ca56462e8b30bf091c71ff9605828e7aa8a2655df4d4e0c24151942a4e0a4&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=77179634&response-content-disposition=attachment%3B%20filename%3Dtrident-installer-21.10.1.tar.gz&response-content-type=application%2Foctet-stream
  Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
  Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... connected.
  HTTP request sent, awaiting response... 200 OK
  Length: 56666622 (54M) [application/octet-stream]
  Saving to: ‘trident-installer-21.10.1.tar.gz’

  100% [==============================================================================================================================>] 56,666,622  12.1MB/s   in 4.3s
  
  2022-04-08 12:59:25 (12.5 MB/s) - ‘trident-installer-21.10.1.tar.gz’ saved [56666622/56666622]
  ```
  - インストーラを解凍。
  ```
  $ tar xzf trident-installer-21.10.1.tar.gz
  ```
- `tridentctl`のPATHを通す。
  ```
  $ sudo install -m 0755 -o root -g root ./trident-installer/tridentctl /usr/local/bin/
  ```
- Astra Tridentのインストール。
  ```
  $ helm install -n trident trident trident-installer/helm/trident-operator-21.10.1.tgz
  W0408 13:01:55.315542    2776 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
  W0408 13:01:55.428274    2776 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
  NAME: trident
  LAST DEPLOYED: Fri Apr  8 13:01:55 2022
  NAMESPACE: trident
  STATUS: deployed
  REVISION: 1
  TEST SUITE: None
  NOTES:
  Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI storage provisioner for Kubernetes.
  
  Your release is named 'trident' and is installed into the 'trident' namespace.
  Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster.
  
  To configure Trident to manage storage resources, you will need a copy of tridentctl, which is available in pre-packaged Trident releases.  You may find all Trident releases and source code online at https://github.com/NetApp/trident.
  
  To learn more about the release, try:
  
    $ helm status trident
    $ helm get all trident
  ```
- インストール後の確認
  ```
  $ helm list -n trident
  NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
  trident trident         1               2022-04-08 13:01:55.102086329 +0000 UTC deployed        trident-operator-21.10.1        21.10.1
  ```
- デプロイされたリソースの確認。
  ```
  $ kubectl get pod -n trident
  NAME                                READY   STATUS    RESTARTS   AGE
  trident-csi-7bf5df78bd-bpfvx        6/6     Running   0          75s
  trident-csi-z5f8d                   2/2     Running   0          75s
  trident-operator-649cb957df-xtgpr   1/1     Running   0          92s
  ```
- インストール完了。

## バックエンドの設定
### まずは設定内容の確認
- バックエンドの設定はバックエンドコンフィグで行う。
- [Astra Tridentで提供されるドライバは色々ある](https://docs.netapp.com/us-en/trident/trident-use/trident-fsx.html#drivers)が、今回は`ontap-nas`を使う。
- バックエンドの認証方法もID/Password方式と証明書ベースの方式の2パターンがあるが、今回はID/Password方式で認証する。
- IDはデフォルトで作られているSVM管理者ユーザー`vsadmin`、PasswordはFSx for ONTAPの作成時に設定したもの。
- 後、必要なのはストレージの管理用IPアドレス。今回はDNS名で設定。AWSマネジメントコンソールで確認する場合はここ。
  ![fsxn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/35c2843f-4c63-4cf0-fc68-15677ac61d5e.png)

### いざ、バックエンドの設定
- バックエンドコンフィグファイルを作成。
  ```
  $ vi fsx-backend.json
  ```
  ```
  {
    "version": 1,
    "backendName": "fsx_backend",
    "storageDriverName": "ontap-nas",
    "managementLIF": "svm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fsx.ap-northeast-1.amazonaws.com",
    "svm": "st-eks-test-svm1",
    "username": "vsadmin",
    "password": "Netapp1!"
  }
  ```
- `tridentctl`コマンドを使用してバックエンドの設定。
  ```
  $ tridentctl create backend -n trident -f fsx-backend.json
  +-------------+----------------+--------------------------------------+--------+---------+
  |    NAME     | STORAGE DRIVER |                 UUID                 | STATE  | VOLUMES |
  +-------------+----------------+--------------------------------------+--------+---------+
  | fsx_backend | ontap-nas      | 8409e2ca-456d-4a0f-a586-a7bb38eac36b | online |       0 |
  ```
- できた。

## StorageClassの作成
- マニフェストファイルを作成。
  ```
  vi fsx-sc.yaml
  ```
  ```
  apiVersion: v1
  kind: StorageClass
  metadata:
    name: fsx-sc
  parameters:
    backendType: ontap-nas
  provisioner: csi.trident.netapp.io
  ```
- StorageClassを作成。
  ```
  $ kubectl apply -f fsx-sc.yaml
  storageclass.storage.k8s.io/fsx-sc created
  ```
- StorageClassを確認。
  ```
  $ kubectl get sc
  NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
  fsx-sc          csi.trident.netapp.io   Delete          Immediate              false                  2m48s
  gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  40m
  ```
- 元々あった`gp2`がデフォルトになっているので、デフォルトのStorageClassを変更。
  ```
  $ kubectl annotate storageclass gp2 storageclass.kubernetes.io/is-default-class=false --overwrite
  storageclass.storage.k8s.io/gp2 annotated
  ```
  ```
  $ kubectl annotate storageclass fsx-sc storageclass.kubernetes.io/is-default-class=true --overwrite
  storageclass.storage.k8s.io/fsx-sc annotated
  ```
- デフォルトのStorageClassを変更できたか確認。
  ```
  $ kubectl get sc
  NAME               PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
  fsx-sc (default)   csi.trident.netapp.io   Delete          Immediate              false                  9m23s
  gp2                kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  47m
  ```
- これで管理者側の作業は完了。

## PersistentVolume作成
- マニフェストファイルを作成する。
  ```
  $ vi fsx-pvc.yaml
  ```
  ```
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: myvolume
  spec:
    accessModes:
     - ReadWriteMany
    storageClassName: fsx-sc
    resources:
     requests:
      storage: 10Gi
  ```
- PersistentVolumeClaimを作成。
  ```
  $ kubectl apply -f fsx-pvc.yaml
  persistentvolumeclaim/myvolume created
  ```
- PersistentVolumeClaimを確認。
  ```
  $ kubectl get pvc
  NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  myvolume   Bound    pvc-bfbecd75-fa76-463d-86cd-6756475fbc81   10Gi       RWX            fsx-sc         2m6s
  ```
- PersistentVolumeを確認。
  ```
  $ kubectl get pv
  NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
  pvc-bfbecd75-fa76-463d-86cd-6756475fbc81   10Gi       RWX            Delete           Bound    default/myvolume   fsx-sc                  2m10s
  ```
- AWSマネジメントコンソールでFSx for ONTAP目線で確認するとこんな感じ。
  ![fsxn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/82887293-4a8f-bbc0-fa54-365f7c4c2c1a.png)

- できた。

# まとめ
- とりあえずAmazon EKSのPersistentVolumeの一連のシリーズは完結。
- 頑張った。