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
プロダクションレディを目指した Kubernetes クラスタのアップグレード戦略/Strat...
Search
Shunya Murata
March 26, 2020
Technology
4.5k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プロダクションレディを目指した Kubernetes クラスタのアップグレード戦略/Strategy to upgrade Kubernetes clusters in Production
Shunya Murata
March 26, 2020
More Decks by Shunya Murata
See All by Shunya Murata
Kubernetes v1.19 Updates
shmurata
3
1.4k
KubeConEU 2019 recap - VPA in-place update
shmurata
3
2.6k
Kubernetes上でアプリケーションを 運用するまでの道のり/The way to run applications with Kubernetes
shmurata
15
3k
Kubernetes Operator で実現する NoOps の世界 / How we accomplish NoOps by Kubernetes Operator.
shmurata
20
4.3k
180715-line-meetup.pdf
shmurata
3
1.1k
ThirdPartyResource を使った Kubernetes as a Service の実装
shmurata
2
3.4k
Other Decks in Technology
See All in Technology
GoCon2026 - Open Source, Open World
sanposhiho
4
4.1k
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
160
AIネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
280
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
500
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
1
1.1k
MCPをつなげて作る組織横断のAIエージェント基盤(の開発工程)
tsubakimoto_s
0
110
Amazon Quick on DesktopがIAM Identity Centerで動かない理由
yukiogawa
0
190
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.8k
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
2
650
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
1
830
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
340
Gitは怖い?共有ワークスペースから始めるSnowflakeチーム開発
coco_se
0
210
Featured
See All Featured
Done Done
chrislema
186
16k
WCS-LA-2024
lcolladotor
0
830
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
790
Optimising Largest Contentful Paint
csswizardry
37
4k
Chasing Engaging Ingredients in Design
codingconduct
0
310
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Transcript
プロダクションレディを⽬指した Kubernetes クラスタのアップグレード戦略 Kubernetes Meetup Tokyo #29 / March 26,
2020 Shunya Murata <
[email protected]
> @shmurata_
▶ アジェンダ 1. Kubernetes のアップグレードに必要な作業 2. Kubernetes のアップグレード戦略 3. アップグレードの⾃動化
2
Shunya Murata / @shmurata_ ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 3
▶ 前提条件 ▶ ゼットラボ株式会社はヤフー株式会社の⼦会社です + ヤフーの次世代のインフラを設計・開発する会社として2015年に設⽴ ▶ 今回の話はゼットラボがヤフーにKubernetesを導⼊して運⽤した際の話になり ます +
ヤフーでは現在300以上のKubernetesクラスタがあり、それをアップグレード していく際に実施した内容になります + ⾃分の⽴場的にKubernetesの運⽤者というよりKubernetesを提供するプラッ トフォームの管理者という⽴ち位置の視点の話なのでご了承ください 4
▶ このスライドの⾊の意味 ▶ ⼀般的に実施しているであろう内容 ▶ 社内で実施している内容 5
Kubernetes のアップグレードに必要 な作業
▶ Kubernetesのアップグレードの必要作業 ▶ 準備 + Kubernetesの変更点調査 + テスト + アップグレード計画策定
+ リリースノート作成・周知 ▶ 実施 + クラスタのアップグレード + ストレージバージョンの更新 + マニフェストの更新 7
▶ Kubernetes のリリースサイクルとサポート期間 ▶ マイナーバージョンは3ヶ⽉に1回リリース + 年4回 ▶ 公式のサポート期間は最新3マイナーバージョン +
3/26時点だと1.18, 1.17, 1.16 + LTSは working group ができたが具体的な話までは進んでいないようです + https://github.com/kubernetes/community/tree/master/wg-lts 8
▶ Kubernetesの変更点調査(1/2) ▶ ChangeLog調査 + https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG + Major Themes +
Known Issues/Urgent Upgrade Notes + Deprecations and Removals/Metrics Changes/API Changes + Notable Features/Other notable changes + 現在だと巨⼤になり過ぎていて調査が⼤変 + 複数⼈で専⾨分野を持って調査 + Qiita で調査内容を公開中: https://qiita.com/shmurata/items/55acb85f60e5e8d19500 9
▶ Kubernetesの変更点調査(2/2) ▶ コンポーネントのパラメータ変更点調査 + パラメータレベルでdiffをとって変更点をチェック ▶ API 変更点調査 +
APIリストのdiffをとって追加削除をチェック + https://github.com/zlabjp/kubernetes-scripts/blob/master/apiversion2resources 10
▶ Kubernetes 以外も更新していく必要がある ▶ OS + コンテナランタイム + CNI ▶
アドオン + CoreDNS + metrics-server + IngressController + Prometheus/Grafana/AlertManager + kube-state-metrics/node-exporter/blackbox-exporter 11
▶ Kubernetesのマイナーバージョンに合わせてまとめて更新 ▶ すべて適宜更新することは⾼コスト ▶ 定期的に⾒直す機会作るように + Kubernetesマイナーバージョンに合わせてバージョンアップ + OSイメージにまとめてアップグレード
+ アドオン⼀式をまとめてコンテナにしてアップグレード + もちろん不具合修正などは適宜実施 12
▶ テスト ▶ Conformance test + Sonobuoy: https://github.com/vmware-tanzu/sonobuoy + 当時の使い勝⼿と更新タイミングの問題で独⾃にビルド
+ https://github.com/zlabjp/kube-conformance ▶ クラスタアップグレードの e2e ▶ アドオンの e2e ▶ ⻑期稼働試験 + 全マイナーバージョンの検証クラスタを常時稼働 13
▶ アップグレード計画策定 ▶ クラスタで動作しているアプリケーションを⽌めずに実施できるか? ▶ クラスタ全体を⽌めずに実施できるか? ▶ アップグレード前後に実施すべき内容があるか? ▶ ユーザへの影響があるか?
14
▶ リリースノート作成 ▶ ユーザに影響のある部分のみ抜粋して社内限定のリリースノートを作成して公開 + アップグレード前後に実施すべき内容があるか? + ユーザに影響がある変更点はあるか? ▶ マニフェストのlinterの更新
+ 設定すべき項⽬(resource.requests, probe など) + 廃⽌予定となったAPIバージョン 15
▶ マスターコンポーネントのアップグレード ▶ ノード のアップグレード ▶ アドオンのアップグレード ▶ マニフェストのアップグレード 16
▶ Kubernetesクラスタのアップグレード作業
▶ Kubernetesクラスタのアップグレードの細かい注意点(1/2) ▶ マスター < ノードにならないようにマスターから先にアップグレード + 詳しいコンポーネントバージョン間依存関係はこちらを + https://kubernetes.io/docs/setup/release/version-skew-policy/
+ すべての マスターのアップグレードが完了したらノードを + アップグレード中も依存関係を満たす必要がある ▶ マスターはマイナーバージョンをスキップするのはサポート外 + ノードは2個下のマイナーバージョンまでサポート + ただし永続的に2バージョンまたぐのは⾮推奨と明記されている + https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-component-upgrade-order 17
▶ Kubernetesクラスタのアップグレードの細かい注意点(2/2) ▶ ストレージバージョンを上げる必要があることも + Etcd に保存されているリソースのスキーマのバージョン + update-storage-objects.sh +
kube-storage-version-migrator ▶ Etcd も推奨バージョンがあるので合わせてアップグレード + https://kubernetes.io/docs/setup/release/notes/#dependencies 18
▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) + PodDisruptionBudget + Pod をグレースフルにダウンさせるには
+ プロダクションレディ Pods+ + Kubernetes: 詳解 Pods の終了 ▶ リソースを減らさないようにアップグレード + ノードを追加して削除を繰り返していく + ノードの数に⽐例して時間がかかる Kubernetes Cluster Operator ノード C ノード B ノード A drain 追加 19 ▶ Kubernetes ノードのアップグレード
アップグレード戦略
▶ Kubernetes クラスタのアップグレード要件 ▶ アップグレード中の要件 + サービス全体でダウンタイムが発⽣しない + 稼働中の全体リソースは減らない +
Masterコンポーネントは極⼒ダウンタイムが発⽣しない + contorller-manager, scheduler などはリーダー交代中の停⽌は許容 ▶ ローカルディスクの内容は保持しなくても良い 21
▶ Kubernetes クラスタのアップグレード戦略 ▶ ライブアップグレード ▶ ブルーグリーンアップグレード 22
▶ ライブアップグレード ▶ サービス稼働中のクラスタをサービスインしたままアップグレードする⽅式 + 新バージョンのノードを追加して動作確認が取れたら旧バージョンのノード を削除する + 稼働したままアップグレードできるので運⽤コストを低くしやすい +
⼀度に追加するノード数(Surge) の数を増やせばその分リソースが必要になる + 1台 から100%まで + 数を増やせばアップグレードの速度は向上 23
▶ ライブアップグレード例(v1.17 -> v1.18) 24 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のノードグループ v1.18のノードグループ
▶ ライブアップグレード例(v1.17 -> v1.18) 25 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ Surge分(今回は1)だけ新バージョンのノードを追加
▶ ライブアップグレード例(v1.17 -> v1.18) 26 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
▶ ライブアップグレード例(v1.17 -> v1.18) 27 v1.17ノード C v1.17ノード B v1.17のノードグループ
v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ 同様に終わるまでSurgeの数だけ新バージョンのノードを追加
▶ ライブアップグレード例(v1.17 -> v1.18) 28 v1.17ノード C v1.17ノード B v1.17のノードグループ
v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
▶ ライブアップグレード例(v1.17 -> v1.18) 29 v1.17ノード C v1.17のノードグループ v1.18のノードグループ v1.18ノード
A’ v1.18ノード B’ v1.18ノード C’ 同様に終わるまでSurgeの数だけ新バージョンのノードを追加
▶ ライブアップグレード例(v1.17 -> v1.18) 30 v1.17ノード C v1.17のノードグループ v1.18のノードグループ v1.18ノード
A’ v1.18ノード B’ v1.18ノード C’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
▶ ライブアップグレード例(v1.17 -> v1.18) 31 v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード
B’ v1.18ノード C’ すべてのノードがv1.18になりアップグレード完了
▶ ブルーグリーンアップグレード ▶ 既存のクラスタをアップグレードするのではなく新規にクラスタを構築して切 り替える⽅式 + アップグレード後にマスターコンポーネントの不具合などがあった場合でも ロールバックが容易 + クラスタ2台分のリソースが必要
32
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 33 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のクラスタ LB
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 34 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のクラスタ v1.18のクラスタ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ LB
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 35 v1.17ノード C v1.17ノード B v1.17ノード
A v1.17のクラスタ v1.18のクラスタ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ LB
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 36 v1.18のクラスタ v1.18ノード A’ v1.18ノード B’
v1.18ノード C’ LB
▶ Kubernetes クラスタのアップグレード戦略まとめ 37 ҆શੑ Ϧιʔε ӡ༻ίετ ϥΠϒΞοϓάϨʔυ ˚ Ϛελʔίϯϙʔωϯτ
+ ϊʔυ * (N + surge) ̋ ϒϧʔάϦʔϯΞοϓάϨʔυ ̋ Ϛελʔίϯϙʔωϯτ * 2 + ϊʔυ * 2 * N ˚
▶ マネージドサービスのクラスタアップグレード ▶ ドキュメントを⾒た限りでは以下のマネージドサービスも同様の⽅式でアップ グレードをサポート + 注意:実際に試したわけではないため詳細は以下のドキュメントを参照下さ い ▶ GKE:
https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-upgrades ▶ EKS: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/update-cluster.html ▶ AKS: https://docs.microsoft.com/ja-jp/azure/aks/upgrade-cluster 38
▶ Z Lab / Yahoo! JAPAN の例 ▶ ほぼライブアップグレードのみ +
Kubernetes ⾃体のアップグレードが原因で事故になったことはない + メトリクス名の変更でアラートが上がらないとかはあった + ノードのローリングアップデートがトリガーになって発⽣する事故は多々あ る + 基本的にはプロダクションレディなPodになっていないことが多かった + ⽉⼀回程度ノードのローリングアップデートを実施するようにしているの でユーザが徐々に慣れてきている + グレースフルシャットダウンのノウハウも溜まってきている + クラスタ⾃体よりアドオンの更新のほうが事故になる + Ingress controller / CoreDNS 39
▶ ライブアップグレードで発覚している問題点と対応 ▶ Podの無駄な移動が発⽣することがある + ノードの削除時に削除予定のノードにスケジュールされると2回移動すること に + 削除予定のノードにTaintsを付与してスケジュールされにくく ▶
アップグレードの時間がかかる + ノード数が多いとその分時間がかかる + Surgeの調整 + ⼀⻫にアップグレードが発⽣するとアップグレードがスタックする + IaaS 側が詰まってしまう + IaaSのパフォーマンス向上を検討中 40
アップグレードの⾃動化
▶ クラスタのアップデート作業の⾃動化 ▶ ノードの更新 + https://kccncna19.sched.com/event/UaYz/handling-risky-business-cluster- upgrades-puneet-pruthi-lyft + Kubernetes Cluster
Operator ▶ アドオンの更新 + addon-manager + addon-managerに渡すアドオンのマニフェストをパッケージ化して配布 + ⾃作コントローラで Kubernetes のバージョンに応じて⾃動配布 ▶ ストレージバージョンの更新 + ⾃作コントローラでマイナーバージョンの更新に対応して⾃動実⾏ 42
▶ Kubernetes Cluster Operator ▶ Kubernetes クラスタを管理する Operator + クラスタの作成、削除、更新を⾃動化
+ アップグレードコストの最⼩化を⽬的に開発 ▶ 過去の発表 + https://speakerdeck.com/shmurata/how-we-accomplish-noops-by-kubernetes-operator + https://speakerdeck.com/shmurata/thirdpartyresource-woshi-tuta-kubernetes-as-a- service-falseshi-zhuang 43
▶ アドオンの管理 ▶ addon-manager + https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/ addon-manager + 指定されたディレクトリに配置されたマニフェストを apply
し続ける + prune もするのでディレクトリのマニフェストを削除すればリソースも削 除される ▶ addon-updater + addon-manager が参照するディレクトリにあるマニフェストを⾃動更新する ⾃作コントローラ + すべてのマスターノードのバージョンが⼀致したらそのバージョンに合わせて アドオンのマニフェストを更新する 44
▶ ストレージバージョンの更新 ▶ update-storage-objects.sh + ストレージバージョンを更新するためにすべてのオブジェクト更新し直すス クリプト + 公式ではもう削除されてしまった。。。 +
https://github.com/kubernetes/kubernetes/pull/83969 + 後継(kube-storage-version-migrator)が作られているがまだ alpha? ▶ uso-runner + https://github.com/zlabjp/update-storage-objects を⾃動的に実⾏する⾃作コ ントローラ + すべてのマスターノードのバージョンが⼀致したら update-storage- objects.sh を実⾏する 45
▶ 導⼊してみた効果 ▶ アップグレードコストの最⼩化により健全な状態を維持できている + 全クラスタサポートバージョン範囲内(1.16以上) ▶ 300以上オンプレでのKubernetes クラスタの運⽤と提供のコスト削減 +
開発、運⽤、サポート、教育で20から30名程度でできるように ▶ OS移⾏やIaaSのアップグレードなども利⽤者に⼤きな影響を与えることなく実 施できるようになった + クラスタのスケールアップなども容易に ▶ オペレーションミスによる障害はほとんど発⽣していない 46
まとめ
▶ まとめ ▶ Kubernetes のアップグレード + 定期的なアップグレードが必須 + Kubernetes以外もあるので定期的にチェックして更新する体制を ▶
アップグレード戦略 + ⾊んな⽅法があるが⼀⻑⼀短 + 環境や要件に合わせて選ぶとよい ▶ ⾃動化 + ⼤規模になってくるとほぼ必須 + オペレーションミスを防ぐためにもコストに⾒合うなら実施を推奨 + Operatorパターンを利⽤すると容易に安定した⾃動化が実現できる 48