背景
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社の提供する以下のドキュメントを参照しました。
現在の状態を確認すると、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
以下のコマンドを実行することで、デフォルトのストレージ・クラスを変更します。
$ 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
ガイドにあるとおり、以下のコマンドで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に変更する必要は無かったことになりますね。
これでストレージコストを節約することが出来そうです。