プロダクションレディを目指した Kubernetes クラスタのアップグレード戦略/Strategy to upgrade Kubernetes clusters in Production
by
Shunya Murata
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
プロダクションレディを⽬指した Kubernetes クラスタのアップグレード戦略 Kubernetes Meetup Tokyo #29 / March 26, 2020 Shunya Murata @shmurata_
Slide 2
Slide 2 text
▶ アジェンダ 1. Kubernetes のアップグレードに必要な作業 2. Kubernetes のアップグレード戦略 3. アップグレードの⾃動化 2
Slide 3
Slide 3 text
Shunya Murata / @shmurata_ ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 3
Slide 4
Slide 4 text
▶ 前提条件 ▶ ゼットラボ株式会社はヤフー株式会社の⼦会社です + ヤフーの次世代のインフラを設計・開発する会社として2015年に設⽴ ▶ 今回の話はゼットラボがヤフーにKubernetesを導⼊して運⽤した際の話になり ます + ヤフーでは現在300以上のKubernetesクラスタがあり、それをアップグレード していく際に実施した内容になります + ⾃分の⽴場的にKubernetesの運⽤者というよりKubernetesを提供するプラッ トフォームの管理者という⽴ち位置の視点の話なのでご了承ください 4
Slide 5
Slide 5 text
▶ このスライドの⾊の意味 ▶ ⼀般的に実施しているであろう内容 ▶ 社内で実施している内容 5
Slide 6
Slide 6 text
Kubernetes のアップグレードに必要 な作業
Slide 7
Slide 7 text
▶ Kubernetesのアップグレードの必要作業 ▶ 準備 + Kubernetesの変更点調査 + テスト + アップグレード計画策定 + リリースノート作成・周知 ▶ 実施 + クラスタのアップグレード + ストレージバージョンの更新 + マニフェストの更新 7
Slide 8
Slide 8 text
▶ 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
Slide 9
Slide 9 text
▶ 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
Slide 10
Slide 10 text
▶ Kubernetesの変更点調査(2/2) ▶ コンポーネントのパラメータ変更点調査 + パラメータレベルでdiffをとって変更点をチェック ▶ API 変更点調査 + APIリストのdiffをとって追加削除をチェック + https://github.com/zlabjp/kubernetes-scripts/blob/master/apiversion2resources 10
Slide 11
Slide 11 text
▶ Kubernetes 以外も更新していく必要がある ▶ OS + コンテナランタイム + CNI ▶ アドオン + CoreDNS + metrics-server + IngressController + Prometheus/Grafana/AlertManager + kube-state-metrics/node-exporter/blackbox-exporter 11
Slide 12
Slide 12 text
▶ Kubernetesのマイナーバージョンに合わせてまとめて更新 ▶ すべて適宜更新することは⾼コスト ▶ 定期的に⾒直す機会作るように + Kubernetesマイナーバージョンに合わせてバージョンアップ + OSイメージにまとめてアップグレード + アドオン⼀式をまとめてコンテナにしてアップグレード + もちろん不具合修正などは適宜実施 12
Slide 13
Slide 13 text
▶ テスト ▶ Conformance test + Sonobuoy: https://github.com/vmware-tanzu/sonobuoy + 当時の使い勝⼿と更新タイミングの問題で独⾃にビルド + https://github.com/zlabjp/kube-conformance ▶ クラスタアップグレードの e2e ▶ アドオンの e2e ▶ ⻑期稼働試験 + 全マイナーバージョンの検証クラスタを常時稼働 13
Slide 14
Slide 14 text
▶ アップグレード計画策定 ▶ クラスタで動作しているアプリケーションを⽌めずに実施できるか? ▶ クラスタ全体を⽌めずに実施できるか? ▶ アップグレード前後に実施すべき内容があるか? ▶ ユーザへの影響があるか? 14
Slide 15
Slide 15 text
▶ リリースノート作成 ▶ ユーザに影響のある部分のみ抜粋して社内限定のリリースノートを作成して公開 + アップグレード前後に実施すべき内容があるか? + ユーザに影響がある変更点はあるか? ▶ マニフェストのlinterの更新 + 設定すべき項⽬(resource.requests, probe など) + 廃⽌予定となったAPIバージョン 15
Slide 16
Slide 16 text
▶ マスターコンポーネントのアップグレード ▶ ノード のアップグレード ▶ アドオンのアップグレード ▶ マニフェストのアップグレード 16 ▶ Kubernetesクラスタのアップグレード作業
Slide 17
Slide 17 text
▶ 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
Slide 18
Slide 18 text
▶ Kubernetesクラスタのアップグレードの細かい注意点(2/2) ▶ ストレージバージョンを上げる必要があることも + Etcd に保存されているリソースのスキーマのバージョン + update-storage-objects.sh + kube-storage-version-migrator ▶ Etcd も推奨バージョンがあるので合わせてアップグレード + https://kubernetes.io/docs/setup/release/notes/#dependencies 18
Slide 19
Slide 19 text
▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) + PodDisruptionBudget + Pod をグレースフルにダウンさせるには + プロダクションレディ Pods+ + Kubernetes: 詳解 Pods の終了 ▶ リソースを減らさないようにアップグレード + ノードを追加して削除を繰り返していく + ノードの数に⽐例して時間がかかる Kubernetes Cluster Operator ノード C ノード B ノード A drain 追加 19 ▶ Kubernetes ノードのアップグレード
Slide 20
Slide 20 text
アップグレード戦略
Slide 21
Slide 21 text
▶ Kubernetes クラスタのアップグレード要件 ▶ アップグレード中の要件 + サービス全体でダウンタイムが発⽣しない + 稼働中の全体リソースは減らない + Masterコンポーネントは極⼒ダウンタイムが発⽣しない + contorller-manager, scheduler などはリーダー交代中の停⽌は許容 ▶ ローカルディスクの内容は保持しなくても良い 21
Slide 22
Slide 22 text
▶ Kubernetes クラスタのアップグレード戦略 ▶ ライブアップグレード ▶ ブルーグリーンアップグレード 22
Slide 23
Slide 23 text
▶ ライブアップグレード ▶ サービス稼働中のクラスタをサービスインしたままアップグレードする⽅式 + 新バージョンのノードを追加して動作確認が取れたら旧バージョンのノード を削除する + 稼働したままアップグレードできるので運⽤コストを低くしやすい + ⼀度に追加するノード数(Surge) の数を増やせばその分リソースが必要になる + 1台 から100%まで + 数を増やせばアップグレードの速度は向上 23
Slide 24
Slide 24 text
▶ ライブアップグレード例(v1.17 -> v1.18) 24 v1.17ノード C v1.17ノード B v1.17ノード A v1.17のノードグループ v1.18のノードグループ
Slide 25
Slide 25 text
▶ ライブアップグレード例(v1.17 -> v1.18) 25 v1.17ノード C v1.17ノード B v1.17ノード A v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ Surge分(今回は1)だけ新バージョンのノードを追加
Slide 26
Slide 26 text
▶ ライブアップグレード例(v1.17 -> v1.18) 26 v1.17ノード C v1.17ノード B v1.17ノード A v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
Slide 27
Slide 27 text
▶ ライブアップグレード例(v1.17 -> v1.18) 27 v1.17ノード C v1.17ノード B v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ 同様に終わるまでSurgeの数だけ新バージョンのノードを追加
Slide 28
Slide 28 text
▶ ライブアップグレード例(v1.17 -> v1.18) 28 v1.17ノード C v1.17ノード B v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
Slide 29
Slide 29 text
▶ ライブアップグレード例(v1.17 -> v1.18) 29 v1.17ノード C v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ 同様に終わるまでSurgeの数だけ新バージョンのノードを追加
Slide 30
Slide 30 text
▶ ライブアップグレード例(v1.17 -> v1.18) 30 v1.17ノード C v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ 追加したノードが稼働したことを確認できたら旧バージョンのノードを削除
Slide 31
Slide 31 text
▶ ライブアップグレード例(v1.17 -> v1.18) 31 v1.17のノードグループ v1.18のノードグループ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ すべてのノードがv1.18になりアップグレード完了
Slide 32
Slide 32 text
▶ ブルーグリーンアップグレード ▶ 既存のクラスタをアップグレードするのではなく新規にクラスタを構築して切 り替える⽅式 + アップグレード後にマスターコンポーネントの不具合などがあった場合でも ロールバックが容易 + クラスタ2台分のリソースが必要 32
Slide 33
Slide 33 text
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 33 v1.17ノード C v1.17ノード B v1.17ノード A v1.17のクラスタ LB
Slide 34
Slide 34 text
▶ ブルーグリーンアップグレード例(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
Slide 35
Slide 35 text
▶ ブルーグリーンアップグレード例(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
Slide 36
Slide 36 text
▶ ブルーグリーンアップグレード例(v1.17 -> v1.18) 36 v1.18のクラスタ v1.18ノード A’ v1.18ノード B’ v1.18ノード C’ LB
Slide 37
Slide 37 text
▶ Kubernetes クラスタのアップグレード戦略まとめ 37 ҆શੑ Ϧιʔε ӡ༻ίετ ϥΠϒΞοϓάϨʔυ ˚ Ϛελʔίϯϙʔωϯτ + ϊʔυ * (N + surge) ̋ ϒϧʔάϦʔϯΞοϓάϨʔυ ̋ Ϛελʔίϯϙʔωϯτ * 2 + ϊʔυ * 2 * N ˚
Slide 38
Slide 38 text
▶ マネージドサービスのクラスタアップグレード ▶ ドキュメントを⾒た限りでは以下のマネージドサービスも同様の⽅式でアップ グレードをサポート + 注意:実際に試したわけではないため詳細は以下のドキュメントを参照下さ い ▶ 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
Slide 39
Slide 39 text
▶ Z Lab / Yahoo! JAPAN の例 ▶ ほぼライブアップグレードのみ + Kubernetes ⾃体のアップグレードが原因で事故になったことはない + メトリクス名の変更でアラートが上がらないとかはあった + ノードのローリングアップデートがトリガーになって発⽣する事故は多々あ る + 基本的にはプロダクションレディなPodになっていないことが多かった + ⽉⼀回程度ノードのローリングアップデートを実施するようにしているの でユーザが徐々に慣れてきている + グレースフルシャットダウンのノウハウも溜まってきている + クラスタ⾃体よりアドオンの更新のほうが事故になる + Ingress controller / CoreDNS 39
Slide 40
Slide 40 text
▶ ライブアップグレードで発覚している問題点と対応 ▶ Podの無駄な移動が発⽣することがある + ノードの削除時に削除予定のノードにスケジュールされると2回移動すること に + 削除予定のノードにTaintsを付与してスケジュールされにくく ▶ アップグレードの時間がかかる + ノード数が多いとその分時間がかかる + Surgeの調整 + ⼀⻫にアップグレードが発⽣するとアップグレードがスタックする + IaaS 側が詰まってしまう + IaaSのパフォーマンス向上を検討中 40
Slide 41
Slide 41 text
アップグレードの⾃動化
Slide 42
Slide 42 text
▶ クラスタのアップデート作業の⾃動化 ▶ ノードの更新 + https://kccncna19.sched.com/event/UaYz/handling-risky-business-cluster- upgrades-puneet-pruthi-lyft + Kubernetes Cluster Operator ▶ アドオンの更新 + addon-manager + addon-managerに渡すアドオンのマニフェストをパッケージ化して配布 + ⾃作コントローラで Kubernetes のバージョンに応じて⾃動配布 ▶ ストレージバージョンの更新 + ⾃作コントローラでマイナーバージョンの更新に対応して⾃動実⾏ 42
Slide 43
Slide 43 text
▶ 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
Slide 44
Slide 44 text
▶ アドオンの管理 ▶ addon-manager + https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/ addon-manager + 指定されたディレクトリに配置されたマニフェストを apply し続ける + prune もするのでディレクトリのマニフェストを削除すればリソースも削 除される ▶ addon-updater + addon-manager が参照するディレクトリにあるマニフェストを⾃動更新する ⾃作コントローラ + すべてのマスターノードのバージョンが⼀致したらそのバージョンに合わせて アドオンのマニフェストを更新する 44
Slide 45
Slide 45 text
▶ ストレージバージョンの更新 ▶ 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
Slide 46
Slide 46 text
▶ 導⼊してみた効果 ▶ アップグレードコストの最⼩化により健全な状態を維持できている + 全クラスタサポートバージョン範囲内(1.16以上) ▶ 300以上オンプレでのKubernetes クラスタの運⽤と提供のコスト削減 + 開発、運⽤、サポート、教育で20から30名程度でできるように ▶ OS移⾏やIaaSのアップグレードなども利⽤者に⼤きな影響を与えることなく実 施できるようになった + クラスタのスケールアップなども容易に ▶ オペレーションミスによる障害はほとんど発⽣していない 46
Slide 47
Slide 47 text
まとめ
Slide 48
Slide 48 text
▶ まとめ ▶ Kubernetes のアップグレード + 定期的なアップグレードが必須 + Kubernetes以外もあるので定期的にチェックして更新する体制を ▶ アップグレード戦略 + ⾊んな⽅法があるが⼀⻑⼀短 + 環境や要件に合わせて選ぶとよい ▶ ⾃動化 + ⼤規模になってくるとほぼ必須 + オペレーションミスを防ぐためにもコストに⾒合うなら実施を推奨 + Operatorパターンを利⽤すると容易に安定した⾃動化が実現できる 48