#CNDT2021 で Kustomize の話をしたときの資料です。
20,000+⾏のmanifestをリファクタリングして分かったKustomizeの美しきアーキテクチャと拡張性@hhiroshell1
View Slide
宣伝• 感染対策をしっかりやって遊舎⼯房に⾏きましょう2遊舎⼯房さんの店舗はこちら→↓現在の@hhiroshellのキーボードたち #crkbd⾃⼰紹介@hhiroshell早川 博(はやかわ ひろし)• Cloud Nativeなインフラを開発するエンジニア。Yahoo Japan Corporation 所属• エンジニアコミュニティ「Cloud Native Developers JP」オーガナイザー• Developers Summit 2018Japan Container Days 12.18CloudNative Days Tokyo 2019 / 2020登壇• ⾃作キーボード沼BMEK
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ3
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ4
Kustomizeとは• manifestに差分だけを書いたパッチを当ててバリエーションを作る• 環境ごとの共通部分、差分を分けて管理するのに役⽴つmanifestをDRYに管理するためのツール5
6⼀⾒わかりやすいようで、使ってみると…。Kustomizeに関するよくある感想なるほどなるほど。manifestの差分だけを書いてoverlayに置けばよいのですね。直感的でいいですね!フィールドの部分⽂字列を置き換えたりはできないんだ? テンプレートっぽくは使えないんだな…。manifestが多いとoverlayの中が散らかってくるな…。 なんかできないことが多いような?
このセッションのゴール• Kustomizeの使いこなせるようになって今までのイメージを払拭してほしい…!!– Kustomizeの仕組みを理解して使いこなせる– いい感じにmanifest構造の設計ができる– いままでだったら諦めてたかゆいところに⼿が届いちゃう– Kustomize is マジ GodKustomizeと仲良くなろうー。7yamlエンジニアKustomize
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ8
kustomize build を実⾏したときに起きること⼊⼒となるリソースに対して、複数の加⼯を施した結果を得る9入力出力KRMリソースKRMリソースkustomization.yamlリソースの追加・加工?kustomization.yamlリソースの追加・加工?• 複数のKRM(Kubernetes Resource Model)リソースを⼊⼒として、リソースの追加、加⼯(kustomization)が⾏われた結果を出⼒する– 追加、加⼯の内容はkustomization.yamlに宣⾔的に記述– 複数のkustomization.yamlを書いて繋げられるkustomization.yamlリソースの追加・加工?
kustomization.yamlで指定できるkustomization処理の例• resources– kustomization処理の⼊⼒• KRMリソースのパス• 他のkustomization.yamlの出⼒• configMapGenerator– 指定した内容のConfigMapを追加• commonAnnotations– 共通のannotationを付加• patches– KRM形式で記述したパッチの適⽤1apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yaml- service.yamlconfigMapGenerator:- name: example-propertiesfiles:- example.propertiescommonAnnotations:hashtag: “#CNDT2021”patches:- patch.yaml
kustomization処理の実体• Kustomizeに標準で備わって(Builtin)いるkustomzation機能は、全てGeneratorまたはTransformerの派⽣– コード的にはGeneratorPlugin / TransformerPluginというインターフェースの実装になっている• GeneratorとTransformer– Generatorはリソースの追加– Transformerは⼊⼒されたリソースの加⼯= GeneratorとTransformer11ResMapGenerator/Transformer
kustomization処理の連鎖的な実⾏• ResMap:– KRMリソースの集合体。Generator / Transformerによってリソースが追加、加⼯される• Generator / Transformer:– ResMapを加⼯する処理複数のGenerator / Transformerによってmanifestが加⼯(kustomization)されていく12KRMリソース ResMap ResMap ResMapGenerator/Transformer入力出力KRMリソースGenerator/TransformerGenerator/Transformer
Generator / Transformerの実装を⾒てみる - 1/2• GeneratorPlugin / TransformerPlugin インタフェースの定義1type GeneratorPlugin interface {GeneratorConfigurable}type TransformerPlugin interface {TransformerConfigurable}type Transformer interface {Transform(m ResMap) error}type Generator interface {Generate() (ResMap, error)}type Configurable interface {Config(h *PluginHelpers, config []byte) error}resmap.go
Generator / Transformerの実装を⾒てみる - 2/2• AnnotationsTransformerPlugin(commonAttionationsに当たる部分の実装)1func (p *AnnotationsTransformerPlugin) Config(_ *resmap.PluginHelpers, c []byte) (err error) {p.Annotations = nilp.FieldSpecs = nilreturn yaml.Unmarshal(c, p)}func (p *AnnotationsTransformerPlugin) Transform(m resmap.ResMap) error {if len(p.Annotations) == 0 {return nil}return m.ApplyFilter(annotations.Filter{Annotations: p.Annotations,FsSlice: p.FieldSpecs,})}AnnotationsTransformer.go
【おまけ】おなじみのKustoization機能も実は• ビルトインの機能もkustomzation.yaml上でtrasfomersフィールドに書くことができる– 普段使っているのはtransformerに特別に与えられた記法1apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationtransformers:- |-apiVersion: builtinkind: PrefixSuffixTransformermetadata:name: myFancyNamePrefixerprefix: bob-fieldSpecs:- path: metadata/nameapiVersion: kustomize.config.k8s.io/v1beta1kind: KustomizationnamePrefix: bob-
kustomization.yamlとKustomizationディレクトリ• kustomization.yamlは⼀つのディレクトリに⼀つ配置• リソース追加・加⼯のためのファイル(e.g., patch, resources)を同ディレクトリに置く複数のKustomization処理を束ねる単位16Generator/Transformerkustomization.yamldeployment.yamlkustomizationディレクトリservice.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yaml- service.yamlcommonAnnotations:hashtag: “#cndt2021”
Kustomizationディレクトリの連結• resourcesに他のKustomizationディレクトリを指定して連結• 前段のKustomization処理の出⼒が次のKustomization処理の⼊⼒になるKustomizeディレクトリは他のKustomize処理の結果を⼊⼒にできる17Generator/Transformerkustomization.yamldeployment.yamlkustomizationディレクトリservice.yamlapiVersion: kustomize.(snip).v1beta1kind: Kustomizationresources:- path/to/another/dirGenerator/Transformerkustomization.yamldeployment.yamlkustomizationディレクトリservice.yaml参照kustomization
Kustomizationディレクトリの連結• 多段に連結してkustomizationの流れ(ストリーム)を作る• それぞれのkustomizationディレクトリが意味が意味のあるまとまりになる– e.g., プロダクションクラスタに適⽤する差分のセット⼀種のストリーム処理でありつつ意味のあるまとまりに分けることもできる18参照kustomization.yamldeployment.yamlservice.yamlGenerator/Transformerkustomization.yamlGenerator/Transformerkustomization.yamlGenerator/Transformerkustomization.yamldeployment.yamlservice.yamlGenerator/Transformerkustomization.yamlGenerator/Transformer kustomization
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ1
• Kustomizeはkustomizationの連結(ストリーム)が実装の中⼼• ストリームの流れを設計したあと、各々のkustomizationファイルの意味から逆算してディレクトリ構成を当てはめると良い• ストリームの流れを決めるには以下を意識するディレクトリ構成の考え⽅ストリームの流れを起点に考える20ü 開始点 ü 分岐と合流 ü 終点base/ overlay/ overlay/hoge
ストリームの開始点• ストリームの開始点の選択肢– ローカルに置いたmanifestファイル (kustomization.yamlのresourcesのファイル)– 他のリポジトリにあるmanifestファイルやkustomizationディレクトリ、Helm Chart⼊⼒となるKRMリソースを決めるところ。複数の種類が指定できる21kustomization.yamldeployment.yamlkustomizationディレクトリservice.yamlresourcesでローカルファイルを指定kustomization.yamlkustomizationディレクトリsome-input.yamlkustomization.yamlsome-input-chartresourcesでファイル、ディレクトリを指定HelmInfrationGeneratorでチャートを指定• ローカル • リモート
ストリームの分岐と合流• 分岐: prod, stgなど環境ごとの差分を作るときに、環境ごとに分岐する• 合流: 共通リソースを複数箇所に取り⼊れて利⽤するKustomizationディレクトリを⾊々につなぎ合わせて⽬的のmanifestを得る22kustomization.yamldeployment.yaml入力(アプリ)service.yamlresourceskustomization.yamlkustomization.yamlkustomization.yamlrbac.yaml入力(RBAC系)resourceskustomization.yamlkustomization.yamlアプリのProduction用の差分アプリのDevelopment用の差分分岐合流合流Production用の最終出力Development用の最終出力
ストリームの終点• 終点ではapplyしたい単位に集約しておく– resourcesに複数のkustomizationディレクトリを指定してこれを⾏う– CDツールが持っている機能や、運⽤⽅針に沿った単位を考えるCDツールでkustomize buildを実⾏してクラスタにapplyする23kustomization.yamlkustomization.yamlkustomization.yamlkustomization.yamlresourcesで複数のkustomizationディレクトリを指定> kustoize build_ > kubectl apply_CDツールKubernetesクラスタ
2Kustomizationディレクトリの意味を意識してディレクトリのパスを決めていくストリームができたらディレクトリ配置を考えてみるkustomization.yamldeployment.yamlservice.yamlresourceskustomization.yamlrbac.yamlresourcesbase/app/rbac/prod/kustomization.yamlkustomization.yamlapp/rbac/kustomization.yamldev/kustomization.yamlkustomization.yamlapp/rbac/kustomization.yamlprod用パイプライン Kubernetesクラスタ(production)dev用パイプライン Kubernetesクラスタ(development)
ディレクトリ設計におけるその他のコツ• 個々のKustomizeディレクトリの意味を意識する– 途中のKustomizeディレクトリでもkustomize buildして意味があるmanifestを出⼒されるようにする– きれいに意味が分かれていると、分岐の枝を⾜して追加の拡張を⼊れるなど、再利⽤性、メンテナンス性がよくなる• 何も変更しないKustomizeディレクトリがあっても良い– resourcesを書いてストリームをつなぐだけのディレクトリ– 「Development環境向けのmanifest(何も変わってないけど)」ことを意味するKustomizeディレクトリ2
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ2
Kustomizeプラグインとは• BuiltinのGenerator/Transformerではできない加⼯を⾏える– e.g., ConfigMap内にインラインで書いた設定ファイルを加⼯したい• kustomize buildだけでmanifestを作れるというUXを壊さない– 独⾃スクリプトを被せてしまうとmanifestを出⼒するときに追加の⼿順が必要• 加⼯処理のロジックに集中できる– ⼊出⼒や呼び出しはKustomizeの任せ、お作法に合わせてロジックを書けば良いKustomizeプラグイン ≒ Generator/Transformerの⾃作27kustomization.yaml すごい処理
Kustomizeプラグインの実装⽅法• Containerized KRM Functions– KRMの加⼯、追加処理をGoで実装してコンテナ化しておく• Exec KRM Functions– KRMの加⼯、追加処理を任意の実⾏バイナリに実装する2【参考】以下はDEPRECATEDとなっているため本セッションでは詳しくは触れません• Legacy exec plugins• Exec KRM Functionsと同様だが、実⾏バイナリの呼び出し時の⼊⼒フォーマットに違いがある。シェルスクリプトとの相性が良く、発表者的には⼀番これが好き• Legacy Go plugins• GeneratorPlugin/TransformerPluginインターフェースを実装したロジックを、Go⾔語のプラグイン機構を利⽤して組み込む。ビルドが壊れやすくて⾟いのなんのって
Kustomizeプラグインの作っていく流れ1. プラグインの呼び出し⽅法を定義した設定ファイル(KRM)を⽤意– 呼び出すプラグインやそれに与えるパラメータを指定2. kustomization.yaml内で上の設定ファイルを指定3. プラグインの実装を⽤意– 実装⽅法に合わせて以下を実施2• Containerized KRM Functions– kyamlライブラリを使ってリソースの追加・加⼯処理を実装– Dockerfile出⼒などコンテナ化の⽀援もkyamlライブラリがしてくれる• Exec KRM Functions– 任意⾔語でリソースの追加・加⼯を実装– リソースの⼊出⼒は標準⼊出⼒を利⽤
ConfigMap内のファイルを加⼯するプラグインの例 - 1/4• まずkustomization.yamlのgeneratorまたはtransformer配下にプラグインの呼び出し⽅法を定義したファイルを指定3apiVersion: kustomize.config.k8s.io/v1beta1kind: KustomizationconfigMapGenerator:- name: example-propertiesfiles:- example.propertiestransformers:- replace-foo-with-bar.yamlkustomization.yaml[email protected]@[email protected]@example.propertieskustomizeはインラインのファイルを加⼯する機能がないのでプラグインでこれをやってみる
ConfigMap内のファイルを加⼯するプラグインの例 - 2/4• replace-foo-with-bar.yamlで呼び出すプラグインと⼊⼒に与えるパラメータを指定– annotationで実⾏バイナリを指定– spec配下に⼊⼒パラメータを指定3apiVersion: hhiroshell.github.comkind: SedTransformermetadata:name: replace-foo-with-barannotations:config.Kubernetes.io/function: |exec:path: ../plugins/sedtransformer.shspec:replacements:foo: barreplace-foo-with-bar.yaml
ConfigMap内のファイルを加⼯するプラグインの例 - 3/4• プラグインを実装する– Exec KRM Functionsでは⾔語は問わない• 実⾏可能なファイルができればよい– ⼊出⼒はstdin/outを使う• ⼊⼒は加⼯元のリソースやパラメータを含む構造化された情報(KRM)– items 以下に加⼯前のリソース– functionConfig.spec以下に⼊⼒パラメータ• 加⼯後のリソースをstdoutに出⼒する3apiVersion: config.kubernetes.io/v1kind: ResourceListfunctionConfig:apiVersion: hhiroshell.github.com/v1kind: sedTransformermetadata:name: replace-foo-with-barspec:replacementsfoo: baritems:- apiVersion: v1kind: ConfigMapmetadata:name: example-properties-82cbkgc849data:example.properties: |-[email protected]@[email protected]@プラグインに渡される入力(ResourceList)の例
ConfigMap内のファイルを加⼯するプラグインの例 - 4/4• プラグインの実装を書く3#!/bin/bash# 標準入力からResourceListを読み込む。itemsに加工前のリソース、.functionConfig.specにパラメータが入っているresourceList=$(cat)items=$(echo "$resourceList" | yq e '.items' - )replacements=$(echo "$resourceList" | yq e '.functionConfig.spec.replacements' - )# リソース毎にループして、sedを実行していくfor i in `seq 0 $(expr $(echo "$items" | yq e ". | length" - ) - 1)`; doitem=$(echo "$items" | yq e ".[$i]" - )for key in $(echo "$replacements" | yq e ". | keys" - | yq e ".[]" - ); doitem=$(echo "$item" | sed -e "s/@@[email protected]@/"$(echo "$replacements" | yq e ".$key" - )"/g")done# 加工したリソースは標準出力にそのまま吐き出すecho "$item"echo "---"done
kustomize buildを実⾏する• プラグインを利⽤するときはkustomize build実⾏時に所定のフラグをつける必要がある3$ kustomize build --enable-alpha-plugins --enable-exec ./path/to/kustomize/dirapiVersion: v1data:example.properties: |-foo=barkind: ConfigMapmetadata:name: example-properties-82cbkgc849Exec KRM Functions以外のプラグインを使う場合の⼿順については、公式ドキュメントを参照してください。• https://kubectl.docs.kubernetes.io/guides/extending_kustomize/※ Exec KRM Functionsの場合のフラグ
【参考】Containerized KRM FunctionsとExec KRM Functions• 複雑なロジックを組んだり、外部システム連携など⾼度な機能を使うならContainerized KRM Functions• ⼿軽にKustomizeの不⾜を補うならExec KRM Functions w/ Shell Script3種別 実装⽅法 Pros ConsContainerizedKRM FunctionsKRMの加⼯、追加処理をGoで実装してコンテナ化しておく• Go⾔語 + kyamlライブラリにより、複雑なロジックや外部システム連携を記述しやすい• プラグイン⾃体のビルドが必須• CD環境でkustomizeを実⾏するときDocker in Dockerが必要ExecKRM FunctionsKRMの加⼯、追加処理を任意の実⾏バイナリに実装する• 任意の⾔語で実装できる• Shell Scriptを使うなどして、幅広い環境で動作するプラグインが作れる• ビルド不要で動作するプラグインが作れる• リソースの⼊出⼒に標準⼊出⼒を利⽤するので、リソースの取り回しの実装に慣れが要る
おすすめのプラグインの使い所• インラインドキュメントの加⼯– ⽂字列置換– ⾏挿⼊• yamlのアンカー、エイリアスの展開 → 2021年9⽉末に標準で対応可能に• Helm Chartの取り込み → 2021年春にビルトインのプラグインに追加• nameやnamespaceが違うが中⾝がほぼ同じリソースを複数作る– Listリソース + アンカー/エイリアス(後述)で対応できないならアリこれでかゆいところにも⼿が届く…36
【おまけ】Listリソース + アンカー/エイリアスの利⽤例• xxxListという名前で複数のリソースを配列に含めて1枚のyamlにできる• 1枚のyamlになるので、アンカー/エイリアスを使ってDRYに書ける• Kustomizeの⼊⼒としてアンカー/エイリアス⼊りのmanifestを使うには、kustomize v4.4.0+ が必要同内容のリソースを複数作るときに特に有効37apiVersion: v1kind: PodListitems:- apiVersion: v1kind: Podmetadata:name: busybox-00spec: &speccontainers:- name: busyboximage: busyboxcommand: ["/bin/sh", "-c"]args: ["while true; do echo '#CNDT2021' && sleep 1; done"]- apiVersion: v1kind: Podmetadata:name: busybox-01spec: *spec
Kustomizeプラグインを使う上での注意点• manifestの開発体験を損なわないように注意– kustomize buildするためにプラグインをビルドしたり実⾏環境を⽤意したりするのは、できればやらないほうが良い• ビルド環境や実⾏環境を⽤意した環境でしか動かない。環境によってkustomize buildに失敗したり、動作が異なったりしかねない• CDに組み込むのが⼤変になる– Exec KRM Functions + Shell Scriptで実現できないかをまず考える• プラグインのメンテナンス性も意識しよう– プラグインが「秘伝のスクリプト」化しないように注意やりすぎ注意…!38
リファクタリングするmanifest - 1/2• 管理対象のKubernetesクラスタ群– 合計16クラスタ、8種のバリエーション(4環境、2クラスタ種別)– 約20コンポーネントを各クラスタにデプロイ– バリエーション毎にデプロイするコンポーネントや各コンポーネントの設定が異なる4Development Staging Production-1 Production-2x1x3x1x3x1x3x1x3Type AType B全クラスタのmanifestを1リポジトリで管理
リファクタリングするmanifest - 2/2• リファクタリング前のコードの内訳– yamlだけで20,000+⾏– Kustomizeではできない(と思われていた)環境差分を作るために独⾃のPythonスクリプトを利⽤4language files codeYAML 290 20,194Markdown 12 1,307Jinja 6 499Python 2 236Shell Script 1 59XML 3 22pip requirements 1 6
リファクタリング前の課題(ほんの⼀例)• ディレクトリの切り⽅が統⼀されてない– それだけでは意味をなさないリソースが単独で置かれていたり– 依存し合わないリソースが同じディレクトリにあったり• 共通部分と差分をうまく切り出せてない– baseが複数ディレクトリに分かれている...!– overlayの⽅に同じことを全部書いてる• 独⾃の拡張– Kustomizeの機能不⾜(と思われていた)を補うための複数の独⾃スクリプト• e.g., ⽂字列の置き換え、内容がほぼ同じだが名前が異なるリソースを複数作成 ...etc地道な改善では追いつかないと判断し、抜本的に作り変えることに42
manifestリファクタリングのベストプラクティス1. 少数の開始点から終点まで完成されたストリームから始める2. 1本のストリームを1コンポーネントに対応付ける3. 移⾏期間の運⽤のこともあらかじめ考えておく4. kubectl diffを使ってクラスタとの差分を確認しながらリファクタする5. nameとnamespaceは変えない6. ビルトインの機能でできないことはKustomizeプラグインで4
少数の開始点から終点まで完成されたストリームから始める• 開始点から終点まで成⽴するapply可能なストリームをまず作る– 最低限動くものから始める• リファクタリングを進める段取りに沿って数を増やしていく– プロトタイプングの時点では1, 2本– 検証時点では1クラスタ分4課題の具体化と整理プロトタイピング整理の⽅針の共有検証 実施
1本のストリームを1コンポーネントに対応付ける• “1コンポーネント”の例– Ingressコントローラー、ログ収集エージェント、アプリAなど– そのコンポーネントを動かすためのすべてのリソース(workload, discovery,rbac...)⼀式を1ストリームで扱う• 1本のストリームでkustomize buildしたときに意味のある単位のmanifestを出⼒できるようにする– 1本のストリームで意味をなし、かつ他のストリームと依存しない• コンポーネント単位のスコープで⽇々改善できるようになる4
component-x/※ でき上がったもの4component-y/component-z/base/Type-A/Type-B/component-x/component-y/component-z/dev/Type-A/component-α/component-z’/Type-B/staging/dev/Type Aクラスタkustomization.yamldev/Type Aパイプラインkustomization.yamldev/Type Bパイプラインdev/Type Bクラスタ一部コンポーネントは外部リポジトリから取得component-α/Type-A/Type A,Bで共通のものはBからAを参照component-z’/同時にapplyするためTypeごとに集約環境ごとに分岐
移⾏期間の運⽤のこともあらかじめ考えておく• ある程度の規模になると⼀朝⼀⼣でできることではなくなってくる• リファクタ中は新旧2種類のmanifestが共存する– リファクタリングが済んだクラスタから、CDのmanifest取得先を切り替え– リファクタ中のクラスタ以外は、この取組みの期間中でも新規リリースしていた4base/prod/staging/overlay/dev/base/prod/staging/overlay/new/dev/base/prod/staging/new/dev/base/ prod/staging/dev/base/リファクタリング前 新旧共存期 すべて新構成に移行new/ディレクトリを削除して完成!
kubectl diffを使ってクラスタとの差分を確認しながら作業する• 少し⼤胆な構成変更もdiffをチェックすれば安⼼してできる– ストリーム単位(=コンポーネント単位で)でkustomize build + kubectl diffしながらmanifestを編集していく• diffを⾒やすくするツールも活⽤するとなお良い– kubectl neat diff: diffの表⽰からmanagedFieldsを除外してくれる– colordiff: ⾊をつけてdiffを表⽰してくれる4$ kustomize build ./path/to/kustomize/dir | kubectl diff - | colordiff
4kubectl neat diff + colordiff を利⽤したdiffの出⼒例diff -uN /var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/LIVE-020772465/v1.Pod.quantum-sandbox.busybox-00/var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/MERGED-814475548/v1.Pod.quantum-sandbox.busybox-00--- /var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/LIVE-020772465/v1.Pod.quantum-sandbox.busybox-00 2021-10-2119:49:35.000000000 +0900+++ /var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/MERGED-814475548/v1.Pod.quantum-sandbox.busybox-00 2021-10-2119:49:35.000000000 +0900@@ -14,7 +14,7 @@command:- /bin/sh- -c- image: busybox:stable+ image: busybox:1.33.1name: busyboxresources:limits:diff -uN /var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/LIVE-020772465/v1.Pod.quantum-sandbox.busybox-01/var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/MERGED-814475548/v1.Pod.quantum-sandbox.busybox-01--- /var/folders/7m/r1f0b69d3cjdj_hmz2t5dgchyl05r1/T/LIVE-020772465/v1.Pod.quantum-sandbox.busybox-01 2021-10-21...(snip)...
nameとnamespaceは変えない• これを変えるとそのリソースは新規作成となるのでdiffのチェックが効かなくなる• Namespace, Nameの変更は全体の構成を変え終わってから、スコープを絞ってやる5ビルトインの機能でできないことはKustomizeプラグインで• 独⾃の加⼯をKustomizeプラグイン以外の⼿段で作らない• Exec KRM Functionsをシェルスクリプトで書くのがおすすめ– ⼤抵の環境でプラグインのビルドなどの⼿間なく kustomize build ⼀発でmanifestが出⼒できる– メンテナンスが属⼈化しにくい
yaml 58%減達成• ⽬に⾒えてライン数を削減• Pythonスクリプト依存が解消してスッキリ5language files codeYAML 290 20,194Markdown 12 1,307Jinja 6 499Python 2 236Shell Script 1 59XML 3 22pip requirements 1 6language files codeYAML 264 8,437Markdown 6 1,164Jinja 0 0Python 0 0Shell Script 0 0XML 3 22pip requirements 0 0Properties 21 791Before After
⽬次1. イントロダクション2. Kustomizeの仕組みを知ろう3. ディレクトリ構成の考え⽅4. Kustomizeプラグインを活⽤しよう5. ⼤規模manifest群をリファクタリングするコツ6. まとめ5
いかがでしたか?• こんなことを話しました…– Kustomizeはkustomizatinディレクトリの連結とGenerator/Transformerを軸に設計されている– ストリームの流れを設計してからディレクトリ構成を考えよう– Kustomizeプラグインをうまく活⽤しよう– 実際にリファクタリングする上でのコツ x 6Kustomizeと仲良くなれそうでしょうか53yamlエンジニアKustomizeKustomize is マジ God
Fin.5
Appendix.参考⽂献5
【参考⽂献】• Kustomizeの公式ドキュメント– The Kustomization File• https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/– Extending Kustomize• https://kubectl.docs.kubernetes.io/guides/extending_kustomize/– Containerized KRM Functions• https://kubectl.docs.kubernetes.io/guides/extending_kustomize/containerized_krm_functions/– Exec KRM functions• https://kubectl.docs.kubernetes.io/guides/extending_kustomize/exec_krm_functions/• GitHubリポジトリ– The Kubernetes Resource Model (KRM)• https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/resource-management.md– Kustomize• https://github.com/kubernetes-sigs/kustomize5