Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
etcdとRaftアルゴリズム: Kubernetes Control Planeの信頼性の解...
Search
Shuhei Kawamura
March 26, 2024
Technology
0
42
etcdとRaftアルゴリズム: Kubernetes Control Planeの信頼性の解剖 / etcd and raft algorithm
2023/12/11 に行われた CNDT2023 「etcdとRaftアルゴリズム: Kubernetes Control Planeの信頼性の解剖」で使用したスライドです。
Shuhei Kawamura
March 26, 2024
Tweet
Share
Other Decks in Technology
See All in Technology
MapKitとオープンデータで実現する地図情報の拡張と可視化
zozotech
PRO
1
120
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
570
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
140
エンジニアリングマネージャー はじめての目標設定と評価
halkt
0
250
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
120
バグハンター視点によるサプライチェーンの脆弱性
scgajge12
3
970
Noを伝える技術2025: 爆速合意形成のためのNICOフレームワーク速習 #pmconf2025
aki_iinuma
2
2k
A Compass of Thought: Guiding the Future of Test Automation ( #jassttokai25 , #jassttokai )
teyamagu
PRO
1
240
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
580
乗りこなせAI駆動開発の波
eltociear
1
970
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
5
1.3k
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
390
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Writing Fast Ruby
sferik
630
62k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Automating Front-end Workflow
addyosmani
1371
200k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Context Engineering - Making Every Token Count
addyosmani
9
490
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.2k
Transcript
etcdとRaftアルゴリズム: Kubernetes Control Planeの信頼性の解剖 @shukawam/@ystkfujii 1
2 Shuhei Kawamura(X: @shukawam) Job: CSP - Cloud Architect (Cloud
Native, AuthNZ, AI/ML) ひとこと: 早く雪山にこもりたい Yoshitaka Fujii(X: @ystkfujii) Job: 何でも屋(Terraform/k8s/Golang) ひとこと: 来年のガンダムの映画が楽しみ
はじめに 3 ▪ 目標 ▫ RaftとetcdにおけるRaft実装を”完全理解”すること ▪ 話すこと ▫ Raftとはなにか
▫ etcdのRaftの実装を読む ▪ 話さないこと ▫ etcdのRaft以外の実装
Kubernetes Components 4 … Control Plane Node Node 参考: https://kubernetes.io/ja/docs/concepts/overview/components
Kubernetes Components 5 … Control Plane Node Node 参考: https://kubernetes.io/ja/docs/concepts/overview/components
What is etcd? ▪ 分散システムの最も重要なデータのための信頼性の高いKVS ▫ Simple - 明確に定義されたユーザー向けのAPI(gRPC) ▫
Secure - (optional)クライアント証明書認証による自動TLS ▫ Fast - 10,000 writes/secの書き込み ▫ Reliable - Raftを用いた適切な分散 ▪ Kubernetesでは全てのクラスター情報の保存場所として利用 6 参考: https://github.com/etcd-io/etcd
7 引用: https://github.com/etcd-io/etcd
Replicated state machines 8 ▪ 分散システムで障害耐性を持つために、同じ状態(State)のマシンを複 製(Replicated)するアプローチのこと ▪ 各State machineが実行するべき一連のコマンド(ログ)を複製すること
で同じ状態を複製する ▪ コンセンサス・アルゴリズムは、複製されたログの一貫性を保つ
9 引用: https://github.com/etcd-io/etcd Replicated state machines
What is Raft? ▪ コンセンサス・アルゴリズムの一種(Raft, Paxos, …) ▪ Paxosと比べ耐障害性や性能を維持しつつ、理解しやすいよう設計 ▪
採用されている代表的なサービス/プロダクト ▫ etcd, Kafka(KRaft), CockroachDB, … 10
Raft basics ▪ 各ノードは、Leader, Follower, Candidateいずれかの役割を持つ ▪ 主な動作は2つだけ ▫ Leader
election(リーダー選挙) - RequestVote RPC ▫ Log replication(ログ複製) - AppendEntries RPC ▪ Raftクラスタは奇数台(3, 5, 7)のノード構成を推奨 ▫ 偶数台/奇数台の場合で障害許容ノード数は変わらないが、障害 耐性が下がるため ▫ 参考: https://etcd.io/docs/v3.6/faq/#what-is-failure-tolerance 11
Leader election - Term ▪ 任意の長さに分割された時間のこと ▪ Termは選挙で始まり、最大で1つのLeaderがいることを保証する 12 引用:
https://raft.github.io/raft.pdf
Leader election - State transition ▪ 各ノードは、Leader, Follower, Candidateいずれかの役割を持つ ▫
起動直後 → Follower ▫ 選挙開始 → Candidate ▫ 選挙勝利 → Leader 13 引用: https://raft.github.io/raft.pdf
Leader election flow 14 Candidate Follower F F Leader RequestVote
RPC Increment Term Starts election Vote myself voteGranted: true win!! Become Leader AppendEntries RPC
Leader election flow 15 Candidate Follower F F Leader Increment
Term Starts election Vote myself voteGranted: true win!! Become Leader RequestVote RPC AppendEntries RPC
16 RequestVote RPC term 候補者のTerm candidateId 投票をリクエストしている候補者 lastLogIndex 候補者の最後のログエントリのインデックス lastLogTerm
候補者の最後のログエントリのターム term currentTerm、候補者が自分自身を更新する voteGranted 候補者が票を得た場合 true Arguments: Results: 引用: https://raft.github.io/raft.pdf
17 AppendEntries RPC - 1/2 term リーダーのTerm leaderId リーダーのID prevLogIndex
新しいエントリの直前のログエントリのインデックス prevLogTerm prevLogIndex のターム entries[] 保存するログエントリ (ハートビートの場合は空 ; 効率のために複数送信も可) leaderCommit リーダーのcommitIndex Arguments: 引用: https://raft.github.io/raft.pdf
18 term currentTerm、リーダーが自分自身を更新する success フォロワーがprevLogIndexとprevLogTermに一致するエント リを含んでいた場合は true Results: AppendEntries RPC
- 2/2 引用: https://raft.github.io/raft.pdf
Log replication ▪ Leader → FollowerへLogを複製し、各Followerはそれらを順序通りに 処理し、その実行結果をクライアントに返す ▫ Logの複製には、AppendEntries RPCが用いられる
19 引用: https://raft.github.io/raft.pdf
20 Log replication flow Client Leader F F Messages Append
to local log entries AppendEntries RPC success: true Commit log entries AppendEntries RPC w/ Leader committed index Success
21 Cluster membership changes オンラインでクラスターの構成変更を実施する上での考慮事項 ▪ 移行中の同一タームに2人のリーダーが選出されてはならない ▪ Raftでは、2段階の合意プロセスで構成移行を実施 ▫
Phase1. 新旧両方の構成を組み合わせた構成に移行 ▫ Joint Consensus ▫ Phase2. 新しい構成に移行 ▪ 安全性の観点から、一度に1つのサーバーしかクラスタに追加、削除で きないようにRaftでは制限を設けている
22 Cluster membership changes flow A(Leader) C D B AppendEntries
RPC Config of {old, new} success: true 新旧全てのノードに 構成変更ログを複製 新旧構成ともに 過半数の合意 AppendEntries RPC Config of {new} success: true 新構成から 過半数の同意 Phase 1 C_old ↓ C_old, new Phase 2 C_old, new ↓ C_new C_old = {A, B, C}, C_new = {A, B, C, D}
23
24 ▪ 対象のバージョンはetcd v3.5.10 ▪ 細かい点は省いています ▪ コードに修正を加えている部分があります 諸注意
Raftの立ち位置 25 Client Write Workflow MVCC: Multi-Version Concurrency Control MVCC
Write Ahead Log BoltDB EtcdServer Raft 1:書き込みリクエスト 2:Raftにフォワード 7:コミットを通知 8:DBへの書き込み 6:コミット 3:WALに書き込み Raft Write Ahead Log Raftのコアロジックをライブラリとして分離 • 受け取ったリクエストに対する処理 • Peerへの依頼内容 • コミット管理 など EtcdServer 3:Peerへ書き込み依頼 5:書き込み完了報告 4:WALに書き込み(6の後にコミット
Basic action 26 ▪ etcdのノードがどのStateなのか? ▪ そのStateの処理は何か? ▪ その処理のトリガーは何か?
Basic action: Which state ? 27 ▪ Nodeの状態はraft構造体のstateで管理されている ▪ becomeXXX関数でstateを変更する
参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Basic action: Processing of state 28 ▪ 定期実行の処理 -> tickXXX関数 ▪
State毎の処理 -> stepXXX関数 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Basic action: Processing of state 29 ▪ 定期実行の処理 -> tickXXX関数 ▪
State毎の処理 -> stepXXX関数 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Basic action: Message 30 ▪ MessageはNodeへの入力をまとめた もの ▫ 種類/送付先/エントリーなど ▪
MessageTypeの使い分け ▫ MsgProp : ログ追加の提案 ▫ MsgVote : 投票要求 ▫ MsgVoteResp: 投票要求への応答 など 参考: https://pkg.go.dev/go.etcd.io/raft/v3#hdr-MessageType
Basic action: Triggers for processing 31 Message Receive Run loop
If Message Appears Send Message To Peers Step Func Tick Func If Ready ? Yes No 参考: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/node.go#L300
Basic action: Summary 32 Leader Candidate Follower becomeFollower becomeCandidate becomeLeader
becomeCandidate stepFollower stepCandidate stepLeader tickElection tickHeartbeat tickElection 定期的に実行 Message受信で実行
Leader election flow 33 Candidate Follower F F Leader RequestVote
RPC Increment Term Starts election Vote myself voteGranted: true win!! Become Leader AppendEntries RPC
Vote myself win!! voteGranted: true Leader election flow 34 Follower
F F Leader Increment Term RequestVote RPC Become Leader Candidate Starts election
Leader election: Candidate Side 35 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Leader election: Candidate Side 36 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go Candidateになる
Leader election: Candidate Side 37 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go 投票者のIDでループ
Leader election: Candidate Side 38 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go MsgVoteを投票者に送付 実際には、msgsにappendされるのみ
Leader election: Candidate Side 39 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go 投票結果を集計
Leader election: Candidate Side 40 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go 勝てば 負ければ Followerになる
Leaderになる VotePendingの場合は何もしない
Become Leader Leader election flow 41 Candidate Follower Leader Increment
Term Starts election Vote myself win!! AppendEntries RPC RequestVote RPC voteGranted: true F F
Leader election: Follower side 42 まだ誰にも投票していないかつリーダーが分からない場合 デフォルトはStateFuncの実行 送付元が投票先の場合 投票しない 投票する
参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Leader election flow 43 Candidate Follower F F RequestVote RPC
Increment Term Starts election Vote myself voteGranted: true win!! Become Leader Leader AppendEntries RPC
Leader election: bcastAppend 44 ← toがここの場合 Followerのlogの状況を取得 引用: https://raft.github.io/raft.pdf
45 Log replication flow Client Leader F F Messages Append
to local log entries AppendEntries RPC success: true Commit log entries AppendEntries RPC w/ Leader committed index Success
Implementation for log replication 46 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go
Implementation for log replication 47 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go Followerに書き込まれた場合、 Leaderに転送
Implementation for log replication 48 参照: https://github.com/etcd-io/etcd/blob/v3.5.10/raft/raft.go Peerに送付 Entriesを追加 LeaderからのMessageでAppend
Summary 49 ▪ etcdの信頼性を担っているのはRaft ▪ Raftのアルゴリズムについて説明した ▪ 具体的な実装をetcdのコードベースで説明した
50 FIN