この記事はRookだらけの Advent Calendar 2019 5日目の記事です。
はいども。レッドハットでストレージを中心にクラウドインフラを生業にしているウツノミヤです。
CM空けてBパートです。ひとつのネタをAパートBパートに分けるあたりにウツノミヤの台所事情が垣間見えるRookアドカレ。引き続きみんな楽しんでね!
そして引き続きRookとOpenShift Japan CommunityのTwitterアカウント、@japan_rookと@openshiftjpのフォローお願いしまーす!
OBにPUTしてみる。
前回OBCでBucketを作ってappにattachしたんで、実際にデータをPUTしてみましょう。
あ、appはナイスな記事を書かれている人を見つけたので、この記事の最後の方で使われてるappを使わせてもらってます。ていうかこの記事あれば俺の記事いらん…?
まあいいや、so whatやね。ナナナナーナナーナー♪
このappを外部に公開してどんなappなのか見てみましょう。迷わず行けよ行けば分かるさ。
[utubo@tutsunom ceph]$ kubectl -n default expose pod photo1 --type=LoadBalancer --name=photo1 service/photo1 exposed [utubo@tutsunom ceph]$ kubectl -n default get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 40h photo1 LoadBalancer 100.71.221.229 xxxxd83c8e91d437b977cfc70d39006a-xxxx95985.us-east-1.elb.amazonaws.com 3000:32040/TCP 38m
ほんでちょっと待って、ブラウザでexternal-IPの3000番にアクセスしてやると…
じゃあせっかくなので記念に毎回表示してるアイキャッチの画像をうpしてみます。
のまえに、Cephのオブジェクトストアをチェックしておきます。
[utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` radosgw-admin bucket list [ "hogehoge-11231ae6-cca4-4995-ab4c-41390b8b69f1" ] [utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph df (省略) POOLS: POOL ID STORED OBJECTS USED %USED MAX AVAIL ssd-pool 1 0 B 0 0 B 0 15 GiB hdd-pool 2 0 B 0 0 B 0 34 GiB objstore.rgw.control 3 0 B 8 0 B 0 45 GiB objstore.rgw.meta 4 961 B 5 192 KiB 0 45 GiB objstore.rgw.log 5 128 B 180 96 KiB 0 45 GiB objstore.rgw.buckets.index 6 0 B 1 0 B 0 45 GiB objstore.rgw.buckets.non-ec 7 0 B 0 0 B 0 45 GiB .rgw.root 8 3.7 KiB 16 720 KiB 0 45 GiB objstore.rgw.buckets.data 9 0 B 0 0 B 0 45 GiB
とりあえずBucketはあると。そしてPoolのObjectの数もチェックしておきます。 じゃあうpします。
もう一回ceph df
の出力を見ると、
[utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph df (省略) POOLS: POOL ID STORED OBJECTS USED %USED MAX AVAIL ssd-pool 1 0 B 0 0 B 0 15 GiB hdd-pool 2 0 B 0 0 B 0 34 GiB objstore.rgw.control 3 0 B 8 0 B 0 45 GiB objstore.rgw.meta 4 961 B 5 192 KiB 0 45 GiB objstore.rgw.log 5 128 B 180 96 KiB 0 45 GiB objstore.rgw.buckets.index 6 0 B 1 0 B 0 45 GiB objstore.rgw.buckets.non-ec 7 0 B 0 0 B 0 45 GiB .rgw.root 8 3.7 KiB 16 720 KiB 0 45 GiB objstore.rgw.buckets.data 9 572 KiB 1 1.7 MiB 0 45 GiB
objstore.rgw.buckets.data
にオブジェクトが一個増えてますね。無事PoolにPUTされたということがわかります。
ついでにもうひとつ、14MiBくらいのファイルもうpしてみると、ceph df
の出力はこうなりました。
[utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph df (省略) POOLS: POOL ID STORED OBJECTS USED %USED MAX AVAIL ssd-pool 1 0 B 0 0 B 0 15 GiB hdd-pool 2 0 B 0 0 B 0 34 GiB objstore.rgw.control 3 0 B 8 0 B 0 45 GiB objstore.rgw.meta 4 961 B 5 192 KiB 0 45 GiB objstore.rgw.log 5 128 B 180 96 KiB 0 45 GiB objstore.rgw.buckets.index 6 0 B 1 0 B 0 45 GiB objstore.rgw.buckets.non-ec 7 0 B 0 0 B 0 45 GiB .rgw.root 8 3.7 KiB 16 720 KiB 0 45 GiB objstore.rgw.buckets.data 9 14 MiB 5 42 MiB 0.03 45 GiB
OBJECTが1→5になって、4個増えました。RGWで置かれるデータはデフォルト4MiBでストライプされるので、14MiBのファイルは4つのオブジェクトにストライプされて置かれてるってことです。
OBCを削除する
Bucketが使えることがわかったのでお片付けをしましょう。PVCと同じ様にOBCを削除します。
[utubo@tutsunom ceph]$ kubectl -n default delete obc objstore-obc-delete objectbucketclaim.objectbucket.io "objstore-obc-delete" deleted [utubo@tutsunom ceph]$ kubectl -n default get obc,ob No resources found in default namespace.
消えました。Cephクラスタの方でBucketを見てみると、
[utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` radosgw-admin bucket list []
こちらも消えました。StorageClassの方でreclaimPolicy: Delete
にしているので、OBCが消されるとBucketも連動して消されます。
蛇足かもしれんけど一応reclaimPolicy: Retain
のStorageClassを作ってOBC作って消して確認してみましょう。
[utubo@tutsunom ceph]$ cat my-sc-bkt-retain.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-bkt-retain provisioner: ceph.rook.io/bucket reclaimPolicy: Retain parameters: objectStoreName: objstore objectStoreNamespace: rook-ceph [utubo@tutsunom ceph]$ kubectl create -f my-sc-bkt-retain.yaml storageclass.storage.k8s.io/ceph-bkt-retain created [utubo@tutsunom ceph]$ cat my-obc-retain.yaml apiVersion: objectbucket.io/v1alpha1 kind: ObjectBucketClaim metadata: name: objstore-obc-retain namespace: default spec: generateBucketName: fugafuga storageClassName: ceph-bkt-retain [utubo@tutsunom ceph]$ kubectl create -f my-obc-retain.yaml objectbucketclaim.objectbucket.io/objstore-obc-retain created [utubo@tutsunom ceph]$ kubectl -n default get obc,ob NAME AGE objectbucketclaim.objectbucket.io/objstore-obc-retain 3m19s NAME AGE objectbucket.objectbucket.io/obc-default-objstore-obc-retain 3m18s [utubo@tutsunom ceph]$ [utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` radosgw-admin bucket list [ "fugafuga-06f9f7d7-dcd4-4ce9-8d24-a412b39bb291" ]
はいBucketできてますね。じゃあOBC消したらBuketは、
[utubo@tutsunom ceph]$ kubectl -n default delete obc objstore-obc-retain objectbucketclaim.objectbucket.io "objstore-obc-retain" deleted [utubo@tutsunom ceph]$ kubectl -n default get obc,ob No resources found in default namespace. [utubo@tutsunom ceph]$ kubectl -n rook-ceph exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` radosgw-admin bucket list [ "fugafuga-06f9f7d7-dcd4-4ce9-8d24-a412b39bb291" ]
あるんだなあ。
まとめ
というわけで2回にわたって今回はRook 1.1の新機能Object Bucket Claimについて超簡単にご紹介しました。実際やってみて、ほとんどPVCと同じ感じで違和感無く使えました。オブジェクトストレージってBucket作ったり消したりのライフサイクル管理がどうしてもストレージ側の運用になってくるので、Kubernetes側でアプリケーションと合わせる形で管理できるのは便利なんじゃないかなと思いました。
というわけで今日はここまで。