Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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
    KustomizeのHash Suffixがあってもいい感じに
    diffが⾒られるkubectlプラグインを作った話
    @hhiroshell
    1

    View Slide

  2. 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
    • ⾃作キーボード沼

    View Slide

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

    View Slide

  4. 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全体を
    追加するという差分になる

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. 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)...

    View Slide

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

    View Slide

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



    View Slide

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



    ② ③

    View Slide

  11. 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を呼び出して差分
    を出力



    ② ③

    View Slide

  12. 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を呼び出して差分
    を出力



    ② ③

    View Slide

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

    View Slide

  14. Kubernetes Meetup Tokyo
    Fin.
    14

    View Slide