Slide 1

Slide 1 text

Kubernetes Meetup Tokyo KustomizeのHash Suffixがあってもいい感じに diffが⾒られるkubectlプラグインを作った話 @hhiroshell 1

Slide 2

Slide 2 text

Kubernetes Meetup Tokyo 宣伝 • 感染対策をしっかりやって遊舎⼯房に⾏きましょう 2 遊舎⼯房さんの店舗はこちら→ ↓現在の推しキーボード: Cornelius ⾃⼰紹介 @hhiroshell 早川 博 (はやかわ ひろし) • Cloud Nativeなインフラを開発 するエンジニア。 Yahoo Japan Corporation 所属 • エンジニアコミュニティ 「Cloud Native Developers JP」 オーガナイザー • Developers Summit 2018 Japan Container Days 12.18 CloudNative Days Tokyo 2019, 2020, 2021 • ⾃作キーボード沼

Slide 3

Slide 3 text

Kubernetes Meetup Tokyo yamlエンジニアのわがままなリクエスト • manifestをクラスタに適⽤する前に変更差分を確認したい – Kustomizeなどの差分管理ツールでmanifestを書くとき、kubectl diffでクラスタ との差分を確認しながら作業したい – kubectl diffの出⼒をmanifestのコードレビューの⼿がかりにしたい • ConfigMapを更新したときにPodを⾃動で再起動したい – アプリが起動時にしか設定を読み込まない場合は再起動が必要 – KustomizeのHash Suffixを使うと、ConfigMapの内容を変更したときに {.metadata.name} が更新され、これを適⽤するとPodが再起動される 3

Slide 4

Slide 4 text

Kubernetes Meetup Tokyo kubectl diff + Hash Suffix → 残念な結果 • {.metadata.name} が変更されたConfigMapは新規作成扱いなので、変 更前のConfigMapとの差分が⾒られない…。 4 $ kustomize build ./example | kubectl diff -f - ...(snip)... @@ -1 +1,24 @@ -{} +apiVersion: v1 +data: + nginx.conf: | + events { + worker_connections 2048; + } + http { + server { + listen 80; ...(snip)... + name: nginx-conf-m5d2cggb7k + namespace: default • KustomizeがConfigMapの名前の末尾にHash値を 付けてくれる • 名前が変わると新規作成扱いなのでConfigMap 内の⼀部を変更しただけでもConfigMap全体を 追加するという差分になる

Slide 5

Slide 5 text

Kubernetes Meetup Tokyo kubectl realname-diff を作ってみました • KustomizeのHash Suffixがあってもいい感じにdiffが⾒られるkubectlプ ラグイン – https://github.com/hhiroshell/kubectl-realname-diff • realname-diff/realname=[real name] というラベルで元の名前を 書いておくと、同じラベルのリソース同⼠で⽐較してくれる – このラベルがない場合は通常のkubectl diffと同じように振る舞う • kubectl diffのフラグ(--server-side, ...etc)や、diffプログラムを差し替える KUBECTL_EXTERNAL_DIFF 環境変数も同じように使える 5

Slide 6

Slide 6 text

Kubernetes Meetup Tokyo 使い⽅ 1. インストール 2. kustomization.yamlで realname-diff/realname ラベルを付けてク ラスタに適⽤しておく 6 $ kubectl krew install realname-diff configMapGenerator: - name: &name nginx-conf files: - conf/nginx.conf options: labels: realname-diff/realname: *name prunable: true # hash suffix is enabled by default

Slide 7

Slide 7 text

Kubernetes Meetup Tokyo 使い⽅ 3. ローカルでConfigMapを更新する 4. kubectl realname-diffを実⾏ 7 $ sed -i e “s/worker_connections 1024/worker_connections 2048/g” nginx.conf $ kustomize build ./example | kubectl realname-diff -f - ...(snip)... @@ -2,7 +2,7 @@ data: nginx.conf: | events { - worker_connections 1024; + worker_connections 2048; } http { server { @@ -21,5 +21,5 @@ ...(snip)...

Slide 8

Slide 8 text

Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl diffの仕組み 8 kubectl diff Kubernetes {} ConfigMap ①.metadata.name から比較対象のリソースを決定 $ kubectl diff ①

Slide 9

Slide 9 text

Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl diffの仕組み 9 kubectl diff Kubernetes tmpディレクトリ {} ConfigMap ①.metadata.name から比較対象のリソースを決定 LIVE Resource ②クラスタ上のリソース(LIVE)を取得 し、tmpディレクトリに保存 $ kubectl diff ① ② ②

Slide 10

Slide 10 text

Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl diffの仕組み 10 kubectl diff Kubernetes tmpディレクトリ {} ConfigMap ①.metadata.name から比較対象のリソースを決定 LIVE Resource Merged Patch ②クラスタ上のリソース(LIVE)を取得 し、tmpディレクトリに保存 ③ローカルのリソースとクラスタ上の リソースからパッチを作成し、tmp ディレクトリに保存 $ kubectl diff ① ② ③ ② ③

Slide 11

Slide 11 text

Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl diffの仕組み 11 kubectl diff Kubernetes diff -uN tmpディレクトリ {} ConfigMap ①.metadata.name から比較対象のリソースを決定 LIVE Resource Merged Patch ②クラスタ上のリソース(LIVE)を取得 し、tmpディレクトリに保存 ③ローカルのリソースとクラスタ上の リソースからパッチを作成し、tmp ディレクトリに保存 $ kubectl diff ④diffを呼び出して差分 を出力 ① ② ③ ② ③ ④

Slide 12

Slide 12 text

Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl realname-diff ではどうやっているか 12 kubectl diff Kubernetes diff -uN tmpディレクトリ {} ConfigMap ①realname-diff/realnameラベルで比較対象を決定 ラベルがなければ.metadata.nameで決定 LIVE Resource Merged Patch ②クラスタ上のリソース(LIVE)を取得 し、tmpディレクトリに保存 ③.metadata.nameが異なる場合は Merged PatchではなくCreate Patch を作る。 .metadata.nameが一致する場合は kubectl diffと同じように動作 $ kubectl diff ④diffを呼び出して差分 を出力 ① ② ③ ② ③ ④

Slide 13

Slide 13 text

Kubernetes Meetup Tokyo まとめ • KustomizeのHash Suffixがあってもいい感じにdiffが⾒られるkubectlプ ラグインを作ってみました • ぜひ使ってみてください! 13

Slide 14

Slide 14 text

Kubernetes Meetup Tokyo Fin. 14