Cephクラスタのupgrade
この記事はRookだらけの Advent Calendar 2019 8日目の記事です。
今日は超軽くRook-Cephで作ったCephクラスタのupgradeを説明します。
Cephのupgrade
Cephは基本的にコンポーネントが冗長化されて動いているので、1つずつrolling upgradeすることでストレージ的にはNon-disruptiveなupgradeができます。
Rook-Cephではoperatorがその辺りを自動的にやってくれるので、人がやることは超少ないです。というわけでやってみましょう。
いつもどおり3master+3workerで各workerにそれぞれ2つOSDをぶら下げたCephクラスタを作ります。
[utubo@tutsunom ceph]$ kubectl get node --sort-by=".metadata.creationTimestamp" NAME STATUS ROLES AGE VERSION ip-172-20-110-218.ec2.internal Ready master 38h v1.15.5 ip-172-20-58-245.ec2.internal Ready master 38h v1.15.5 ip-172-20-68-55.ec2.internal Ready master 38h v1.15.5 ip-172-20-125-18.ec2.internal Ready node 38h v1.15.5 ip-172-20-60-20.ec2.internal Ready node 12h v1.15.5 ip-172-20-81-195.ec2.internal Ready node 12h v1.15.5 [utubo@tutsunom ceph]$ kubectl -n rook-ceph get pod NAME READY STATUS RESTARTS AGE csi-cephfsplugin-provisioner-974b566d9-8svhf 4/4 Running 0 6h21m csi-cephfsplugin-provisioner-974b566d9-hxfx2 4/4 Running 0 6h21m csi-cephfsplugin-q7m66 3/3 Running 0 6h21m csi-cephfsplugin-r58wx 3/3 Running 0 6h21m csi-cephfsplugin-w4pfg 3/3 Running 0 6h21m csi-rbdplugin-fhbqj 3/3 Running 0 6h21m csi-rbdplugin-jf5c9 3/3 Running 0 6h21m csi-rbdplugin-provisioner-579c546f5-9nh7z 5/5 Running 0 6h21m csi-rbdplugin-provisioner-579c546f5-pvf76 5/5 Running 0 6h21m csi-rbdplugin-v9p2k 3/3 Running 0 6h21m rook-ceph-mgr-a-649dcd8f8-z4bf9 1/1 Running 0 6h14m rook-ceph-mon-a-fb9dc8bf7-7tpfh 1/1 Running 0 6h14m rook-ceph-mon-b-7cbdf8b8bf-q8m89 1/1 Running 0 6h15m rook-ceph-mon-c-764f6b7c48-crlhc 1/1 Running 0 6h15m rook-ceph-operator-fb8b96548-cjzsp 1/1 Running 0 6h21m rook-ceph-osd-0-54cc869884-s7lx7 1/1 Running 0 6h13m rook-ceph-osd-1-69bb658d69-2x72t 1/1 Running 0 6h12m rook-ceph-osd-2-6886955f66-xxmjk 1/1 Running 0 6h13m rook-ceph-osd-3-c9fd5bdb6-l7n6r 1/1 Running 0 6h13m rook-ceph-osd-4-6fdc7dbb45-vvmqb 1/1 Running 0 6h12m rook-ceph-osd-5-66cbbf745-f6dwx 1/1 Running 0 6h13m rook-ceph-osd-prepare-ip-172-20-125-18.ec2.internal-h2rxc 0/1 Completed 0 6h14m rook-ceph-osd-prepare-ip-172-20-60-20.ec2.internal-fm8h5 0/1 Completed 0 6h14m rook-ceph-osd-prepare-ip-172-20-81-195.ec2.internal-rd9zk 0/1 Completed 0 6h14m rook-ceph-tools-5bc668d889-44wq2 1/1 Running 0 6h18m rook-discover-dmgtp 1/1 Running 0 6h21m rook-discover-p94l5 1/1 Running 0 6h21m rook-discover-x97hw 1/1 Running 0 6h21m [utubo@tutsunom ceph]$ kubectl exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph version ceph version 14.2.2 (4f8fa0a0024755aae7d95567c63f11d6862d55be) nautilus (stable)
はいはい。
それではこのCephクラスタを14.2.2から14.2.4にupgradeします。やることは一つです。CephClusterリソースのimageのタグを書き換えるだけ。
[utubo@tutsunom ceph]$ kubectl -n rook-ceph patch CephCluster rook-ceph --type=merge -p "{\"spec\": {\"cephVersion\": {\"image\": \"ceph/ceph:v14.2.4-20191204\"}}}"
これだけで後はRook-Ceph Operatorが全部やってくれます。その様子を追っかけてみましょう。
upgrade中、別窓で↓のようにDeploymentの"READY/UP-TO-DATE/AVAILABLE"とceph-versionをwatchで見ておくとどうなるか。
※出力が長くなるので注目する部分だけ書きます。
[utubo@tutsunom ceph]$ watch --exec kubectl -n rook-ceph get deploy -l rook_cluster=rook-ceph -o jsonpath='{range .items[*]}{.metadata.name}{" \treq/upd/avl: "}{.spec.replicas}{"/"}{.status.updatedReplicas}{"/"}{.status.readyReplicas}{" \tceph-version="}{.metadata.labels.ceph-version}{"\n"}{end}' rook-ceph-mgr-a req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-a req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-b req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-c req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.2 ↓ rook-ceph-mon-a req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-b req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-c req/upd/avl: 1// ceph-version=14.2.4 ↓ rook-ceph-mon-a req/upd/avl: 1/1/ ceph-version=14.2.4 rook-ceph-mon-b req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-mon-c req/upd/avl: 1/1/1 ceph-version=14.2.4 ↓ rook-ceph-mon-a req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-mon-b req/upd/avl: 1/1/ ceph-version=14.2.4 rook-ceph-mon-c req/upd/avl: 1/1/1 ceph-version=14.2.4
まず初めにMONがupgradeされ。今回はmon-c -> mon-a -> mon-bの順序でしたが、別の機会はまた違った順序だったので特に順番は決まって居ないようです。1つずつupgradeするのは間違いないです。
続き、
↓ rook-ceph-mgr-a req/upd/avl: 1// ceph-version=14.2.4 ↓ rook-ceph-mgr-a req/upd/avl: 1/1/1 ceph-version=14.2.4
次にMGRがupgrade。続いて、
rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/ ceph-version=14.2.4 ↓ rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-2 req/upd/avl: 1// ceph-version=14.2.4 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.4 ↓ rook-ceph-osd-0 req/upd/avl: 1/1/ ceph-version=14.2.4 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.4 ↓ rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-3 req/upd/avl: 1// ceph-version=14.2.4 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.4 ↓ rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-1 req/upd/avl: 1/1/ ceph-version=14.2.4 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.2 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.4 ↓ rook-ceph-osd-0 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-1 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-2 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-3 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-4 req/upd/avl: 1/1/1 ceph-version=14.2.4 rook-ceph-osd-5 req/upd/avl: 1/1/1 ceph-version=14.2.4
という感じで最後にOSDがupgradeされます。
ここではosdが5,2,0,3,1,4という順序でupgradeされました。Cephのosd treeを見てみるとworker nodeごとにupgradeをかけていることがわかります。
[utubo@tutsunom ceph]$ kubectl exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.16974 root default -5 0.16974 region us-east-1 -4 0.05658 zone us-east-1a -3 0.05658 host ip-172-20-60-20-ec2-internal 0 ssd 0.02829 osd.0 up 1.00000 1.00000 3 ssd 0.02829 osd.3 up 1.00000 1.00000 -10 0.05658 zone us-east-1b -9 0.05658 host ip-172-20-81-195-ec2-internal 1 ssd 0.02829 osd.1 up 1.00000 1.00000 4 ssd 0.02829 osd.4 up 1.00000 1.00000 -14 0.05658 zone us-east-1c -13 0.05658 host ip-172-20-125-18-ec2-internal 2 ssd 0.02829 osd.2 up 1.00000 1.00000 5 ssd 0.02829 osd.5 up 1.00000 1.00000
最後にCephクラスタでバージョンを確認すると、
[utubo@tutsunom ceph]$ kubectl exec -it `kubectl get pod -l app=rook-ceph-tools -o 'jsonpath={.items[].metadata.name}'` ceph version ceph version 14.2.4 (75f4de193b3ea58512f204623e6c5a16e6c1e1ba) nautilus (stable)
はいおわり。
コマンド一個打つだけでMON -> MGR -> OSDとそれぞれ1つずつupgradeしてくれるのだからRook-Ceph operatorは偉大です。
まとめ
今日は軽くCephクラスタのupgradeについて説明しました。
今回は同一メジャーバージョン間のupgradeでしたが、メジャーバージョンをまたぐとOSDのメタデータの持ち方とかが変わってデバイスをattachできないとか(特にBlueStoreの場合)があるかもしれないので注意が必要かもです(適当) ※13->14のupgradeにことごとく失敗して、原因がまだ調査できていない(汗)
あと、本当はRook-Ceph operator自身のupgradeも説明すべきですが、時間がなくて検証できていないので続きは赤帽エンジニアブログで書きます。
Rookは対応するSDSやDBのoperatorで、ストレージの構築から運用まで強力に手助けしてくれる革命的なオーケストレーションツールです。
みなさんぜひ試してみて下さいね。
それでは今日でRookだらけのAdvent Calendar 2019の私のパートは終わりです。8日連続でお付き合いいただきありがとうございました。
引き続きtzkobaさんとmakotowさんという豪華顔ぶれの説明をお楽しみください!