Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アプリのコンテナ化と排他制御 ~ データ 破壊 だ ヨ 全員集合
Search
Satoru Takeuchi
PRO
November 30, 2020
Technology
6
8.6k
アプリのコンテナ化と排他制御 ~ データ 破壊 だ ヨ 全員集合
Kubernetes Meetup Tokyo #36のLT資料です。
https://k8sjp.connpass.com/event/196212/
Satoru Takeuchi
PRO
November 30, 2020
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
ハイテク休憩
sat
PRO
2
150
利きプロセススケジューラ
sat
PRO
5
3.1k
俺とVSCode Python Debugger Extension
sat
PRO
1
190
コード再利用のしくみ ライブラリ
sat
PRO
3
60
AWKへの愛を語る
sat
PRO
3
540
syncコマンドのデータ同期 完了待ちやエラー検出
sat
PRO
0
100
動作中のLinux環境の全メモリを見る
sat
PRO
1
120
Linuxの時間を10秒止める
sat
PRO
2
220
プロセスへのメモリ割り当て4 - 実際に使うときにメモリを獲得するデマンドページング(実践編)
sat
PRO
1
150
Other Decks in Technology
See All in Technology
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
100
Oracle Cloudの生成AIサービスって実際どこまで使えるの? エンジニア目線で試してみた
minorun365
PRO
4
280
C++26 エラー性動作
faithandbrave
2
740
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
2
360
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
220
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
160
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
120
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
140
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
170
社内イベント管理システムを1週間でAKSからACAに移行した話し
shingo_kawahara
0
190
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
100
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
A Philosophy of Restraint
colly
203
16k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Done Done
chrislema
181
16k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Documentation Writing (for coders)
carmenintech
66
4.5k
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Language of Interfaces
destraynor
154
24k
Transcript
アプリのコンテナ化と排他制御 ~ データ破壊だヨ!全員集合 Nov 30, 2020 sat@サイボウズ 1
前置き ▌アプリのコンテナ化は罠だらけ ▌本セッションは排他制御にまつわる罠を紹介 ▌実例として最近検出したRook/Ceph(後述)の データ破壊問題を紹介 2
Cephとは ▌OSSの分散ストレージシステム ▌データはOSDという領域に保存 ⚫OSDはクラスタ内のディスク上に作成 ⚫Ceph-osdというdaemonがOSD上のデータを読み書き ▌各データは全OSDにおおむね均等に分散配置 3 node0 node1 HDD
HDD HDD HDD OSD OSD OSD OSD
データ書き込み時の挙動 4 node0 node1 Cephクライアント HDD HDD HDD HDD OSD
OSD OSD OSD data0
データ書き込み時の挙動 5 node0 node1 Cephクライアント HDD HDD HDD HDD OSD
OSD OSD OSD data1 data0
データ書き込み時の挙動 6 node0 node1 Cephクライアント HDD HDD HDD HDD OSD
OSD OSD OSD data1 data2 data0
データ書き込み時の挙動 7 node0 node1 Cephクライアント HDD HDD HDD HDD OSD
OSD OSD OSD data1 data2 data0 data3
Rookとは ▌K8s上で動作するCephのオーケストレーション ▌1つのOSDに対して1つPodが存在 8 node OSD Pod OSD Pod HDD
HDD OSD OSD ceph-osd ceph-osd 操作 操作
OSD Podの管理方法 ▌諸事情によりStatefulSetではなくDeploymentsを使用 ▌ceph-osdには二重起動を避ける仕組みが存在 ⚫/var/lib/ceph/osd/ceph-<OSD ID>以下のファイルでロック 9 HDD OSD ceph-osd
A ceph-osd B ロック ceph-osd Aにロックを取られているのでアクセス不可
OSDのdeployment 10 … containers: … command: - ceph-osd volumeMounts: -
mountPath: /var/lib/ceph/osd/ceph-0 name: set1-data-0-xfvdg-bridge subPath: ceph-0 …
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 … コンテナごとに別々の ロックファイルを作るよ!
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がブッ壊れるよ!
問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 13 OSD Pod A HDD
OSD ceph-osd ロック A
問題が発生するシナリオの例 1. OSD Pod AがOSDを操作 2. OSD Pod Aがeviction対象になり”Terminating”に。Ceph-osdはまだ動作中 14
OSD Pod A HDD OSD ceph-osd ロック A Terminating
問題が発生するシナリオの例 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
問題が発生するシナリオの例 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
検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 17 node プロセス プロセス プロセス HDD
OSD Ceph-osd メモリが足りませんよ
検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 2. 偶然前述の問題の再現試験のような状況になった ⚫ OOM killerによるプロセスの殺戮 ⚫
Kubeletによるプロセスの再生成 ⚫ メモリ不足によるPod eviction 18 node プロセス OOM Killer なかなかメモリが空かないなあ 殺戮 プロセス プロセス Podをスケジュールしなきゃ & 追い出さなきゃ 再生成 kubelet HDD OSD Ceph-osd
検出経緯 1. OSD Podが存在するノードが慢性的なメモリ不足になっていた 2. 偶然前述の問題の再現試験のような状況になった ⚫ OOM killerによるプロセスの殺戮 ⚫
Kubeletによるプロセスの再生成 ⚫ メモリ不足によるPod eviction 3. OSD Podが二重起動。死 19 node プロセス OOM Killer なかなかメモリが空かないなあ 殺戮 プロセス プロセス 再生成 kubelet HDD OSD Ceph-osd Ceph-osd Podをスケジュールしなきゃ & 追い出さなきゃ
検出してから現在までの流れ 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
まとめ ▌StatefulワークロードにはなるべくStatefulSetを使う ▌アプリのコンテナ化ではロックファイルの共有忘れに注意 ⚫ステートレスワークロードでも起こりうる ▌Rookの問題は今後修正予定 ▌OOM killerは優秀なデバッグツール 21