Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

KustomizeのHash Suffixがあってもいい感じにdiffが見られるkubectl...

hhiroshell
February 22, 2022

KustomizeのHash Suffixがあってもいい感じにdiffが見られるkubectlプラグインを作った話 / about kubectl realname-diff

k8sjp #48 でのLTの資料です。

hhiroshell

February 22, 2022
Tweet

More Decks by hhiroshell

Other Decks in Technology

Transcript

  1. 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 • ⾃作キーボード沼
  2. Kubernetes Meetup Tokyo yamlエンジニアのわがままなリクエスト • manifestをクラスタに適⽤する前に変更差分を確認したい – Kustomizeなどの差分管理ツールでmanifestを書くとき、kubectl diffでクラスタ との差分を確認しながら作業したい

    – kubectl diffの出⼒をmanifestのコードレビューの⼿がかりにしたい • ConfigMapを更新したときにPodを⾃動で再起動したい – アプリが起動時にしか設定を読み込まない場合は再起動が必要 – KustomizeのHash Suffixを使うと、ConfigMapの内容を変更したときに {.metadata.name} が更新され、これを適⽤するとPodが再起動される 3
  3. 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全体を 追加するという差分になる
  4. 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
  5. 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
  6. 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)...
  7. Kubernetes Meetup Tokyo kubectl diffとの仕組みの違い • kubectl diffの仕組み 8 kubectl

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

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

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