Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
Search
Sota Takaki
August 27, 2026
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
Sota Takaki
August 27, 2026
More Decks by Sota Takaki
See All by Sota Takaki
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Terraform での Google Cloud IAM 管理 について考える
stkk
0
82
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
460
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
590
Webプラットフォームで議論されているセキュリティ課題 / Security issues being discussed on Web Platforms
petamoriken
0
420
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
180
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
4
4.5k
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
不幸な GC
chencmd
0
890
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
640
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
230
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
700
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
760
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
2
3.9k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
We Have a Design System, Now What?
morganepeng
55
8.3k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
Done Done
chrislema
186
16k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
440
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Transcript
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係 株式会社スリーシェイク Sreake事業部 髙木 創太
Kubernetes Novice Tokyo #41 2026-08-27 Copyright © 3-shake, Inc. All Rights Reserved. 1
自己紹介 • • • Copyright © 3-shake, Inc. All Rights
Reserved. 名前 ◦ 髙木 創太 所属 ◦ 株式会社スリーシェイク SRE 一言 ◦ 全てこのアフロでプロフィール画像を統一していま す。よろしくお願いします。 ▪ X: https://x.com/stkk_12 ▪ Zenn: https://zenn.dev/stkk 2
目次 • Blue/Green アップグレードについて ◦ Blue/Green グレードの概要 ◦ Blue/Green グレードの
5 フェーズ • cordon と drain について • PodDisruptionBudget(PDB)について ◦ • 設定値による Pod の挙動比較 まとめ Copyright © 3-shake, Inc. All Rights Reserved. 3
今日話すこと / 話さないこと 話すこと 話さないこと • Blue/Green アップグレードの流れ • cordon
と drain が Pod に何をしているか • PodDisruptionBudget(PDB) について 実施環境 • GKE Standard(1.33 → 1.34) ◦ • Surge upgrade の詳細 ◦ 選び方の比較だけ次のスライドで触れます • Cluster Autoscaler との相互作用 • アプリ側のシャットダウン実装 • 自動アップグレード • アップグレードすべきタイミング • その他アップグレードで気にするべきこと コントロールプレーンは事前に更新済み Copyright © 3-shake, Inc. All Rights Reserved. 4
01 Blue/Green アップデートについて Copyright © 3-shake, Inc. All Rights Reserved.
5
Blue/Green アップグレードとは Node Pool のノードを、新バージョンのノード群と丸ごと入れ替える 方式です。 • Green(新)を全台作ってから、Blue(旧)を空にする • 一時的にノードがほぼ
2 倍になる # 戦略は Node Pool 単位で設定する $ gcloud container node-pools update POOL \ --cluster=CLUSTER \ --enable-blue-green-upgrade \ ◦ CPU / IP アドレス / ディスクのクォータを先に確認する • Blue を削除するまでは rollback できる • 同一 Node Pool 内での入れ替え --standard-rollout-policy=\ batch-node-count=1,\ batch-soak-duration=60s \ --node-pool-soak-duration=1h 既定は Surge upgrade です。Blue/Green は明示的に選ぶ必要があります。 Copyright © 3-shake, Inc. All Rights Reserved. 7
Blue/Green を選ぶべき場面 観点 Surge upgrade(既定) Blue/Green upgrade 進め方 既存ノードを少しずつ作り替える 新ノード群を作ってから旧を空にする
一時的なノード数 + max-surge 分だけ ほぼ 2 倍(Blue と Green が併存) 切り戻し 進んだ分は戻しにくい Blue 削除前なら rollback できる 所要時間 短い 長い(soak を含む) 選ぶとき 選ばないとき • 一時的な費用の増加が許容される場合 • クォータやリソースに 2 倍の余裕がない場合 • ワークロードで中断を許容できない場合 • アップグレードの速度を最適化したい場合 • soak 中に監視して、問題があれば戻したい場合 • ワークロードの中断が許容される場合 • 新しいノードの作成を最小限に抑えてコストを抑える場合 Copyright © 3-shake, Inc. All Rights Reserved. 8
Blue/Green の 5 フェーズ ここから不可逆 → ① ② ③ ④
⑤ Green 作成 Blue cordon Blue drain soak Blue 削除 ← rollback 可能 • ① Green 作成 — cordon より前に全台作られる。ノード数は Blue と同じ • ② Blue を cordon — 以降に生まれる Pod は Green へ • ③ Blue を drain — Pod を退避する • ④ soak — 全 drain 後の待機。既定 は1 時間で、それより前に終えることも可能 • ⑤ Blue 削除 — ここから戻せない 今日は、この 5 フェーズのうち ② cordon と ③ drain の 2 フェーズにフォーカスします。 Copyright © 3-shake, Inc. All Rights Reserved. 9
02 cordon と drain について Copyright © 3-shake, Inc. All
Rights Reserved. 9
cordon とは 「新規の Pod を配置できない(SchedulingDisabled)」状態にする操 $ kubectl get nodes 作です。
• 既存 Pod はそのまま稼働し、追い出しはしない • Blue/Green ではプール内の全ノードが一括で cordon される ◦ 以降に生まれる Pod は Green にしか乗らない ◦ ノードは 2 倍あるのに、みえる置き場所は Green だけ NAME STATUS node-a Ready,SchedulingDisabled node-b Ready cordon は「置かせない」だけで、追い出しはしない。 Copyright © 3-shake, Inc. All Rights Reserved. 11
drain とは ノード上の Pod を退避させて、ノードを空にする操作です。 $ kubectl drain node-a --ignore-daemonsets
• Pod の削除に Eviction API を使う • Eviction API は PDB を見て 200 か 429 を返す • Pod は別ノードに再スケジュールされる • 以下にて進行を制御できる ◦ evicting pod default/api-2 # 内部で呼んでいるもの POST /api/v1/namespaces/NS/pods/NAME/eviction バッチでドレインするノードの絶対数。 # PDB に余裕がなければ HTTP/1.1 429 Too Many Requests BATCH_PERCENT ▪ ◦ evicting pod default/api-1 BATCH_NODE_COUNT ▪ ◦ node/node-a already cordoned バッチでドレインするノードの割合 BATCH_SOAK_DURATION ▪ 各バッチがドレインされるまでの時間 「同時に何個落としていいか」を決めているのが PodDisruptionBudget です。 Copyright © 3-shake, Inc. All Rights Reserved. 12
03 PodDisruptionBudget(PDB) について Copyright © 3-shake, Inc. All Rights Reserved.
12
PodDisruptionBudget(PDB) とは 「同時に落としていい Pod の数」を宣言するオブジェクトです。 apiVersion: policy/v1 • Eviction API
がこれを見て 200 か 429 を返す kind: PodDisruptionBudget • 見るのは kubectl get pdb の ALLOWED DISRUPTIONS spec: maxUnavailable: 1 ◦ 0 の間は 429 で拒否され、drain は待つ selector: matchLabels: app: "api" 主な設定値 フィールド 意味 値の例 minAvailable 最低これだけ Ready を保つ 2 / 50%(必要数は切り上げ) maxUnavailable 同時に欠けてよい上限 1 / 25% selector 誰を守るか(両方の指定は不可) matchLabels: app=api unhealthyPodEvictionPolicy Ready でない Pod の扱い IfHealthyBudget(既定)/ AlwaysAllow minAvailable と maxUnavailable は同時に指定できません。次の 3 枚で、この設定を変えると何が変わるかをみていきます。 Copyright © 3-shake, Inc. All Rights Reserved. 14
パターンA:PDB なし 前提: replicas: 3 / Blue 3 ノード →
Green 3 ノード / Pod は 1 ノードに 1 つ PDB : なし Blue(旧ノード・cordon 済み) Green(新ノード) P1 P2 P3 P1' P2' P3' node-a node-b node-c node-x node-y node-z 3 つが立て続けに Terminating • PDB が設定されていないため、drain を誰も止めない • drain は代替 Pod(P1') が Ready になるのを待たない ◦ • どれもまだ Ready ではない 薄い = Terminating 破線 = 起動中(まだ Ready でない) 青枠 = Ready node-a の次に node-b、次に node-c と進行してしまう Ready な Pod が 0 になる瞬間ができる可能性がある Copyright © 3-shake, Inc. All Rights Reserved. # PDB がないので待つ理由がない Eviction(P1) 200 / Eviction(P2) 200 / ... 15
パターン B:maxUnavailable: 1 前提: replicas: 3 / Blue 3 ノード
→ Green 3 ノード / Pod は 1 ノードに 1 つ PDB : maxUnavailable: 1 Blue(旧ノード・cordon 済み) Green(新ノード) P1 P2 P3 P1' node-a node-b node-c node-x 欠けているのは 1 つだけ • maxUnavailable 1 により、同時に退避できるのは 1 つ • P1' が Ready になるまで次の drain は進行しない • → 常に Pod 2 つを Ready に保つことが可能 node-y node-z P1' が Ready になるまで次は進まない Eviction(P1) -> 200 OK -> P1 Terminating -> P1' を Green に置く -> pull -> 起動 -> Ready -> allowed が 1 に回復 -> Eviction(P2) …… 以下ループ Copyright © 3-shake, Inc. All Rights Reserved. 16
パターン C:minAvailable: 3(replicas と同数) 前提: replicas: 3 / Blue 3
ノード → Green 3 ノード / Pod は 1 ノードに 1 つ PDB : minAvailable: 3 Blue(旧ノード・cordon 済み) Green(新ノード) P1 P2 P3 node-a node-b node-c node-x 1 つも薄くならない = Pod が消えない 「Pod が Terminating にならない」 node-y node-z 空のまま = 代替 Pod が作られない $ kubectl get pdb NAME MIN AVAILABLE • minAvailable が replicas と同じ = 1 つも落とせない ALLOWED DISRUPTIONS • minAvailable: 100% / maxUnavailable: 0 も同じ結果 service-a 10 MAX UNAVAILABLE AGE N/A 5 4y143d kubectl get pdb で事前に ALLOWED DISRUPTIONS の確認推奨 HPA で台数が減ったときも、そのタイミングだけ同じことが起きます。 Copyright © 3-shake, Inc. All Rights Reserved. 17
PDB の勘所 設定の選び方 • • maxUnavailable を使う ◦ 最低稼働 Pod
数が決まっていない ◦ minAvailable は replicas が減ると厳しくなる ◦ maxUnavailable は減っても 0 にならない 事前に見るもの • ALLOWED DISRUPTIONS が 0 のもの • HPA の minReplicas と PDB の必要数 ◦ 同じなら、その時間帯だけ allowed が 0 になる パーセント指定を活用する ◦ HPA で Pod 数が変動する場合に有効 Copyright © 3-shake, Inc. All Rights Reserved. 18
05 まとめ Copyright © 3-shake, Inc. All Rights Reserved. 18
まとめ ① PDB の設定が、Pod の動き方を決める なし=一斉に落ちる/maxUnavailable: 1=1 つずつ/replicas と同数=止まる ②
みるのは ALLOWED DISRUPTIONS 0 のもの、そして HPA の下限で 0 になるものを探す $ kubectl get pdb -A # ALLOWED DISRUPTIONS が 0 のものを探す $ kubectl get hpa -A # minReplicas と PDB の必要数が同じものを探す Copyright © 3-shake, Inc. All Rights Reserved. 21
ご清聴ありがとうございました! Copyright © 3-shake, Inc. All Rights Reserved. 20