Slide 1

Slide 1 text

Sansan株式会社 部署 名前 KustomizeでKnative Servingを PatchStrategicMergeしたい! Sansan技術本部 技術本部 研究開発部 Architectグループ ML Plattformチーム 宮地 宏⼀

Slide 2

Slide 2 text

写真が入ります 宮地 宏⼀ Sansan株式会社 技術本部 研究開発部 Architectグループ 2023年3⽉中部⼤学⼤学院⼯学研究科情報⼯学専攻修了。 在学中はヘルスケアとAIの融合を⽬的とした研究に取り組む。 現在は、研究開発部Architectグループ ML Platformチーム所属。 DevOps/MLOps基盤の構築業務に従事。

Slide 3

Slide 3 text

研究員が、セルフサービスで安全にアプリケーションをリリースできる基盤 - Kubernetesを利⽤したコンテナプラットフォーム - ボタンひとつでテンプレートをからリソースを作成 Circuit https://speakerdeck.com/sansan_randd/about-circuit-r-and-ds-application-platform

Slide 4

Slide 4 text

KustomizeでKnative Servingを PatchStrategicMergeしたい!

Slide 5

Slide 5 text

- Knative Serving: - Kubernetes上でサーバーレスアプリケーションを容 易にデプロイし管理を可能とする。⾃動スケーリン グやトラフィックの管理などの機能を提供する。 - Kustomize: - Kubernetesのマニフェストをテンプレート化せずに カスタマイズするツールであり、環境ごとの違いを 管理ファイルで定義し、アプリケーションのデプロ イメントをより簡単かつ安全に⾏うことを可能にす る。 Knative ServingとKustomize Knative Serving: https://github.com/knative/serving Kustomize: https://github.com/kubernetes-sigs/kustomize

Slide 6

Slide 6 text

- 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"

Slide 7

Slide 7 text

解決⽅法 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" # パッチの動作を定義 } }, ~省略~ } カスタムスキーマを作成して 読み込ませることで解決!!

Slide 8

Slide 8 text

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" } ] } } }

Slide 9

Slide 9 text

- KustomizeのPatchStrategicMergeの挙動を定義したカスタムスキーマを⽤意す ることで、Knative Serving serviseの配列がoverlay側に置き換えられてしまう問 題を解決!! - デメリット - 管理コストが増えてしまう.... - 標準スキーマが読み込まれない.... - カスタムスキーマに標準スキーマを追加することで回避可能 - 詳細はSansan Tech Blogにて - https://buildersbox.corp-sansan.com/entry/2023/12/22/110000 まとめ

Slide 10

Slide 10 text

We’re Hiring! R&D MLOps/DevOpsエンジニア https://open.talentio.com/r/1/c/sansan/pages/76616

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Appendix

Slide 13

Slide 13 text

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"