$30 off During Our Annual Pro Sale. View Details »

アプリのコンテナ化と排他制御 ~ データ 破壊 だ ヨ 全員集合

アプリのコンテナ化と排他制御 ~ データ 破壊 だ ヨ 全員集合

Kubernetes Meetup Tokyo #36のLT資料です。
https://k8sjp.connpass.com/event/196212/

Satoru Takeuchi
PRO

November 30, 2020
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. OSDのdeployment
    10

    containers:

    command:
    - ceph-osd
    volumeMounts:
    - mountPath: /var/lib/ceph/osd/ceph-0
    name: set1-data-0-xfvdg-bridge
    subPath: ceph-0

    View Slide

  11. 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

    コンテナごとに別々の
    ロックファイルを作るよ!

    View Slide

  12. 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がブッ壊れるよ!

    View Slide

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

    View Slide

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

    View Slide

  15. 問題が発生するシナリオの例
    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

    View Slide

  16. 問題が発生するシナリオの例
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. 検出してから現在までの流れ
    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

    View Slide

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

    View Slide