Slide 1

Slide 1 text

#k8sjp Kubewarden を使って 任意の言語でポリシを書こう チェシャ猫 (@y_taka_23) Kubernetes Meetup Tokyo #42 (24th Jun. 2021)

Slide 2

Slide 2 text

#k8sjp Policy as Code、やってますか?

Slide 3

Slide 3 text

#k8sjp

Slide 4

Slide 4 text

#k8sjp OPA

Slide 5

Slide 5 text

#k8sjp Open Policy Agent (OPA) ● 現在の最有力ツール ○ Kubernetes に限らない汎用エンジン ○ Gatekeeper を介して Kubernetes と統合 ● ポリシの記述には Rego 言語を使用 ○ Datalog (Prolog) をベースとした言語 ○ 馴染みがなく、学習コストが高くて辛い

Slide 6

Slide 6 text

#k8sjp Kyverno

Slide 7

Slide 7 text

#k8sjp Kyverno ● 2020 年 11 月に CNCF 入り ○ Kubernetes 上での利用が前提 ● ポリシの記述には YAML を利用 ○ OPA のように Manifest に他の言語を埋め込む必要がない ○ =() で等価判定、+() で追加などの演算子を利用 ○ 複雑なロジックを YAML で書くには表現力の限界が辛い

Slide 8

Slide 8 text

#k8sjp Kubewarden

Slide 9

Slide 9 text

#k8sjp Kubewarden ● 2021 年 4 月にファーストリリース ○ これも Kubernetes 上での利用が前提 ● ポリシの記述には WebAssembly を利用 ○ OPA と違って Rego を改めて学ぶ必要がない ○ Kyverno と違ってロジックがプログラミングできる ○ ビルドされた Wasm は OCI レジストリで配布可能

Slide 10

Slide 10 text

#k8sjp apiVersion: policies.kubewarden.io/v1alpha2 kind: ClusterAdmissionPolicy metadata: name: psp-capabilities spec: module: registry://ghcr.io/kubewarden/policies/psp-capabilities:v0.1.3 rules: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] operations: - CREATE - UPDATE mutating: true settings: Allowed_capabilities: - CHOWN Required_drop_capabilities: - NET_ADMIN

Slide 11

Slide 11 text

#k8sjp apiVersion: policies.kubewarden.io/v1alpha2 kind: ClusterAdmissionPolicy metadata: name: psp-capabilities spec: module: registry://ghcr.io/kubewarden/policies/psp-capabilities:v0.1.3 rules: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] operations: - CREATE - UPDATE mutating: true settings: Allowed_capabilities: - CHOWN Required_drop_capabilities: - NET_ADMIN ビルド・アップロード済みの Wasm ポリシを指定 (ここでは公式が配布しているものを指定)

Slide 12

Slide 12 text

#k8sjp apiVersion: policies.kubewarden.io/v1alpha2 kind: ClusterAdmissionPolicy metadata: name: psp-capabilities spec: module: registry://ghcr.io/kubewarden/policies/psp-capabilities:v0.1.3 rules: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] operations: - CREATE - UPDATE mutating: true settings: Allowed_capabilities: - CHOWN Required_drop_capabilities: - NET_ADMIN ポリシの適用対象の指定

Slide 13

Slide 13 text

#k8sjp apiVersion: policies.kubewarden.io/v1alpha2 kind: ClusterAdmissionPolicy metadata: name: psp-capabilities spec: module: registry://ghcr.io/kubewarden/policies/psp-capabilities:v0.1.3 rules: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] operations: - CREATE - UPDATE mutating: true settings: Allowed_capabilities: - CHOWN Required_drop_capabilities: - NET_ADMIN ポリシの実装者が自由に 指定できるパラメータ

Slide 14

Slide 14 text

#k8sjp https://docs.kubewarden.io/architecture.html

Slide 15

Slide 15 text

#k8sjp https://docs.kubewarden.io/architecture.html あらかじめクラスタに Kubewarden Controller をデプロイ

Slide 16

Slide 16 text

#k8sjp https://docs.kubewarden.io/architecture.html ユーザが Policy の Manifest を apply

Slide 17

Slide 17 text

#k8sjp https://docs.kubewarden.io/architecture.html Policy Server を立ち上げ Wasm モジュールを DL、読み込み

Slide 18

Slide 18 text

#k8sjp https://docs.kubewarden.io/architecture.html Admission Webhook を作成

Slide 19

Slide 19 text

#k8sjp https://docs.kubewarden.io/architecture.html リソースに対する Policy のチェック

Slide 20

Slide 20 text

#k8sjp WebAssebmly 自体、学習コスト高くない?

Slide 21

Slide 21 text

#k8sjp Go による Kubewarden の利用 ● TinyGo で Wasm にビルド、そこまで難しくない ○ テンプレートを git clone して make すれば OK ○ encoding/json が使えない(gjson で代用)等の制限あり ● 運用は管理用ツール kwctl が隠蔽 ○ ビルドした Wasm の状態での pre-deploy テスト ○ メタデータ付加や OCI レジストリへのアップロード

Slide 22

Slide 22 text

#k8sjp package main import ( wapc "github.com/wapc/wapc-guest-tinygo" ) func main() { wapc.RegisterFunctions(wapc.Functions{ "validate_settings": validateSettings, "validate": validate, }) } func validateSettings(payload []byte) ([]byte, error) { ... } func validate(payload []byte) ([]byte, error) { ... }

Slide 23

Slide 23 text

#k8sjp package main import ( wapc "github.com/wapc/wapc-guest-tinygo" ) func main() { wapc.RegisterFunctions(wapc.Functions{ "validate_settings": validateSettings, "validate": validate, }) } func validateSettings(payload []byte) ([]byte, error) { ... } func validate(payload []byte) ([]byte, error) { ... } Policy Server から waPC (WebAssembly Procedure Call) で プラグイン的に呼び出される

Slide 24

Slide 24 text

#k8sjp package main import ( wapc "github.com/wapc/wapc-guest-tinygo" ) func main() { wapc.RegisterFunctions(wapc.Functions{ "validate_settings": validateSettings, "validate": validate, }) } func validateSettings(payload []byte) ([]byte, error) { ... } func validate(payload []byte) ([]byte, error) { ... } Policy 自体の作成時、 パラメータのバリデーション

Slide 25

Slide 25 text

#k8sjp package main import ( wapc "github.com/wapc/wapc-guest-tinygo" ) func main() { wapc.RegisterFunctions(wapc.Functions{ "validate_settings": validateSettings, "validate": validate, }) } func validateSettings(payload []byte) ([]byte, error) { ... } func validate(payload []byte) ([]byte, error) { ... } Policy が作用する リソースのバリデーション

Slide 26

Slide 26 text

#k8sjp まとめ ● Policy as Code のツール選択 ○ 既存の OPA / Kyverno はポリシの記述にそれぞれ難あり ● 新登場の第三極ツール Kubewarden ○ WebAssembly でポリシを記述、OCI レジストリで配布 ○ 理論上は WebAssembly を出力する任意の言語が利用可 ○ Kubernetes コミュニティなら Go のスキルが活かせる

Slide 27

Slide 27 text

#k8sjp Build, Ship and Enforce Anywhere! Presented by チェシャ猫 (@y_taka_23)