目的
Red Hat OpenShift on IBM Cloud(ROKS)では、最近OpenShift Data Foundation(ODF)が利用可能になりました。かつてOpenShift Container Storage(OCS)と呼ばれていたものです。早速検証してみます。
ODFの概要はこちらです。ODFはROKSクラスターを使ってFile Storage、Block Storage、Object Storageの分散ストレージを構築することができます。特にIBM Cloudでは現在AZをまたいで冗長化されたストレージはIBM Cloud Object Storageだけですので、Block StorageやFile StorageをMZR対応で使用できる点は非常にうれしいです。
https://cloud.ibm.com/docs/openshift?topic=openshift-ocs-storage-prep#ocs-vpc-plan
環境
ROKSとODFはVPC、Classic、Satelliteそれぞれに対応していますが、今回はVPCを利用します。クラスターには下記の要件があります。
- バージョン4.7.0以上
- ワーカーノードは最低3台(マルチゾーン推奨)
- ワーカーノードは最低16core/64GB
インストール手順
基本的にはIBM Cloudのガイドに従い実施します。
https://cloud.ibm.com/docs/openshift?topic=openshift-deploy-odf-vpc
ODFアドオンのインストール
ODFを使用するために、アドオンをインストールします。
$ ibmcloud oc cluster addon ls -c roks-odf-tok
OK
名前 バージョン 正常性の状態 正常性の状況
vpc-block-csi-driver 4.0 normal Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
$ ibmcloud oc cluster addon versions
OK
名前 バージョン サポートされる Kubernetes 範囲 サポートされる OpenShift 範囲
openshift-data-foundation 4.7.0 (default) サポート対象外 >=4.7.0
$ ibmcloud oc cluster addon enable openshift-data-foundation -c roks-odf-tok --version 4.7.0 -param "odfDeploy=true"
クラスター roks-odf-tok のアドオン openshift-data-foundation(4.7.0) を有効にしています...
アドオンのデプロイが完了して利用可能になるには数分かかる場合があります。
インストール・オプションを使用します...
アドオン・オプション
オプション 値
monSize 20Gi
monStorageClassName ibmc-vpc-block-metro-10iops-tier
ocsUpgrade false
osdSize 250Gi
workerNodes all
billingType advanced
clusterEncryption false
monDevicePaths <Please provide IDs of the disks to be used for mon pods if using local disks or standard classic cluster>
numOfOsd 1
odfDeploy true
osdDevicePaths <Please provide IDs of the disks to be used for OSD pods if using local disks or standard classic cluster>
osdStorageClassName ibmc-vpc-block-metro-10iops-tier
OK
openshift-storageネームスペースで関連Podが起動します。全て起動するのに10分ほどかかります。
$ oc get pods -n openshift-storage
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-4wdkp 3/3 Running 0 9m49s
csi-cephfsplugin-9zkrd 3/3 Running 0 9m49s
csi-cephfsplugin-provisioner-5dff49c778-j54df 6/6 Running 0 9m48s
csi-cephfsplugin-provisioner-5dff49c778-p8vcm 6/6 Running 0 9m48s
csi-cephfsplugin-xgcqr 3/3 Running 0 9m49s
csi-rbdplugin-f6d2b 3/3 Running 0 9m49s
csi-rbdplugin-kbbbc 3/3 Running 0 9m49s
csi-rbdplugin-provisioner-8558dfcf7-pvb7h 6/6 Running 0 9m49s
csi-rbdplugin-provisioner-8558dfcf7-svd76 6/6 Running 0 9m49s
csi-rbdplugin-vcskr 3/3 Running 0 9m49s
noobaa-core-0 1/1 Running 0 3m24s
noobaa-db-pg-0 1/1 Running 0 3m25s
noobaa-default-backing-store-noobaa-pod-92d8b93a 1/1 Running 0 71s
noobaa-endpoint-85b8c46788-p42tm 1/1 Running 0 74s
noobaa-operator-77b849b4d-5bsm9 1/1 Running 0 11m
ocs-metrics-exporter-5b47f5bc47-vgg98 1/1 Running 0 11m
ocs-operator-5ccdc58dc9-9bclt 1/1 Running 0 11m
rook-ceph-crashcollector-10.244.130.28-59bd5d6c7b-x47fs 1/1 Running 0 6m27s
rook-ceph-crashcollector-10.244.2.36-5f865c9fdf-gldht 1/1 Running 0 7m41s
rook-ceph-crashcollector-10.244.66.34-74f88c45bc-sjs8m 1/1 Running 0 8m43s
rook-ceph-mds-ocs-storagecluster-cephfilesystem-a-d94fd78b4h98l 2/2 Running 0 3m4s
rook-ceph-mds-ocs-storagecluster-cephfilesystem-b-6cc76f587655s 2/2 Running 0 3m3s
rook-ceph-mgr-a-85896d76d7-5qwnb 2/2 Running 0 5m20s
rook-ceph-mon-a-6f566d444d-g8z49 2/2 Running 0 8m50s
rook-ceph-mon-b-57487f8c94-n4stw 2/2 Running 0 7m41s
rook-ceph-mon-c-588cbfc47d-pcfgd 2/2 Running 0 6m27s
rook-ceph-operator-867c5f899c-9j8cc 1/1 Running 0 11m
rook-ceph-osd-0-56fb5f8c8-6vngn 2/2 Running 0 3m46s
rook-ceph-osd-1-d9769969f-m47nx 2/2 Running 0 3m27s
rook-ceph-osd-2-75dfc7cdb5-kfm6c 2/2 Running 0 3m26s
rook-ceph-osd-prepare-ocs-deviceset-0-data-06rdvz-xb5xq 0/1 Completed 0 5m18s
rook-ceph-osd-prepare-ocs-deviceset-1-data-0s5nds-rdmfx 0/1 Completed 0 5m18s
rook-ceph-osd-prepare-ocs-deviceset-2-data-08jzsb-lxhzq 0/1 Completed 0 5m17s
rook-ceph-rgw-ocs-storagecluster-cephobjectstore-a-694df78jv2kb 2/2 Running 0 2m33s
初期状態でPVもこれだけ使われています。StorageClassがibmc-vpc-block-metro-10iops-tier
はストレージの利用料がかかっていますのでご注意ください。
$ oc get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-34ecb27e-5e3f-4727-bae7-e7d6011445fe 20Gi RWO Delete Bound openshift-storage/rook-ceph-mon-a ibmc-vpc-block-metro-10iops-tier 9m43s
pvc-5be64bf0-e649-4c50-b91f-5c4563196a0a 50Gi RWO Delete Bound openshift-storage/noobaa-default-backing-store-noobaa-pvc-92d8b93a ocs-storagecluster-ceph-rbd 119s
pvc-74ac71ab-3b2b-49f9-a5c0-f9205d4689d0 250Gi RWO Delete Bound openshift-storage/ocs-deviceset-2-data-08jzsb ibmc-vpc-block-metro-10iops-tier 5m47s
pvc-92d0689c-8c47-41c4-9c3f-f5f1131c2b12 50Gi RWO Delete Bound openshift-storage/db-noobaa-db-pg-0 ocs-storagecluster-ceph-rbd 3m57s
pvc-a7e4d6ac-b8c3-49c9-811e-735d3203aaa6 20Gi RWO Delete Bound openshift-storage/rook-ceph-mon-c ibmc-vpc-block-metro-10iops-tier 9m42s
pvc-c064f1db-8a49-454d-abd0-71edbdbe7741 20Gi RWO Delete Bound openshift-storage/rook-ceph-mon-b ibmc-vpc-block-metro-10iops-tier 9m41s
pvc-dea19321-b9cc-48ed-8b06-a93316433089 250Gi RWO Delete Bound openshift-storage/ocs-deviceset-1-data-0s5nds ibmc-vpc-block-metro-10iops-tier 5m47s
pvc-fe1424d0-2d38-4a1b-89da-13ca9c1cecb7 250Gi RWO Delete Bound openshift-storage/ocs-deviceset-0-data-06rdvz ibmc-vpc-block-metro-10iops-tier 5m47s
プラグインがReadyになったことを確認します。
$ ibmcloud oc cluster addon ls -c roks-odf-tok
OK
名前 バージョン 正常性の状態 正常性の状況
openshift-data-foundation 4.7.0 normal Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-block-csi-driver 4.0 normal Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
StorageClassの確認
ODFによって追加されたStorageClassを確認します。
$ oc get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
...
ocs-storagecluster-ceph-rbd openshift-storage.rbd.csi.ceph.com Delete Immediate true 16m
ocs-storagecluster-ceph-rgw openshift-storage.ceph.rook.io/bucket Delete Immediate false 16m
ocs-storagecluster-cephfs openshift-storage.cephfs.csi.ceph.com Delete Immediate true 16m
openshift-storage.noobaa.io openshift-storage.noobaa.io/obc Delete Immediate false 55m
それぞれの用途と特徴はガイドを参照してください。
https://cloud.ibm.com/docs/openshift?topic=openshift-ocs-sc-ref
簡単に言うと、次のような使い分けになります。
StorageClass | 種別 |
---|---|
ocs-storagecluster-ceph-rbd | Block Storage |
ocs-storagecluster-ceph-rgw | Object Storage |
ocs-storagecluster-cephfs | File Storage |
openshift-storage.noobaa.io | Obeject Storage |
File Storage,Block Storageの動作確認
PersistentVolumeClaimの作成
テストのために、それぞれPersistentVolumeClaimを作成します。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-file-rwx
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: ocs-storagecluster-cephfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-block-rwo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ocs-storagecluster-ceph-rbd
$ oc create -f pvc.yaml -n qiita
persistentvolumeclaim/ceph-file-rwx created
persistentvolumeclaim/ceph-block-rwo created
$ oc get pvc -n qiita
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-block-rwo Bound pvc-7e26952a-77a5-4e6e-b3be-57200ca8ae0f 10Gi RWO ocs-storagecluster-ceph-rbd 19m
ceph-file-rwx Bound pvc-edd56197-8d75-423b-bfe4-62ee448de587 10Gi RWX ocs-storagecluster-cephfs 21m
$ oc get pv | grep ceph-[fb]
pvc-7e26952a-77a5-4e6e-b3be-57200ca8ae0f 10Gi RWO Delete Bound qiita/ceph-block-rwo ocs-storagecluster-ceph-rbd 52m
pvc-edd56197-8d75-423b-bfe4-62ee448de587 10Gi RWX Delete Bound qiita/ceph-file-rwx ocs-storagecluster-cephfs 55m
テスト用Podにマウント
apiVersion: v1
kind: Pod
metadata:
name: centos8
labels:
app: centos8
spec:
containers:
- name: centos8
image: docker.io/centos:8
command:
- tail
- -f
- /dev/null
volumeMounts:
- name: ceph-file-rwx
mountPath: /mnt/ceph-file-rwx
- name: ceph-block-rwo
mountPath: /mnt/ceph-block-rwo
volumes:
- name: ceph-file-rwx
persistentVolumeClaim:
claimName: ceph-file-rwx
- name: ceph-block-rwo
persistentVolumeClaim:
claimName: ceph-block-rwo
$ oc create -f pod.yaml
pod/centos8 created
Pod内にボリュームがマウントされていることを確認します。
$ oc rsh centos8 mount | grep mnt
172.21.50.241:6789,172.21.231.40:6789,172.21.158.201:6789:/volumes/csi/csi-vol-8877ecf1-2841-11ec-98c8-660b6002e72d/0550d117-2d8a-4ef6-84e3-e6d935618864 on /mnt/ceph-file-rwx type ceph (rw,relatime,name=csi-cephfs-node,secret=<hidden>,acl,mds_namespace=ocs-storagecluster-cephfilesystem,wsize=16777216)
/dev/rbd0 on /mnt/ceph-block-rwo type ext4 (rw,relatime,seclabel,stripe=1024,data=ordered)
書き込みの確認
それぞれにテストデータを書き込みます。
$ oc rsh centos8 dd if=/dev/zero of=/mnt/ceph-file-rwx/1G.dat bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.30741 s, 821 MB/s
$ oc rsh centos8 dd if=/dev/zero of=/mnt/ceph-block-rwo/1G.dat bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.54528 s, 695 MB/s
$ oc rsh centos8 find /mnt/ -ls
3539694 8 drwxr-xr-x 1 root root 4096 Oct 8 16:38 /mnt/
2 4 drwxrwxrwx 3 root root 4096 Oct 8 16:40 /mnt/ceph-block-rwo
11 16 drwx------ 2 root root 16384 Oct 8 16:38 /mnt/ceph-block-rwo/lost+found
12 1048580 -rw-r--r-- 1 root root 1073741824 Oct 8 16:40 /mnt/ceph-block-rwo/1G.dat
1099511627779 0 drwxrwxrwx 1 root root 1 Oct 8 16:40 /mnt/ceph-file-rwx
1099511627782 1048576 -rw-r--r-- 1 root root 1073741824 Oct 8 16:40 /mnt/ceph-file-rwx/1G.dat
永続化の確認
Podを再作成します。
$ oc delete -f pod.yaml ; oc create -f pod.yaml
pod "centos8" deleted
pod/centos8 created
先ほど作成したファイルが永続化されていることを確認します。
$ oc rsh centos8 find /mnt/ -ls
3539694 8 drwxr-xr-x 1 root root 4096 Oct 8 16:42 /mnt/
2 4 drwxrwxrwx 3 root root 4096 Oct 8 16:40 /mnt/ceph-block-rwo
11 16 drwx------ 2 root root 16384 Oct 8 16:38 /mnt/ceph-block-rwo/lost+found
12 1048580 -rw-r--r-- 1 root root 1073741824 Oct 8 16:40 /mnt/ceph-block-rwo/1G.dat
1099511627779 0 drwxrwxrwx 1 root root 1 Oct 8 16:40 /mnt/ceph-file-rwx
1099511627782 1048576 -rw-r--r-- 1 root root 1073741824 Oct 8 16:40 /mnt/ceph-file-rwx/1G.dat
Object Storageの動作確認
Object StorageはStorageClassによってCeph RGWとNooBaaの2種類があります。
ObjectBucketClaimの作成
テストのために、それぞれObjectBucketClaimを作成します。
---
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
name: ceph-object-bucket
spec:
bucketName: ceph-object-bucket
storageClassName: ocs-storagecluster-ceph-rgw
---
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
name: noobaa-object-bucket
spec:
bucketName: noobaa-object-bucket
storageClassName: openshift-storage.noobaa.io
$ oc create -f obc.yaml -n qiita
objectbucketclaim.objectbucket.io/ceph-object-bucket created
objectbucketclaim.objectbucket.io/noobaa-object-bucket created
$ oc get obc -n qiita
NAME STORAGE-CLASS PHASE AGE
ceph-object-bucket ocs-storagecluster-ceph-rgw Bound 20s
noobaa-object-bucket openshift-storage.noobaa.io Bound 20s
$ oc get obs
NAME STORAGE-CLASS CLAIM-NAMESPACE CLAIM-NAME RECLAIM-POLICY PHASE AGE
obc-qiita-ceph-object-bucket ocs-storagecluster-ceph-rgw Delete Bound 2m4s
obc-qiita-noobaa-object-bucket openshift-storage.noobaa.io Delete Bound 2m5s
アクセスキーの確認
バケットにアクセスするためのアクセスキーIDとシークレットを確認します。Ceph RGWとNooBaaそれぞれ異なります。
$ oc get secret -n qiita | grep bucket
ceph-object-bucket Opaque 2 3h9m
noobaa-object-bucket Opaque 2 3h9m
# Ceph RGW
$ oc get secret ceph-object-bucket -n qiita -o yaml | head
apiVersion: v1
data:
AWS_ACCESS_KEY_ID: ********
AWS_SECRET_ACCESS_KEY: ********
kind: Secret
metadata:
creationTimestamp: "2021-10-08T18:31:18Z"
finalizers:
- objectbucket.io/finalizer
labels:
$ echo -n "${AWS_ACCESS_KEY_ID}" | base64 -d
$ echo -n "${AWS_SECRET_ACCESS_KEY}" | base64 -d
# NooBaa
$ oc get secret noobaa-object-bucket -n qiita -o yaml | head
apiVersion: v1
data:
AWS_ACCESS_KEY_ID: ********
AWS_SECRET_ACCESS_KEY: ********
kind: Secret
metadata:
creationTimestamp: "2021-10-08T18:31:17Z"
finalizers:
- objectbucket.io/finalizer
labels:
$ echo -n "${AWS_ACCESS_KEY_ID}" | base64 -d
$ echo -n "${AWS_SECRET_ACCESS_KEY}" | base64 -d
S3エンドポイントURLの確認
Ceph RGWとBooBaaそれぞれの経路を確認します。これがS3サービスのエンドポイントURLになります。
$ oc get route -n openshift-storage
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
...
ocs-storagecluster-cephobjectstore ocs-storagecluster-cephobjectstore-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud rook-ceph-rgw-ocs-storagecluster-cephobjectstore <all> None
s3 s3-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud s3 s3-https reencrypt None
AWS CLIの設定
今回、バケットの操作はAWS CLIで行います。AWS CLIは導入済とします。~/.aws/credentials
ファイルにプロファイルとアクセスキーを指定します。
[roks-odf-tok-ceph]
aws_access_key_id = ********
aws_secret_access_key = ********
[roks-odf-tok-noobaa]
aws_access_key_id = ********
aws_secret_access_key = ********
バケットの表示
バケットの一覧を表示し、先ほど追加したバケットが表示されることを確認します。
# Ceph RGW
$ AWS_PROFILE=roks-odf-tok-ceph aws s3 ls --endpoint-url http://ocs-storagecluster-cephobjectstore-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
2021-10-09 03:31:17 ceph-object-bucket
$ AWS_PROFILE=roks-odf-tok-ceph aws s3 ls s3://ceph-object-bucket/ --endpoint-url http://ocs-storagecluster-cephobjectstore-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
(空)
# NooBaa
$ AWS_PROFILE=roks-odf-tok-noobaa aws s3 ls --endpoint-url https://s3-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.c
loud
2021-10-09 03:54:04 noobaa-object-bucket
2021-10-09 03:54:04 first.bucket
$ AWS_PROFILE=roks-odf-tok-noobaa aws s3 ls s3://noobaa-object-bucket/ --endpoint-url https://s3-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp
-tok.containers.appdomain.cloud
(空)
アップロードの確認
$ dd if=/dev/zero of=100M.dat bs=1M count=100
# Ceph RGW
$ AWS_PROFILE=roks-odf-tok-ceph aws s3 cp 100M.dat s3://ceph-object-bucket/ --endpoint-url http://ocs-storagecluster-cephobjectstore-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
upload: ./100M.dat to s3://ceph-object-bucket/100M.dat
$ AWS_PROFILE=roks-odf-tok-ceph aws s3 ls s3://ceph-object-bucket/ --endpoint-url http://ocs-storagecluster-cephobjectstore-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
2021-10-09 06:48:11 104857600 100M.dat
# NooBaa
$ AWS_PROFILE=roks-odf-tok-noobaa aws s3 cp 100M.dat s3://noobaa-object-bucket/ --endpoint-url https://s3-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
upload: ./100M.dat to s3://noobaa-object-bucket/100M.dat
$ AWS_PROFILE=roks-odf-tok-noobaa aws s3 ls s3://noobaa-object-bucket/ --endpoint-url https://s3-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud
2021-10-09 04:01:25 104857600 100M.dat
NooBaa管理コンソールへのアクセス
NooBaaの管理コンソールが利用できます。URLを確認します。
$ oc get route -n openshift-storage
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
noobaa-mgmt noobaa-mgmt-openshift-storage.roks-odf-tok-********81bb6d6d7afea007d1a8cafd-0000.jp-tok.containers.appdomain.cloud noobaa-mgmt mgmt-https reencrypt/Redirect None
ブラウザでアクセスすると許可を求められるので、Allow selected permissions
をクリックします。
Acccess Deniedになる場合はOK, Take Me to NooBaa Login
をクリックします。
次のSecretから、管理コンソールにログインするためのemail
とpassword
を調べます。
$ oc get secret noobaa-admin -n openshift-storage -o yaml | head
apiVersion: v1
data:
AWS_ACCESS_KEY_ID: ZXJZcmRYMElLV2dNNGVkeUlDamg=
AWS_SECRET_ACCESS_KEY: Nm54Sy9GbnErbzNDY3NDaUJ4SFRvOE9Ga2VuRzFiWEhOc0syb1FWSA==
email: YWRtaW5Abm9vYmFhLmlv
password: NW51cjNUMzNidWdkN1A4STZjazNTUT09
system: bm9vYmFh
kind: Secret
metadata:
creationTimestamp: "2021-10-08T13:52:06Z"
$ echo -n ${email} | base64 -d
$ echo -n ${password} | base64 -d
これらを指定してLogin
をクリックします。
管理コンソールが表示されます。
ここで各種メトリクスやバケットの情報を参照することができます。