ストレージオーケストレーター Rook : 第8話 宿命のObject Bucket(Bパート)

f:id:ututaq:20191125022735p:plain

この記事はRookだらけの Advent Calendar 2019 5日目の記事です。

はいども。レッドハットでストレージを中心にクラウドインフラを生業にしているウツノミヤです。
CM空けてBパートです。ひとつのネタをAパートBパートに分けるあたりにウツノミヤの台所事情が垣間見えるRookアドカレ。引き続きみんな楽しんでね!

qiita.com

そして引き続きRookとOpenShift Japan CommunityのTwitterアカウント、@japan_rook@openshiftjpのフォローお願いしまーす!

OBにPUTしてみる。

前回OBCでBucketを作ってappにattachしたんで、実際にデータをPUTしてみましょう。
あ、appはナイスな記事を書かれている人を見つけたので、この記事の最後の方で使われてるappを使わせてもらってます。ていうかこの記事あれば俺の記事いらん…?

examples-and-blogs/examples/rook-ceph-provisioner at master · yard-turkey/examples-and-blogs · GitHub

まあいいや、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番にアクセスしてやると…

f:id:ututaq:20191204030534p:plain
すげーちゃんとしてる!

じゃあせっかくなので記念に毎回表示してるアイキャッチの画像をう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します。

f:id:ututaq:20191204032846p:plain
d[〒]

もう一回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側でアプリケーションと合わせる形で管理できるのは便利なんじゃないかなと思いました。
というわけで今日はここまで。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。