Slide 1

Slide 1 text

脱・塩漬け! サステナブルなKubernetesエコシステムの 管理をしていくために 鈴木 祥太(@sshota0809) CloudNative Days Tokyo 2022

Slide 2

Slide 2 text

鈴木 祥太  @sshota0809 所属 株式会社ユーザベース SRE B2B 向け SaaS プロダクトを横串で担当 Like Network / Golang / GCP / AWS / k8s / Service Mesh 自己紹介

Slide 3

Slide 3 text

Kubernetes とエコシステムのライフサイクル エコシステム運用の難しさ サステナブルなエコシステム管理を目指して まとめ アジェンダ

Slide 4

Slide 4 text

話すこと ・Kubernetes エコシステムの運用について ・helmfile + Renovate + GitOps を利用したエコシステム運用自動化について 話さないこと ・Kubernetes 自体の運用について(アップグレード戦略など) ・helm 以外を前提としたエコシステムのインストール方法などについて ・GitOps の詳細について 話すこと・話さないこと

Slide 5

Slide 5 text

Kubernetes とエコシステムのライフサイクル

Slide 6

Slide 6 text

Kubernetes とエコシステムのライフサイクル Kubernetes のライフサイクル 4 ヶ月ごとにマイナーバージョンのリリースがされ 1 年間のサポートをする方針 参考:https://kubernetes.io/releases/ バージョンアップによって API が非推奨になったり削除されたりする 参考:https://kubernetes.io/docs/reference/using-api/deprecation-policy/ 出典:https://endoflife.date/kubernetes

Slide 7

Slide 7 text

Kubernetes とエコシステムのライフサイクル Kubernetes の運用を便利にするエコシステム 各コミュニティで活発に開発される様々なエコシステムを利用することで、 Kubernetes の運用などを自動化・省エネ化することが可能 e.g. Istio / cert-manager / External Secrets Operator / etc... エコシステムのライフサイクル エコシステムも 1 つのソフトウェアなので、当然リリース等のライフサイクルがある エコシステムのバージョンによってサポートしている Kubernetes のバージョンも 指定されている

Slide 8

Slide 8 text

Kubernetes とエコシステムのライフサイクル e.g. Istio のサポート情報 出典:https://istio.io/latest/docs/releases/supported-releases/

Slide 9

Slide 9 text

Kubernetes とエコシステムのライフサイクル Kubernetes のサイクル エコシステム のサイクル v1.1.0 v1.2.0 v1.3.0 v1.4.0 v1.5.0 v1.6.0 v1.7.0 v1.8.0 v1.0.0 v2.0.0 v3.0.0 v4.0.0 v5.0.0 v6.0.0 v7.0.0 v8.0.0 Kubernetes とエコシステムどちらもしっかりバージョン 追従する必要がある どちらをサボってしまってもエコシステムの動作に影響が出る可能性がある e.g. エコシステムが削除された Kubernetes の API にアクセスをしてしまう、etc... Kubernetes とエコシステムのライフサイクル例

Slide 10

Slide 10 text

エコシステム運用の難しさ

Slide 11

Slide 11 text

エコシステム運用の難しさ 構成管理の戦略 エコシステムのインストールは手段の 1 つとして helm Chart が提供されている 場合が多いが helm を利用したソフトウェアのインストールは手続き型となる そのため、どのバージョンの helm Chart がどのクラスタにインストール されているのか構成管理の戦略を考える必要がある  構成管理をしないとエコシステムやクラスタの数が増えた際に管理コストが顕著に増大する(体験談) $ helm repo add external-secrets https://charts.external-secrets.io $ helm install external-secrets \ external-secrets/external-secrets \ -n external-secrets \ --create-namespace \ helm コマンドによるインストール

Slide 12

Slide 12 text

エコシステム運用の難しさ エコシステムのバージョン追従 前述の通りエコシステムのバージョン追従を行う必要があるが、各エコシステムの リリース情報をキャッチアップして helm コマンドでアップグレードする事はかなり大変 エコシステムとクラスタの数が掛け算で運用負荷となる ・・・ ・・・ エコシステム Kubernetes ×

Slide 13

Slide 13 text

エコシステム運用の難しさ 構成管理の 戦略 エコシステム のバージョン 追従

Slide 14

Slide 14 text

エコシステム運用の難しさ 構成管理の 戦略 エコシステム のバージョン 追従 便利なので様々なエコシステムをインストールしたくなるが その運用で考えるべきことはたくさんある

Slide 15

Slide 15 text

サステナブルなエコシステム管理を目指して

Slide 16

Slide 16 text

サステナブルなエコシステム管理を目指して 構成管理の戦略 helmfile を利用した宣言的なエコシステム管理

Slide 17

Slide 17 text

サステナブルなエコシステム管理を目指して helmfile(https://github.com/helmfile/helmfile) helm Chart を宣言的に管理しデプロイできるようにするための helm のラッパーツール ‘’’Helmfile is a declarative spec for deploying helm charts’’’ YAML ファイルでレポジトリやインストールするチャートを定義することで コマンドラインでの手続き的な管理から脱却することができる repositories: - name: external-secrets url: https://charts.external-secrets.io releases: - name: external-secrets-operator namespace: external-secrets-operator createNamespace: true chart: external-secrets/external-secrets version: 0.6.0 $ helm repo add external-secrets https://charts.external-secrets.io $ helm install external-secrets \ external-secrets/external-secrets \ --version 0.6.0 \ -n external-secrets \ --create-namespace \ helm を利用したコマンドラインでのインストール helmfile.yaml に宣言的に記載

Slide 18

Slide 18 text

サステナブルなエコシステム管理を目指して helmfile と GitOps helmfile と GitOps を組み合わせることで宣言的にエコシステムを管理できる世界観を実現 GitOps の構成パターン(例) 1. CICD パイプラインによって helmfile からマニフェストファイルを生成しそれを ArgoCD 等で同期 2. 自作/有志が公開している ArgoCD の helmfile プラグインを利用して同期 例 1 のフロー helmfile を管理している レポジトリ GitHub Actions マニフェスト用 リポジトリ ・・・ ArgoCD k8s クラスタ helmfile.yaml helmfile.yaml や values.yaml の変更検知で ワークフローを実行 helmfile.yaml から マニフェストを生成して マニフェスト用リポジトリ にコミット ($ helmfile template) ArgoCDがマニフェストの 差分検知 差分をクラスタに反映

Slide 19

Slide 19 text

エコシステム運用の難しさ 構成管理の 戦略 エコシステム のバージョン 追従

Slide 20

Slide 20 text

サステナブルなエコシステム管理を目指して エコシステムのバージョン追従 Renovate を利用した helmfile の自動更新

Slide 21

Slide 21 text

サステナブルなエコシステム管理を目指して Renovate(https://github.com/renovatebot/renovate) リポジトリ内の依存関係のスキャンおよび更新を自動化するツール 依存関係の更新を自動で検知してアップグレードを施す PR を自動で発行、 多数のコンフィグレーションにより Renovate の柔軟な制御が可能 多くのパッケージマネージャーに対応しており helmfile にもネイティブで対応 参考:https://docs.renovatebot.com/modules/manager/ … releases: - name: external-secrets-operator namespace: external-secrets-operator createNamespace: true chart: external-secrets/external-secrets version: 0.6.0 helm repository メンテナー Create v0.7.0 helmfile.yaml 内で 指定したバージョンを参照 リポジトリスキャン + 依存関係検知 v0.7.0 の存在を検知 + PR 作成 − version: 0.6.0 + version: 0.7.0

Slide 22

Slide 22 text

サステナブルなエコシステム管理を目指して Renovate によるアップグレード自動化 with helmfile helmfile.yaml のバージョンアップグレードは Renovateの責務となる Renovate が作成した PR をどう扱うか組織によって柔軟に選択が可能 1. 人によるレビューを行い承認したら PR をマージしてワークフローを発火 2. PR をトリガーに何かしらのテストを実行しパスしたら自動マージしてワークフローを発火 etc... 例 1 のフロー helmfile を管理している レポジトリ GitHub Actions マニフェスト用 リポジトリ ・・・ ArgoCD k8s クラスタ helmfile.yaml helmfile.yaml や values.yaml の変更検知で ワークフローを実行 helmfile.yaml から マニフェストを生成して マニフェスト用リポジトリ にコミット ($ helmfile template) ArgoCDがマニフェストの 差分検知 差分をクラスタに反映 バージョンアップグレードを 施す PR を作成

Slide 23

Slide 23 text

エコシステム運用の難しさ 構成管理の 戦略 エコシステム のバージョン 追従

Slide 24

Slide 24 text

サステナブルなエコシステム管理を目指して 弊社で実際に運用しているフローの全体像 バージョンのアップグレードによってマニフェストがどのように変わるか差分をコメント 差分を確認し問題なければ PR を手動マージ(人間による介入はここのみ) ArgoCD マニフェスト用 リポジトリ (e.g. sp-manifest) helmfile を管理している レポジトリ Renovate GitHub Actions SRE GitHub Actions helmfileで管理されている ソフトウェアに アップグレードがあり次第 自動検知 + アップグレードを施す PR 作成 差分を確認して 問題なさそうであれば PR をマージ 差分を自動検知し 自動的にクラスタに反映 (新しいバージョンの エコシステムをインストール) helmfile.yaml マニフェスト ・・・ k8s クラスタ バージョンアップした際の マニフェストファイルの 差分を PR にコメント バージョンアップ後の マニフェストファイルを マニフェスト用 リポジトリにコミット

Slide 25

Slide 25 text

サステナブルなエコシステム管理を目指して バージョンアップに伴う差分をビジュアリング PR に GitHub Actions からコメント

Slide 26

Slide 26 text

サステナブルなエコシステム管理を目指して helmfile と Renovate の Tips どちらもプライベートな helm repository を参照することができるため 非公開の helm Chart も管理することができる(弊社では自作 Chart もすべて管理) 1. helmfile で helm repository に対する認証情報の設定する(サンプルを参照ください) 2. Renovate で helm repository に対する認証情報を設定する(サンプルを参照ください) Renovate の PR の単位はコンフィグレーションで柔軟に制御が可能なので 開発と本番環境用に別々の PR を発行するといったことも可能 1. helmfile.yaml を /dev/ と /prd/ ディレクトリ以下にそれぞれ配置 2. Renovate の設定でディレクトリごとに PR を分ける(サンプルを参照ください) 3. /dev/ に対する PR をマージ、開発クラスタ上での動作確認 時間の関係で説明し切れない部分はサンプルリポジトリを用意したのでご参照ください https://github.com/sshota0809/cndt2022-helmfile-renovate-sample ROOT dev/ prd/ helmfile.yaml helmfile.yaml

Slide 27

Slide 27 text

まとめ

Slide 28

Slide 28 text

Kubernetes とエコシステムのライフサイクル エコシステムは運用自動化ができたり大変便利だが、 しっかりとバージョン追従をすることが大切 エコシステム運用の難しさ 特にエコシステムやクラスタの数が増えるとエコシステム自体の構成管理や バージョンアップにかかる運用工数など様々な課題が表面化する サステナブルなエコシステム管理を目指して helmfile と Renovate を利用することでエコシステムの構成管理、 自動的なバージョンアップを行うことができる それによってエコシステムやクラスタの数が増えても持続可能な運用を行うことができる まとめ