Red Hat OpenShift on IBM Cloud(ROKS)で、デフォルトのストレージ・クラスを変更する

### 背景

OperatorHubなどからオペレーターによってアプリケーションなどをデプロイする場合、作成されるPersistent Volumeが、デフォルトのストレージ・クラスに依存することがあります。このデフォルトのストレージ・クラスを変更するための方法です。

### 確認した環境

+ Red Hat OpenShift on IBM Cloud(ROKS)
    + 4.10
+ Block Storage for VPC アドオン
    + 4.4

Block Storage for VPCアドオンのバージョン確認方法は以下の通りです。

```
$ ibmcloud oc cluster addons --cluster [クラスター名]
OK
名前                   バージョン   正常性の状態   正常性の状況   
vpc-block-csi-driver   4.4          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500) 
```

### 経緯

まず、Red Hat社の提供する以下のドキュメントを参照しました。

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.10/html/storage/change-default-storage-class_dynamic-provisioning

現在の状態を確認すると、10IOPSの一番性能のいいBlock Storageがデフォルトになっていました。

```
$ oc get sc | grep default
ibmc-vpc-block-10iops-tier (default)          vpc.block.csi.ibm.io   Delete          Immediate              true                   13d
```

使用可能なストレージ・クラスを以下のサイトで確認して、値段の安い3IOPSのBlock Storageを使用したいので、`ibmc-vpc-block-general-purpose`をデフォルトにすることにします。

[ストレージ・クラス・リファレンス - IBM Cloud Docs](https://cloud.ibm.com/docs/openshift?topic=openshift-vpc-block#vpc-block-reference)

以下のコマンドを実行することで、デフォルトのストレージ・クラスを変更します。

```
$ oc patch storageclass ibmc-vpc-block-10iops-tier -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "false"}}}'
storageclass.storage.k8s.io/ibmc-vpc-block-10iops-tier patched
$ oc patch storageclass ibmc-vpc-block-general-purpose -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
storageclass.storage.k8s.io/ibmc-vpc-block-general-purpose patched
```

確認すると変更されていました。

```
$ oc get sc | grep default
ibmc-vpc-block-general-purpose (default)      vpc.block.csi.ibm.io   Delete          Immediate              true                   13d
```

ただ、その後アプリケーションを導入しようとすると、以下のようなエラーでPVC・PVが作成されませんでした。

```
Error from server (Forbidden): error when creating "pvc.yaml": persistentvolumeclaims "pvc" is forbidden: Internal error occurred: 2 default StorageClasses were found
```

改めてデフォルトのストレージ・クラスを確認すると、10IOPSのデフォルトが復活？して、デフォルトのストレージ・クラスが2つになってしまっていした。

```
$ oc get sc | grep default
ibmc-vpc-block-10iops-tier (default)          vpc.block.csi.ibm.io   Delete          Immediate              true                   13d
ibmc-vpc-block-general-purpose (default)      vpc.block.csi.ibm.io   Delete          Immediate              true                   13d
```

### 解決策

以下にガイドがありました。Block Storage for VPC アドオンのConfigMapを編集する必要があるとのこと。

[デフォルトのストレージ・クラスの変更 - IBM Cloud Docs](https://cloud.ibm.com/docs/openshift?topic=openshift-vpc-block#vpc-block-default-edit)

ガイドにあるとおり、以下のコマンドでConfigMapを編集モードで開き、「IsStorageClassDefault 設定を false に変更（`IsStorageClassDefault: "false"`）」して、保存します。

```
$ oc edit cm addon-vpc-block-csi-driver-configmap -n kube-system
```

そしてまたガイドにあるとおり、15分ほど待ってから以下のコマンドを実行し、`storageclass.kubernetes.io/is-default-class: "false"`となることを確認します。

```
$ oc get sc ibmc-vpc-block-10iops-tier -o yaml
```

上記の状態が変わった頃には、ストレージ・クラスのデフォルトも、最初にoc patchでtrueに変更した3IOPSの1つになっていました。なので、最初に元のデフォルト・ストレージ・クラスだった`ibmc-vpc-block-10iops-tier`の設定をoc patchでfalseに変更する必要は無かったことになりますね。

これでストレージコストを節約することが出来そうです。