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

KustomizeでKnative ServingをPatchStrategicMergeした...

Sansan R&D
February 13, 2024

KustomizeでKnative ServingをPatchStrategicMergeしたい! / I want to PatchStrategicMerge Knative Serving with Kustomize!

■イベント
Kubernetes Meetup Tokyo #63
https://k8sjp.connpass.com/event/308227/

■発表者
技術本部 研究開発部 Architectグループ
宮地 宏⼀

■研究開発職 採用情報
https://media.sansan-engineering.com/randd

■Sansan Tech Blog
https://buildersbox.corp-sansan.com/

Sansan R&D

February 13, 2024
Tweet

More Decks by Sansan R&D

Other Decks in Technology

Transcript

  1. - Knative Serving: - Kubernetes上でサーバーレスアプリケーションを容 易にデプロイし管理を可能とする。⾃動スケーリン グやトラフィックの管理などの機能を提供する。 - Kustomize: -

    Kubernetesのマニフェストをテンプレート化せずに カスタマイズするツールであり、環境ごとの違いを 管理ファイルで定義し、アプリケーションのデプロ イメントをより簡単かつ安全に⾏うことを可能にす る。 Knative ServingとKustomize Knative Serving: https://github.com/knative/serving Kustomize: https://github.com/kubernetes-sigs/kustomize
  2. - Knative Serving serviseにPatchStrategicMergeすると配列が全置換される! - 研究員にJsonPatchを書いてもらうのは認知負荷が⾼くなってしまう。 発⽣した問題 Base Overlay After

    Merge apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: HOGE_ENV value: "hogehoge" - name: FUGA_ENV value: "fugafuga" apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: PIYO_ENV value: "piyopiyo" apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: PIYO_ENV value: "piyopiyo"
  3. 解決⽅法 Base Overlay After Merge apiVersion: serving.knative.dev/v1 kind: Service metadata:

    name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: HOGE_ENV value: "hogehoge" - name: FUGA_ENV value: "fugafuga" apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: PIYO_ENV value: "piyopiyo" apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: PIYO_ENV value: "piyopiyo" - name: HOGE_ENV value: "hogehoge" - name: FUGA_ENV value: "fugafuga" Custom Schema { "definitions": { "dev.knative.serving.v1.Service": { ~省略~ "env": { "type": "array", "x-kubernetes-patch-merge-key": "name", # マージのkeyを指定 "x-kubernetes-patch-strategy": "merge" # パッチの動作を定義 } }, ~省略~ } カスタムスキーマを作成して 読み込ませることで解決!!
  4. 1. クラスタよりスキーマ情報を取得 2. 該当のスキーマ情報を探す 3. 動作定義したカスタムスキーマの作成 4. kustomizeに読み込ませる 解決⼿順 openapi:

    - path: schema.json $ kustomize openapi fetch > schema.json "dev.knative.serving.v1.Service": { "description": "Service acts as a top-level container that ...省略..." "properties": { ~省略~ } } "x-kubernetes-patch-merge-key": "name", # マージのkeyを指定 "x-kubernetes-patch-strategy": "merge" # パッチの動作を定義 { "definitions": { "dev.knative.serving.v1.Service": { "properties": { "spec": { "properties": { "template": { "properties": { "metadata": { "x-kubernetes-preserve-unknown-fields": true }, "spec": { "properties": { "containers": { "items": { "properties": { "env": { "items": { "default": {} }, "type": "array", "x-kubernetes-patch-merge-key": "name", # マージのkeyを指定 "x-kubernetes-patch-strategy": "merge" # パッチの動作を定義 } }, "type": "object" }, "type": "array", "x-kubernetes-patch-merge-key": "name", # マージのkeyを指定 "x-kubernetes-patch-strategy": "merge" # パッチの動作を定義 } }, "required": [ "containers" ], "type": "object" } }, "type": "object" } }, "type": "object" } }, "type": "object", "x-kubernetes-group-version-kind": [ { "group": "serving.knative.dev", "kind": "Service", "version": "v1" } ] } } }
  5. - KustomizeのPatchStrategicMergeの挙動を定義したカスタムスキーマを⽤意す ることで、Knative Serving serviseの配列がoverlay側に置き換えられてしまう問 題を解決!! - デメリット - 管理コストが増えてしまう....

    - 標準スキーマが読み込まれない.... - カスタムスキーマに標準スキーマを追加することで回避可能 - 詳細はSansan Tech Blogにて - https://buildersbox.corp-sansan.com/entry/2023/12/22/110000 まとめ
  6. JsonPatchを利⽤した⽅法 Base Overlay After Merge apiVersion: serving.knative.dev/v1 kind: Service metadata:

    name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: HOGE_ENV value: "hogehoge" - name: FUGA_ENV value: "fugafuga" - op: add path: /spec/template/spec/containers/0/env/- value: name: PIYO_ENV value: piyopiyo apiVersion: serving.knative.dev/v1 kind: Service metadata: name: slide-sample spec: template: spec: containers: - name: "slide-sample" env: - name: HOGE_ENV value: "hogehoge" - name: FUGA_ENV value: "fugafuga" - name: PIYO_ENV value: "piyopiyo"