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
CKE で始める!はじめての Kubernetes クラスタインプレースアップグレード
Search
Cybozu
PRO
February 27, 2020
Technology
0
3k
CKE で始める!はじめての Kubernetes クラスタ インプレースアップグレード
Cybozu
PRO
February 27, 2020
Tweet
Share
More Decks by Cybozu
See All by Cybozu
AIツール開発ワークショップ(Dify)【サイボウズ新人研修2025】
cybozuinsideout
PRO
19
19k
モバイル【サイボウズ新人研修2025】
cybozuinsideout
PRO
3
3.5k
Git/GitHub を使う上で知っておくと嬉しいかも Tips【サイボウズ新人研修2025】
cybozuinsideout
PRO
12
9.2k
GitHub Copilot活用【サイボウズ新人研修2025】
cybozuinsideout
PRO
14
13k
ソフトウェアライセンス【サイボウズ新人研修2025】
cybozuinsideout
PRO
12
7.9k
エンジニアのためのアウトプット講座 〜知識をシェアするはじめの一歩〜【サイボウズ新人研修2025】
cybozuinsideout
PRO
7
4.3k
Docker入門【サイボウズ新人研修2025】
cybozuinsideout
PRO
12
11k
セキュリティ【サイボウズ新人研修2025】
cybozuinsideout
PRO
2
3.1k
TLS 1.3をざっと理解する【サイボウズ新人研修2025】
cybozuinsideout
PRO
2
1.9k
Other Decks in Technology
See All in Technology
UDDのススメ - 拡張版 -
maguroalternative
1
350
SRE新規立ち上げ! Hubbleインフラのこれまでと展望
katsuya0515
0
170
JAWS AI/ML #30 AI コーディング IDE "Kiro" を触ってみよう
inariku
3
330
Claude Codeは仕様駆動の夢を見ない
gotalab555
23
5.6k
AIエージェントを現場で使う / 2025.08.07 著者陣に聞く!現場で活用するためのAIエージェント実践入門(Findyランチセッション)
smiyawaki0820
6
830
MCP認可の現在地と自律型エージェント対応に向けた課題 / MCP Authorization Today and Challenges to Support Autonomous Agents
yokawasa
5
2k
LLMで構造化出力の成功率をグンと上げる方法
keisuketakiguchi
0
590
隙間時間で爆速開発! Claude Code × Vibe Coding で作るマニュアル自動生成サービス
akitomonam
3
250
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
5
570
Oracle Cloud Infrastructure:2025年7月度サービス・アップデート
oracle4engineer
PRO
1
130
dipにおけるSRE変革の軌跡
dip_tech
PRO
1
240
形式手法特論:位相空間としての並行プログラミング #kernelvm / Kernel VM Study Tokyo 18th
ytaka23
3
1k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Six Lessons from altMBA
skipperchong
28
3.9k
Adopting Sorbet at Scale
ufuk
77
9.5k
How GitHub (no longer) Works
holman
314
140k
The Pragmatic Product Professional
lauravandoore
36
6.8k
Gamification - CAS2011
davidbonilla
81
5.4k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Docker and Python
trallard
45
3.5k
Fireside Chat
paigeccino
38
3.6k
Optimizing for Happiness
mojombo
379
70k
Transcript
Maneki & Neco Meetup CKE で始める︕ はじめての Kubernetes クラスタ インプレースアップグレード
2020-02-18 サイボウズ株式会社 ⽯井 正將 (masa213f)
発表タイトルについてのお詫び ▌チュートリアル的なタイトルですが チュートリアルではありません ▌Neco で実現している Kubernetes クラスタの アップグレード⽅法の説明になります 1
⾃⼰紹介 ▌サイボウズ ⼤阪オフィス勤務 • OSや仮想化に興味があったエンジニア ▌経歴 • 前職では、電機メーカーでOS・仮想化の開発 • 2018/09
サイボウズ キャリア⼊社 • 2019/03 運⽤本部 インフラ刷新プロジェクト Neco へ異動 2
質問 ▌Kubernetes v1.17 がリリースされました。 あなたの環境では Kubernetes v1.16 を使っています。 どうやって、Kubernetes クラスタを更新しますか︖
3 ▌よく聞く⽅法 1. クラスタを新しく⽤意して、丸ごと引っ越し 2. ノードを順番に更新して、ローリングアップグレード
⽅法1: 丸ごと引っ越し ▌クラスタを新しく⽤意して、丸ごと引越し Old 4 New! App App App
⽅法2: ローリングアップグレード ▌ノードを順番に更新し、ローリングアップグレード 5 App App App App App App
App App Old Old Old Old
⽅法2: ローリングアップグレード 1. 更新したいノードを kubectl drain ØPod が退去 (evict) &
そのノードへの Pod の配置が停⽌ 6 App App App App App App Old Old Old Old App App 更新したい kubectl drain
⽅法2: ローリングアップグレード 2. ノードの更新 7 App App App App App
App Old Old Old Old⇨New App App Pod動きません
⽅法2: ローリングアップグレード 3. ノードの更新が終わったら kubectl uncordon Øノード上で Pod が動作可能になる 8
App App App App App App Old Old Old New App App Kubectl uncordon
⽅法2: ローリングアップグレード 9 App App App App Old Old Old
New App App App App kubectl drain ▌これをノードの数だけ繰り返す • アプリケーションはいずれかのノード上で動作 Øサービス無停⽌で更新できる
これらの⽅法 ▌⽅法1、2は ノードのローカルストレージに データが保存されていない場合はうまくいく ▌Neco の Kubernetes クラスタは 少し事情が異なる Ø⾃社製
Kubernetes 管理ツール CKE で In-place Upgrade 10
CKE とは (Cybozu Kubernetes Engine) ▌サイボウズで開発している OSS ▌Kubernetes クラスタの構築と運⽤を⾃動化するソフトウェア ▌Kubernetes
Conformance Software に認定 詳しく知りたい⽅は、以下を参照ください。 n GitHub Ø https://github.com/cybozu-go/cke n CKEがKubernetes Conformance Softwareに認定されました – Cybozu Inside Out Ø https://blog.cybozu.io/entry/cke 11
Neco の Kubernetes ▌Storage on Kubernetes Øローカルストレージを多⽤する 2種類のサーバで構成 (CS、SS合わせて、1クラスタ数千台 ×
3 クラスタ) 1. CS (Compute Server) • ⾼速な CPU、SSD • AP サーバ、DBサーバ (更新頻度の⾼いデータを保存) として利⽤ 2. SS (Storage Server) • ⼤量の HDD • S3 互換のオブジェクトストレージ (更新頻度の低いデータを保存) として利⽤ 12
Neco のアップグレード要件 ▌Neco の Kubernetes には⼤量のデータ • アップグレードの度に サーバ間 and/or
クラスタ間で データのコピーはしたくない (ネットワークの負荷も上がるし、ディスクの寿命も縮まる) 13
Neco のアップグレード要件 ▌Neco の Kubernetes には⼤量のデータ • kubectl drain で
Pod を退去するとデータのコピーが不可避 Ø数千台のノードで、データをキャッチボールことに…… 14 data data Pod Pod ⼼機⼀転︕ 頑張るぞ︕ データも 送るよー︕ kubectl drain data data データないっす ⾃分も空っす Old Old Old⇨New
Neco のアップグレード要件 ▌クラスタのアップグレードでアプリケーションを⽌めたくない • 好きなタイミングで、⾃由に更新したい (夜は寝ていたい) 15
Neco のアップグレード要件 ▌Kubernetes は 3ヶ⽉に1度 マイナーアップデート • 陳腐化を防ぐために、追従していきたい Ø数千台のノードを、 3ヶ⽉毎に更新……
16
Neco のアップグレード要件 ▌まとめると 1. Eviction-free な In-place Upgrade • クラスタの作り直しなし
• ノードの⼊替なし • Pod の退去 (evict) なし 2. 加えて、(できるだけ) クラスタ無停⽌ 3. さらに加えて、(頻度が⾼いので) ⾃動化したい 17
Neco の構成 OS (Ubuntu) 管理サーバ (3〜5台) サーバ管理ツール (Sabakan) Kubernetes 管理ツール
(CKE) Kubernetes ノード (数千台規模) マネージドサービス (ロードバランサー、モニタリング、データベースなど) ▌ざっくりとこんな構成 Neco Maneki + 製品開発 チーム 18 OS (CoreOS) アプリケーション (サイボウズ製品) サーバ (CS) サーバ (CS) サーバ (SS) サーバ (SS) OS (CoreOS) OS (CoreOS) OS (CoreOS)
どこをアップグレードしたい︖ ▌⼤まかに分類すると4種類 1. Pod (Kubernetes ワークロード) • マネージドサービス 2. Kubernetes
• Kubernetes コンポーネント 3. OS 4. (サーバの) ファームウェア 19 今⽇はココの説明
こいつを Kubernetes のアップグレード OS (Ubuntu) 管理サーバ (3〜5台) サーバ管理ツール (Sabakan) Kubernetes
管理ツール (CKE) Kubernetes ノード (数千台規模) マネージドサービス (ロードバランサー、モニタリング、データベースなど) ▌CKE で更新する 20 OS (CoreOS) アプリケーション (サイボウズ製品) サーバ (CS) サーバ (CS) サーバ (SS) サーバ (SS) OS (CoreOS) OS (CoreOS) OS (CoreOS) こいつが
Kubernetes の構成 ▌⼤きく分けると2種類のノード 1. Masterノード (3〜7台) • クラスタ全体を管理 (etcd /
kube-apiserver / kube-scheduler / kube-controller-manager ) 2. Workerノード (たくさん) • アプリケーション (Pod) の実⾏環境 ( kubelet / kube-proxy ) 21
Master (3) Master (2) etcd Master (1) Masterノードの構成 apiserver ▌Neco
では以下のように、Master ノードを冗⻑ • Master コンポーネントをセットで冗⻑化 • リバースプロキシ で、etcd / kube-apiserver へのアクセスをバランス 22 scheduler controller-manager リバプロ etcd apiserver etcd apiserver リバプロ リバプロ リバプロ リバプロ リバプロ scheduler controller-manager scheduler controller-manager
Master (3) Master (2) etcd Master (1) Masterノードのアップグレード apiserver ▌scheduler
と controller-manager はそれぞれリーダー選出 Ø⼀時的にコンポーネントがダウンしても、問題なし 23 scheduler controller-manager リバプロ etcd apiserver etcd apiserver リバプロ リバプロ リバプロ リバプロ リバプロ scheduler controller-manager scheduler controller-manager
Master (3) Master (2) etcd Master (1) Masterノードのアップグレード apiserver ▌etcd
と apiserver はリバースプロキシで宛先を調整 Øこちらも、⼀時的にコンポーネントがダウンしても、問題なし 24 scheduler controller-manager リバプロ etcd apiserver etcd apiserver リバプロ リバプロ リバプロ リバプロ リバプロ scheduler controller-manager scheduler controller-manager
Masterノードのアップグレード ▌Master ノードの冗⻑化 & リバースプロキシでの経路制御 • Master コンポーネントが⼀時的にダウンしても Kubernetes クラスタの管理に影響はない
ØMaster ノードを順番に更新していけばよい 25
Pod Workerノードの構成 ▌Neco の Workerノードの構成 • リバースプロキシで Masterノード (kube-apiserver) へのアクセスを調整
ØMaster が少しダウンしても問題なし 26 OS Worker ノード (たくさん) kube-proxy kubelet ipvs コンテナ コンテナ コンテナランタイム (containerd) コンテナ Pod リバプロ Master (1) Master (2) Master (3)
Pod Workerノードのアップグレード ▌Kubernetes 上でアプリケーションが動く、と⾔うけれど どちらかというと、横からから⼩突いている 27 OS Worker ノード (たくさん)
kube-proxy kubelet ipvs コンテナ コンテナ コンテナランタイム (containerd) コンテナ Pod リバプロ Master (1) Master (2) Master (3) 起動/終了/監視 ルーティング設定
Workerノードのアップグレード ▌Kubernetes コンポーネントと Pod は別プロセス • Kubernetes コンポーネントが⼀時的にダウンしても Pod の動作に直ちに影響はない
Øダウンタイムを最⼩限にして、Pod に影響がでる前に 新しい kubelet / kube-proxy に⼊れ替えればいい 28
Workerノードのアップグレード ▌CKE では Kubernetes コンポーネントを Docker で起動 • 新しいコンテナイメージを事前に Pull
• 折を⾒て再起動 Øコンポーネントの再起動は⼗数秒、すぐにアップグレード完了 アプリケーションへの影響もなく、ノードの⼊替も不要 29
In-place Upgrade の注意点 ▌ただし • アップグレード前後で、⾮互換の変更があった場合 単純な再起動では済まないケースがある • その場合は、⾃⼒で頑張るしかない ▌Neco
の場合は 1. CKE が⾃社製ツールのため、改修が容易 2. 仮想クラスタ & Stage環境 でアップグレード試験を実施 Øだから、In-place Upgrade にチャレンジできている 30
まとめ • Neco は Storage on Kubernetes • ⾃社製ツール CKE
で Kubernetes クラスタの In-place Upgrade を実現 Øアプリケーションへの影響を最⼩限に Kubernetes クラスタをアップグレードできる 31
補⾜スライド
ココ Pod のアップグレード OS (Ubuntu) 管理サーバ (3〜5台) サーバ管理ツール (Sabakan) Kubernetes
管理ツール (CKE) Kubernetes ノード (数千台規模) マネージドサービス (ロードバランサー、モニタリング、データベースなど) ▌Neco のマネージドサービス (アプリケーションは管轄外) 33 OS (CoreOS) アプリケーション (サイボウズ製品) サーバ (CS) サーバ (CS) サーバ (SS) サーバ (SS) OS (CoreOS) OS (CoreOS) OS (CoreOS)
Pod のアップグレード ▌Neco のマネージドサービス • Kubernetes 的なやり⽅で頑張る 34
こいつを OS のアップグレード OS (Ubuntu) 管理サーバ (3〜5台) サーバ管理ツール (Sabakan) Kubernetes
管理ツール (CKE) Kubernetes ノード (数千台規模) マネージドサービス (ロードバランサー、モニタリング、データベースなど) ▌Sabakan によるプロビジョニング 35 OS (CoreOS) アプリケーション (サイボウズ製品) サーバ (CS) サーバ (CS) サーバ (SS) サーバ (SS) OS (CoreOS) OS (CoreOS) OS (CoreOS) こいつが
OS のアップグレード ▌Sabakan によるプロビジョニング • Core OS をネットワークブート • Ignition
でノード別に設定をカスタマイズ Øノードを再起動するだけで、OS が新しくなる︕ ▌ただし、再起動の間は そのノード上で動くアプリケーションのタウンタイムが発⽣ Øデータの冗⻑化 & Pod の分散配置で対応 36
データの冗⻑化 & Pod の分散配置 ▌DB でクラスタを組み、データを冗⻑化 • Rook/Ceph、Elasticsearh、MySQL のクラスタ ▌ただ、それだけでは不⼗分
ØPod の配置に偏りがでるかもしれない ノード1 カン︕ 37 Pod data Pod data Pod data Pod data ノード2 ノード3 ノード4
データの冗⻑化 & Pod の分散配置 ▌Topology Spread Constraints (Kubernetes v1.16〜) •
複数の Failure domain に Pod を分散配置 Øノードを再起動しても問題なし、耐障害性も向上 ラック1 ラック2 ラック3 ラック4 ラック1がやられたようだな やつは最弱 38 data data data data
ココ ファームウェアのアップグレード OS (Ubuntu) 管理サーバ (3〜5台) サーバ管理ツール (Sabakan) Kubernetes 管理ツール
(CKE) Kubernetes ノード (数千台規模) マネージドサービス (ロードバランサー、モニタリング、データベースなど) ▌ファームウェアアップグレードの⾃動化はこれから…… 39 OS (CoreOS) アプリケーション (サイボウズ製品) サーバ (CS) サーバ (CS) サーバ (SS) サーバ (SS) OS (CoreOS) OS (CoreOS) OS (CoreOS)