ここは今からストレージです。

Cephクラスタのupgrade

f:id:ututaq:20191125022735p:plain

この記事は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さんという豪華顔ぶれの説明をお楽しみください!