Slide 1

Slide 1 text

アプリのコンテナ化と排他制御 ~ データ破壊だヨ!全員集合 Nov 30, 2020 sat@サイボウズ 1

Slide 2

Slide 2 text

前置き ▌アプリのコンテナ化は罠だらけ ▌本セッションは排他制御にまつわる罠を紹介 ▌実例として最近検出したRook/Ceph(後述)の データ破壊問題を紹介 2

Slide 3

Slide 3 text

Cephとは ▌OSSの分散ストレージシステム ▌データはOSDという領域に保存 ⚫OSDはクラスタ内のディスク上に作成 ⚫Ceph-osdというdaemonがOSD上のデータを読み書き ▌各データは全OSDにおおむね均等に分散配置 3 node0 node1 HDD HDD HDD HDD OSD OSD OSD OSD

Slide 4

Slide 4 text

データ書き込み時の挙動 4 node0 node1 Cephクライアント HDD HDD HDD HDD OSD OSD OSD OSD data0

Slide 5

Slide 5 text

データ書き込み時の挙動 5 node0 node1 Cephクライアント HDD HDD HDD HDD OSD OSD OSD OSD data1 data0

Slide 6

Slide 6 text

データ書き込み時の挙動 6 node0 node1 Cephクライアント HDD HDD HDD HDD OSD OSD OSD OSD data1 data2 data0

Slide 7

Slide 7 text

データ書き込み時の挙動 7 node0 node1 Cephクライアント HDD HDD HDD HDD OSD OSD OSD OSD data1 data2 data0 data3

Slide 8

Slide 8 text

Rookとは ▌K8s上で動作するCephのオーケストレーション ▌1つのOSDに対して1つPodが存在 8 node OSD Pod OSD Pod HDD HDD OSD OSD ceph-osd ceph-osd 操作 操作

Slide 9

Slide 9 text

OSD Podの管理方法 ▌諸事情によりStatefulSetではなくDeploymentsを使用 ▌ceph-osdには二重起動を避ける仕組みが存在 ⚫/var/lib/ceph/osd/ceph-以下のファイルでロック 9 HDD OSD ceph-osd A ceph-osd B ロック ceph-osd Aにロックを取られているのでアクセス不可

Slide 10

Slide 10 text

OSDのdeployment 10 … containers: … command: - ceph-osd volumeMounts: - mountPath: /var/lib/ceph/osd/ceph-0 name: set1-data-0-xfvdg-bridge subPath: ceph-0 …

Slide 11

Slide 11 text

OSDのdeployment 11 … containers: … command: - ceph-osd volumeMounts: - mountPath: /var/lib/ceph/osd/ceph-0 name: set1-data-0-xfvdg-bridge subPath: ceph-0 … volumes: … - emptyDir: medium: Memory name: set1-data-0-xfvdg-bridge … コンテナごとに別々の ロックファイルを作るよ!

Slide 12

Slide 12 text

OSDのdeployment 12 … containers: … command: - ceph-osd volumeMounts: - mountPath: /var/lib/ceph/osd/ceph-0 name: set1-data-0-xfvdg-bridge subPath: ceph-0 … volumes: … - emptyDir: medium: Memory name: set1-data-0-xfvdg-bridge … もしOSD Podが二重起動すると OSDがブッ壊れるよ!

Slide 13

Slide 13 text

問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 13 OSD Pod A HDD OSD ceph-osd ロック A

Slide 14

Slide 14 text

問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 2. OSD Pod Aがeviction対象になり”Terminating”に。Ceph-osdはまだ動作中 14 OSD Pod A HDD OSD ceph-osd ロック A Terminating

Slide 15

Slide 15 text

問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 2. OSD Pod Aがeviction対象になり”Terminating”に。Ceph-osdはまだ動作中 3. 新しいOSD Pod Bが同じノードにスケジュールされる 15 OSD Pod A HDD OSD ceph-osd ロック A OSD Pod B ceph-osd Terminating

Slide 16

Slide 16 text

問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 2. OSD Pod Aがeviction対象になり”Terminating”に。Ceph-osdはまだ動作中 3. 新しいOSD Pod Bが同じノードにスケジュールされる 4. 2つのceph-osdが同じOSDを操作、OSDが壊れる ⚫ それぞれ別ファイルをロックしているので排他制御は機能しない 16 OSD Pod A HDD OSD ceph-osd ロック A OSD Pod B ceph-osd Terminating ロック B

Slide 17

Slide 17 text

検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 17 node プロセス プロセス プロセス HDD OSD Ceph-osd メモリが足りませんよ

Slide 18

Slide 18 text

検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 2. 偶然前述の問題の再現試験のような状況になった ⚫ OOM killerによるプロセスの殺戮 ⚫ Kubeletによるプロセスの再生成 ⚫ メモリ不足によるPod eviction 18 node プロセス OOM Killer なかなかメモリが空かないなあ 殺戮 プロセス プロセス Podをスケジュールしなきゃ & 追い出さなきゃ 再生成 kubelet HDD OSD Ceph-osd

Slide 19

Slide 19 text

検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 2. 偶然前述の問題の再現試験のような状況になった ⚫ OOM killerによるプロセスの殺戮 ⚫ Kubeletによるプロセスの再生成 ⚫ メモリ不足によるPod eviction 3. OSD Podが二重起動。死 19 node プロセス OOM Killer なかなかメモリが空かないなあ 殺戮 プロセス プロセス 再生成 kubelet HDD OSD Ceph-osd Ceph-osd Podをスケジュールしなきゃ & 追い出さなきゃ

Slide 20

Slide 20 text

検出してから現在までの流れ 1. CephコミュニティとRookコミュニティに報告 ⚫https://tracker.ceph.com/issues/48036 ⚫https://github.com/rook/rook/issues/6530 2. OSDのログから複数ceph-osdの動作を検出 3. Rookで問題が起きうることを確認 4. 現在はRookの修正検討中 20

Slide 21

Slide 21 text

まとめ ▌StatefulワークロードにはなるべくStatefulSetを使う ▌アプリのコンテナ化ではロックファイルの共有忘れに注意 ⚫ステートレスワークロードでも起こりうる ▌Rookの問題は今後修正予定 ▌OOM killerは優秀なデバッグツール 21