Red Hat OpenShift Service on AWSのPersistentVolumeとしてAmazon FSx for NetApp ONTAPを使ってみた（FSx for ONTAPのデプロイ・マウント編）

# はじめに
- Red Hat社が提供するKubernetesのディストリビューションとして、エンタープライズな領域を中心によく使われている印象（やっぱり保守受けたいですよね、わかります）があるRed Hat OpenShift Container Platform（OCP）。
- そのOCPの、AWSによるマネージドサービスがRed Hat OpenShift Service on AWS（ROSA）。
- その[ROSAとAmazon FSx for NetApp ONTAP（FSx for ONTAP）との統合について紹介されているAWSブログ](https://aws.amazon.com/jp/blogs/news/scaling-container-workloads-with-shared-storage-for-red-hat-openshift-service-on-aws/)を読んで、興味が湧いてきたので自分でも試してみました。ちなみにOpenShift自体は少し触れたことがありますが、ROSA自体に触れるは全くの初めてです。
- [ROSAクラスタのデプロイ編の記事](https://qiita.com/seijitanabe/items/e512dc7271f7cb6d6ca1)でROSAクラスタを作成するところまでは完了したので、今回はFSx for ONTAPのデプロイからPVのマウントまでをやってみます。
:::note info
前回はWindowsでやっていましたが、今回はROSAクラスタがあるVPC上に立てたAmazon Linux上で作業する場合の手順です。2023年2月上旬に実施していますので、今後手順等が変わったらすみません。
:::

# 予め用意しておくもの
- ROSAクラスタ（[前回の記事](https://qiita.com/seijitanabe/items/e512dc7271f7cb6d6ca1)で作成したもの） 

# 早速やってみた
## FSx for ONTAPのデプロイ
- [参考にしたこちらのブログ](https://aws.amazon.com/jp/blogs/news/scaling-container-workloads-with-shared-storage-for-red-hat-openshift-service-on-aws/)ではCloudFormationでデプロイしていますが、今回はあえてGUI（AWSマネジメントコンソール）でやってみました。
- まずはAWSマネジメントコンソールのAmazon FSxの画面から「ファイルシステムを作成」をクリック。
  ![deploy_fsxn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/9bbbf028-06ed-208f-0e3c-aa56759d80cb.png)

- 「ファイルシステムのオプション」は「Amazon FSx for NetApp ONTAP」を選択し、「次へ」をクリック。
  ![deploy_fsxn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/30978aa5-e124-250f-09f8-f08eada1cd37.png)

- 「作成方法」は「スタンダード作成」を選択して、「ファイルシステムの詳細」は適当に以下の通り入力/選択。
  ![deploy_fsxn3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/3370b1a7-c0ee-b8d0-3dcc-664f18c3152b.png)

- 「ネットワークとセキュリティ」は以下の通り選択。
    - VPC：***ROSAクラスタがあるVPC（ROSAデプロイ時に自動作成されたもの）***
    - VPCセキュリティグループ：***ROSAクラスタのMaster Node用、Worker Node用セキュリティグループの両方（ROSAデプロイ時に自動作成されたもの）***
    - サブネット：***ROSAクラスタのWorker Nodeがあるプライベートサブネット（ROSAデプロイ時に自動作成されたもの）***
 
  ![deploy_fsxn4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/9cfda446-2ffb-cbed-f898-13eb1f6a14df.png)
:::note warn
今回、検証なのでセキュリティグループは適当にROSAクラスタのものを使いまわしています。本番利用される場合は、ちゃんとFSx for ONTAP用に最小権限で作成したほうがいいです。
また、[Astra Tridentが通信に使用するポート](https://docs.netapp.com/ja-jp/trident/trident-reference/ports.html)はセキュリティグループのインバウンドルールに追加しておく必要があります。（追加時のスクリーンショット取り忘れてました。。。）
:::

- 「セキュリティと暗号化」は、以下の通り入力/選択。
    - 暗号化キー：***aws/fsx（デフォルト）***
    - ファイルシステム管理パスワード：***「パスワードを指定」を選択***
    - パスワード：***任意のものを入力***

  ![deploy_fsxn4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/2e57b396-77f2-fe8e-d7d2-98eaf79dda85.png)

- 「デフォルトのストレージ仮想マシン設定」は、以下の通り入力/選択。
    - ストレージ仮想マシン名：***svm1（任意の名前でOK）***
    - SVM管理パスワード：***「パスワードを指定」を選択（Astra Tridentでストレージバックエンドの設定をするのに必要）***
    - ルートボリュームのセキュリティスタイル：***Unix (Linux)***
    - Active Directory：***Active Directoryに参加しない***

  ![deploy_fsxn5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/f6eba747-4287-7579-bf6b-723688e709f0.png)

- 「デフォルトのボリューム設定」、「バックアップとメンテナンス - オプション」、「タグ」は、以下の通り入力/選択し、「次へ」をクリック。（今回の検証なら適当でOK）
  ![deploy_fsxn6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/b7e52e58-9e3e-4f19-9c63-7b71f6035804.png)

- 確認画面で設定内容を確認して「ファイルシステムを作成」をクリック。
  ![deploy_fsxn8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/57fd069c-0988-a625-94fa-f1812514acf2.png)

- しばらく待っているとできました。
  ![deploy_fsxn9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/aa6db9dd-9eb9-0485-fef0-97da32132d89.png)

## Astra Trident（CSIドライバ）の設定
:::note info
**Astra Tridentとは**
- NetAppストレージ用のCSIドライバ。
- Astra Tridentを介してKubernetesのレイヤーからNetAppストレージへPersistentVolumeの要求やSnapshotなどの操作を実施可能。
- ハードウェアストレージであってもFSx for ONTAPのようなクラウド上のストレージサービスであっても同じドライバを利用可能。
- 勿論、Red Hat OpenShift（ROSA含む）でも利用可能。
:::
- ここからは、ROSAクラスタとFSx for ONTAPがあるVPC内に立てたAmazon Linux（AWS CLI、OC CLI、ROSA CLI、Helmがインストール済）から操作していきます。

### Astra Tridentのインストール
- 以下コマンドにて、ROSAクラスタにログイン。（実際のログイン先、認証情報は[前回の記事](https://qiita.com/seijitanabe/items/e512dc7271f7cb6d6ca1#rosa%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%A8%AD%E5%AE%9A)参照）
  ```
  $ oc login https://api.st-rosa-test.XXXX.XX.openshiftapps.com:6443 --username cluster-admin --password XXXXXXXXXXXXXXXXXXXXXXX
  Login successful.
  
  You have access to 101 projects, the list has been suppressed. You can list all projects with 'oc projects'
  
  Using project "default".
  Welcome! See 'oc help' to get started.
  ```
- 以下コマンドにて、Astra Trident用のNamespace`trident`を作成。
  ```
  $ oc create ns trident
  namespace/trident created
  ```
- 以下コマンドにて、Astra Trident（今回はv22.10.0）のインストーラをダウンロード。
  ```
  $ curl -L -o trident-installer-22.10.0.tar.gz https://github.com/NetApp/trident/releases/download/v22.10.0/trident-installer-22.10.0.tar.gz
  ```
- 以下コマンドにて、インストーラの圧縮ファイルを解凍。
  ```
  $ tar -xvf ./trident-installer-22.10.0.tar.gz 
  ```
- 以下コマンドにて、Helmを使ってAstra Tridentをインストール。
  ```
  $ cd trident-installer/helm
  $ helm install trident -n trident trident-operator-22.10.0.tgzz 
  W0206 13:31:09.800783    3835 warnings.go:70] would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "trident-operator" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "trident-operator" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "trident-operator" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "trident-operator" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
  NAME: trident
  LAST DEPLOYED: Mon Feb  6 13:31:06 2023
  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
  ```

### Astra Tridentのインストール
- 以下コマンドにて、ROSAクラスタにログイン。（実際のログイン先、認証情報は[前回の記事](https://qiita.com/seijitanabe/items/e512dc7271f7cb6d6ca1#rosa%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%A8%AD%E5%AE%9A)参照）
  ```
  $ oc login https://api.st-rosa-test.XXXX.XX.openshiftapps.com:6443 --username cluster-admin --password XXXXXXXXXXXXXXXXXXXXXXX
  Login successful.
  
  You have access to 101 projects, the list has been suppressed. You can list all projects with 'oc projects'
  
  Using project "default".
  Welcome! See 'oc help' to get started.
  ```
- 以下コマンドにて、Astra Trident用のNamespace`trident`を作成。
  ```
  $ oc create ns trident
  namespace/trident created
  ```
- 以下コマンドにて、Astra Trident（今回はv22.10.0）のインストーラをダウンロード。
  ```
  $ curl -L -o trident-installer-22.10.0.tar.gz 
  ```
- 以下コマンドにて、圧縮ファイルのインストーラを解凍。
  ```
  $ tar -xvf ./trident-installer-22.10.0.tar.gz 
  ```
- 以下コマンドにて、Helmを使ってAstra Tridentをインストール。
  ```
  $ cd trident-installer/helm
  $ helm install trident -n trident trident-operator-22.10.0.tgzz 
  W0206 13:31:09.800783    3835 warnings.go:70] would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "trident-operator" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "trident-operator" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "trident-operator" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "trident-operator" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
  NAME: trident
  LAST DEPLOYED: Mon Feb  6 13:31:06 2023
  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
  ```

### FSx for ONTAPをバックエンドとして設定
- 以下コマンドにて、適当な作業ディレクトリ（今回はホームディレクトリ）に移動。
  ```
  $ cd ~/
  ```
- 以下コマンドにて、SVMのシークレット用のyamlファイルを作成し、保存。
  ```
  $ vi svm_secret.yaml
  ```
  ```svm_secret.yaml
  apiVersion: v1
  kind: Secret
  metadata:
    name: backend-fsx-ontap-nas-secret
    namespace: trident
  type: Opaque
  stringData:
    username: vsadmin
    password: <FSx for ONTAPデプロイ時に設定したSVM管理パスワード>
  ```
- 以下コマンドにて、シークレットを追加。
  ```
  $ oc apply -f svm_secret.yaml
  secret/backend-fsx-ontap-nas-secret created
  ```
- 以下コマンドにて、シークレットが追加されたことを確認。
  ```
  $ oc get secrets -n trident |grep backend-fsx-ontap-nas
  backend-fsx-ontap-nas-secret         Opaque                                2      8s
  ```
- AWSマネジメントコンソールのFSx for ONTAPの画面からストレージ仮想マシン（SVM）のエンドポイントを確認。
  ![deploy_fsxn10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/3f85e31b-b16c-771f-cad7-52592efda8ec.png)

- 以下コマンドにて、バックエンド設定用のyamlファイルを作成し、保存。ここでSVMへの接続のために先ほど作成したシークレットが登場します。
  ```
  $ vi backend-ontap-nas.yaml
  ```
  ```backend-ontap-nas.yaml
  apiVersion: trident.netapp.io/v1
  kind: TridentBackendConfig
  metadata:
    name: backend-fsx-ontap-nas
    namespace: trident
  spec:
    version: 1
    backendName: fsx-ontap
    storageDriverName: ontap-nas
    managementLIF: 10.0.225.117　<- 上記で確認した「管理IPアドレス」 
    dataLIF: 10.0.225.117　<- 上記で確認した「NFS IPアドレス」 
    svm: svm1 <- 作成したストレージ仮想マシン名
    credentials:
      name: backend-fsx-ontap-nas-secret
  ```
  :::note info
  ちょっと前まではバックエンドの設定はjsonファイルで定義して`tridentctl`コマンドを使用して設定するものだったんですが、v21.04からは`TridentBackendConfig`オブジェクトが導入されたので、`kubectl apply`や`oc apply`コマンドで設定できるようになりました。
  :::

- 以下コマンドにて、FSx for ONTAPをバックエンドとして構成。
  ```
  $ oc apply -f backend-ontap-nas.yaml
  tridentbackendconfig.trident.netapp.io/backend-fsx-ontap-nas created
  ```
- 以下コマンドにて、バックエンドが構成されていることを確認。（`tbc`は`TridentBackendConfig`）
  ```
  $ oc get tbc -n trident
  NAME                    BACKEND NAME   BACKEND UUID                           PHASE   STATUS
  backend-fsx-ontap-nas   fsx-ontap      3051def7-bb11-4fea-aa37-9f3f018865f8   Bound   Success
  ```

### ストレージクラスの作成
- 以下のコマンドにて、ストレージクラス設定用のyamlファイルを作成し、保存。
  ```
  $ vi storage-class-csi-nas.yaml
  ```
  ```storage-class-csi-nas.yaml
  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: trident-csi
  provisioner: csi.trident.netapp.io
  parameters:
    backendType: "ontap-nas"
    fsType: "ext4"
  allowVolumeExpansion: True
  reclaimPolicy: Retain
  ```
- 以下コマンドにて、ストレージクラスを作成。
  ```
  $ oc apply -f storage-class-csi-nas.yaml
  storageclass.storage.k8s.io/trident-csi created
  ```
- 以下コマンドにて、ストレージクラスが作成されていることを確認。
  ```
  $ oc get sc
  NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
  gp2             kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   82m
  gp2-csi         ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   77m
  gp3 (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   82m
  gp3-csi         ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   77m
  trident-csi     csi.trident.netapp.io   Retain          Immediate              true                   5s
  ```

### PersistentVolumeを作成（サンプルのMySQLのStatefulSetをデプロイ）
- 以下コマンドにて、MySQL用のNamespace`mysql`を作成。
  ```
  $ oc create ns mysql
  namespace/mysql created
  ```
- 以下コマンドにて、MySQLのシークレット用のyamlファイルを作成し、保存。
  ```
  $ vi mysql-secrets.yaml
  ```
  ```mysql-secrets.yaml
  apiVersion: v1
  kind: Secret
  metadata:
    namespace: mysql
    name: mysql-password
  type: opaque
  stringData:
    MYSQL_ROOT_PASSWORD: password
  ```
- 以下コマンドにて、MySQL用のシークレットを追加。
  ```
  $ oc apply -f mysql-secrets.yaml
  secret/mysql-password created
  ```
- 以下コマンドにて、シークレットが追加されたことを確認。
  ```
  $ oc get secrets -n mysql
  NAME                       TYPE                                  DATA   AGE
  builder-dockercfg-vssdp    kubernetes.io/dockercfg               1      13s
  builder-token-5kj4x        kubernetes.io/service-account-token   4      14s
  default-dockercfg-dsggs    kubernetes.io/dockercfg               1      13s
  default-token-s775h        kubernetes.io/service-account-token   4      14s
  deployer-dockercfg-5bjv5   kubernetes.io/dockercfg               1      13s
  deployer-token-jcd5h       kubernetes.io/service-account-token   4      13s
  mysql-password             opaque                                1      6s
  ```
- 以下コマンドにて、MySQLのStatefulSet用のyamlファイルを作成し、保存。
  ```
  $ vi mysql-statefulset.yaml
  ```
  ```mysql-statefulset.yaml
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    namespace: mysql
    name: mysql-set
  spec:
    selector:
      matchLabels:
        app: mysql
    serviceName: "mysql"
    replicas: 3
    template:
      metadata:
        labels:
          app: mysql
      spec:
        terminationGracePeriodSeconds: 10
        containers:
        - name: mysql
          image: mysql:5.7
          ports:
          - containerPort: 3306
          volumeMounts:
          - name: mysql-store
            mountPath: /var/lib/mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-password
                  key: MYSQL_ROOT_PASSWORD
    volumeClaimTemplates:
    - metadata:
        name: mysql-store
      spec:
        accessModes: ["ReadWriteMany"]
        storageClassName: trident-csi
        resources:
          requests:
            storage: 10Gi
  ```
- 以下コマンドにて、StatefulSetを作成。
  ```
  $ oc apply -f mysql-statefulset.yaml
  Warning: would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "mysql" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "mysql" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "mysql" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "mysql" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
  statefulset.apps/mysql-set created
  ```
- 以下コマンドにて、MySQLのPodが作成されていることを確認。
  ```
  $ oc get pods -n mysql
  NAME          READY   STATUS    RESTARTS   AGE
  mysql-set-0   1/1     Running   0          58s
  mysql-set-1   1/1     Running   0          36s
  mysql-set-2   1/1     Running   0          16s
  ```
- 以下コマンドにて、PVCが作成されていることを確認。
  ```
  $ oc get pvc -n mysql
  NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  mysql-store-mysql-set-0   Bound    pvc-db5d8d26-192c-454c-ba95-52a4dacf2935   10Gi       RWX            trident-csi    68s
  mysql-store-mysql-set-1   Bound    pvc-a9015077-e97c-4054-9a6b-19ec12c157a5   10Gi       RWX            trident-csi    46s
  mysql-store-mysql-set-2   Bound    pvc-9102b0af-85f7-48bb-a531-30a71d54cb27   10Gi       RWX            trident-csi    26s
  ```
- 以下コマンドにて、MySQLのサービス用のyamlファイルを作成し、保存。
  ```
  $ vi mysql-service.yaml
  ```
  ```mysql-service.yaml
  apiVersion: v1
  kind: Service
  metadata:
    namespace: mysql
    name: mysql
    labels:
      app: mysql
  spec:
    ports:
    - name: mysql
      port: 3306
    clusterIP: None
    selector:
      app: mysql
  ```
- 以下コマンドにて、MySQLのサービスを作成。
  ```
  $ oc apply -f mysql-service.yaml
  service/mysql created
  ```
- 以下コマンドにて、MySQLのサービスが作成されていることを確認。
  ```
  $ oc get svc -n mysql
  NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
  mysql   ClusterIP   None         <none>        3306/TCP   6s
  ```
- 以下コマンドにて、MySQL ClientのPod用のyamlファイルを作成し、保存。
  ```
  $ vi mysql-client.yaml
  ```
  ```mysql-client.yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: mysql-client
  spec:
    containers:
    - name: mysql-container
      image: alpine
      command: ['sh','-c', "sleep 1800m"]
      imagePullPolicy: IfNotPresent
  ```
- 以下コマンドにて、MySQL Client用のPodを作成。
  ```
  $ oc apply -f mysql-client.yaml
  Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "mysql-container" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "mysql-container" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "mysql-container" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "mysql-container" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
  pod/mysql-client created
  ```
- 以下コマンドにて、MySQL ClientのPodが作成されたことを確認。
  ```
  $ oc get pods
  NAME           READY   STATUS    RESTARTS   AGE
  mysql-client   1/1     Running   0          19s
  ```
- 以下コマンドにて、MySQL ClientのPodにログイン。
  ```
  $ oc exec --stdin --tty mysql-client -- sh
  / #
  ```
- 以下コマンドにて、MySQL Clientツールをインストール
  ```
  / # apk add mysql-client
  fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
  fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
  (1/7) Installing mariadb-common (10.6.11-r0)
    0%                                                                                                                                                         0% #                                                                                                                                                       1% #                                                                                                                                                       1% ##                                                                                                                                                      2% ###                                                                                                                                                     2% ####                                                                                                                                                    3% ####                                                                                                                                                    3% #####                                                                                                                                                   4% ######                                                                                                                                                  4% #######                                                                                                                                                 5% #######                                                                                                                                                 5% ########                                                                                                                                              (2/7) Installing libgcc (12.2.1_git20220924-r4)
    6% #########                                                                                                                                             (3/7) Installing ncurses-terminfo-base (6.3_p20221119-r0)
    6% ##########                                                                                                                                              7% ##########                                                                                                                                            (4/7) Installing ncurses-libs (6.3_p20221119-r0)
    7% ###########                                                                                                                                             8% #############                                                                                                                                         (5/7) Installing libstdc++ (12.2.1_git20220924-r4)
    8% #############                                                                                                                                          14% ######################                                                                                                                                (6/7) Installing mariadb-client (10.6.11-r0)
   15% #######################                                                                                                                                21% ################################                                                                                                                       27% ########################################                                                                                                               27% #########################################                                                                                                              33% ##################################################                                                                                                     38% #########################################################                                                                                              43% #################################################################                                                                                      48% ########################################################################                                                                               54% #################################################################################                                                                      59% ########################################################################################                                                               65% #################################################################################################                                                      69% ########################################################################################################                                               75% #################################################################################################################                                      79% #######################################################################################################################                                85% ################################################################################################################################                       89% ######################################################################################################################################                 95% ###############################################################################################################################################       (7/7) Installing mysql-client (10.6.11-r0)
   99% ##################################################################################################################################################### 100% ######################################################################################################################################################Executing busybox-1.35.0-r29.trigger
  OK: 41 MiB in 22 packages
  ```
- 以下のコマンドにて、MySQLに接続。（`mysql-secrets.yaml`に記載したパスワードを入力）
  ``` 
  / # mysql -u root -p -h mysql-set-0.mysql.mysql.svc.cluster.local
  Enter password: 
  Welcome to the MariaDB monitor.  Commands end with ; or \g.
  Your MySQL connection id is 3
  Server version: 5.7.41 MySQL Community Server (GPL)
  
  Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
  
  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  
  MySQL [(none)]> 
  ```
- 以下コマンドにて、データベースを作成
  ```
  MySQL [(none)]> CREATE DATABASE erp;
  Query OK, 1 row affected (0.004 sec)
  
  MySQL [(none)]> CREATE TABLE erp.Persons ( ID int, FirstName varchar(255),Lastname varchar(255));
  Query OK, 0 rows affected (0.011 sec)
  
  MySQL [(none)]> INSERT INTO erp.Persons (ID, FirstName, LastName) values (1234 , "John" , "Doe");
  Query OK, 1 row affected (0.007 sec)
  
  MySQL [(none)]> commit;
  Query OK, 0 rows affected (0.000 sec)
  
  MySQL [(none)]> select * from erp.Persons;
  +------+-----------+----------+
  | ID   | FirstName | Lastname |
  +------+-----------+----------+
  | 1234 | John      | Doe      |
  +------+-----------+----------+
  1 row in set (0.000 sec)
  ```
### MySQLのStatefulSetのPodをスケール
- 以下コマンドにて、MySQLのStatefulSetのPodをスケール。
  ```
  $ oc scale statefulsets mysql-set --replicas=4 -n mysql
  statefulset.apps/mysql-set scaled
  ```
- 以下コマンドにて、MySQLのPodが4つに増えていることを確認。
  ```
  $ oc get pods -n mysql
  NAME          READY   STATUS    RESTARTS   AGE
  mysql-set-0   1/1     Running   0          6m38s
  mysql-set-1   1/1     Running   0          6m16s
  mysql-set-2   1/1     Running   0          5m56s
  mysql-set-3   1/1     Running   0          18s
  ```
- AWSマネジメントコンソールからボリュームを確認すると、Astra Tridentを介して作成されたボリューム（`trident_pvc`で始まるボリューム）が4つあることを確認。
  ![deploy_fsxn11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523630/affa86e6-e1b7-c8f1-4c25-f7c3baa73a77.png)

- [参考にしたこちらのブログ](https://aws.amazon.com/jp/blogs/news/scaling-container-workloads-with-shared-storage-for-red-hat-openshift-service-on-aws/)ではこの後バックアップとリストアも実行していますが、今回は割愛しました。
- ということで、今回は以上で完了です。

# まとめ
- ROSAでもAstra Tridentを介してFSx for ONTAPをPersitentVolumeとして利用できることを確認できました。
- ROSAはAWS側で一度有効化などをしておけばAWSのインフラの準備をする必要なく、コマンド一発でOpenShiftのクラスタを作成できるのが良いと思いました。
- オンプレミスでOpenShiftを利用しており、PersistentVolumeのバックエンドとしてNetAppのONTAPが搭載されたストレージを使用している場合、PVのボリュームをオンプレミスのストレージからFSx for ONTAPにレプリケーションしておけば、アプリケーションなどはyamlのマニフェストファイルさえあれば立ち上げられるので、簡単にクラウドDRを実現できると思いました。
- また機会があればいろいろ触ってみたいと思います。
  
# 参照記事
- https://aws.amazon.com/jp/blogs/news/scaling-container-workloads-with-shared-storage-for-red-hat-openshift-service-on-aws/
- https://docs.openshift.com/rosa/rosa_getting_started/rosa-quickstart-guide-ui.html
- https://www.rosaworkshop.io/
- https://aws.amazon.com/jp/blogs/news/whats-new-red-hat-openshift-service-on-aws/