$30 off During Our Annual Pro Sale. View Details »

Kubewarden を使って任意の言語でポリシを書こう #k8sjp / Kubernete...

Kubewarden を使って任意の言語でポリシを書こう #k8sjp / Kubernetes Meetup Tokyo 42nd

Kubernetes Meetup Tokyo #42 で利用したスライドです。

Kubernetes における Policy as Code の実装として最も広く使われているツールは Open Policy Agent (OPA) とその Kubernetes アダプタである Gatekeeper です。OPA は CNCF Graduated に位置付けられおり、デファクトスタンダードであると言えます。しかし OPA は記述言語として Rego を採用しており、学習コストの高さは否めません。

一方、OPA 以外のポリシエンジンとしては、Kyverno が CNCF Sandbox に登録されています。OPA と異なり Kyverno ではポリシの記述に YAML を用いるため学習コストは低いですが、その分、表現力に劣ります。

これらのツールに対して今回紹介する Kubewarden では、ポリシとして WebAssembly を採用しているため、WebAssembly が出力できる任意のプログラミング言語でロジックを実装することが可能です。また Kuberwarden でコンパイルしたポリシは、Docker Hub や AWS Elastic Container Registry のような OCI レジストリを用いて配布することもできます。

イベント概要:https://k8sjp.connpass.com/event/214286/
録画:https://youtu.be/FBnPVkxZFK4?t=7859

y_taka_23

June 24, 2021
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

  1. #k8sjp Open Policy Agent (OPA) • 現在の最有力ツール ◦ Kubernetes に限らない汎用エンジン

    ◦ Gatekeeper を介して Kubernetes と統合 • ポリシの記述には Rego 言語を使用 ◦ Datalog (Prolog) をベースとした言語 ◦ 馴染みがなく、学習コストが高くて辛い
  2. #k8sjp Kyverno • 2020 年 11 月に CNCF 入り ◦

    Kubernetes 上での利用が前提 • ポリシの記述には YAML を利用 ◦ OPA のように Manifest に他の言語を埋め込む必要がない ◦ =() で等価判定、+() で追加などの演算子を利用 ◦ 複雑なロジックを YAML で書くには表現力の限界が辛い
  3. #k8sjp Kubewarden • 2021 年 4 月にファーストリリース ◦ これも Kubernetes

    上での利用が前提 • ポリシの記述には WebAssembly を利用 ◦ OPA と違って Rego を改めて学ぶ必要がない ◦ Kyverno と違ってロジックがプログラミングできる ◦ ビルドされた Wasm は OCI レジストリで配布可能
  4. #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
  5. #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 ポリシを指定 (ここでは公式が配布しているものを指定)
  6. #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 ポリシの適用対象の指定
  7. #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 ポリシの実装者が自由に 指定できるパラメータ
  8. #k8sjp Go による Kubewarden の利用 • TinyGo で Wasm にビルド、そこまで難しくない

    ◦ テンプレートを git clone して make すれば OK ◦ encoding/json が使えない(gjson で代用)等の制限あり • 運用は管理用ツール kwctl が隠蔽 ◦ ビルドした Wasm の状態での pre-deploy テスト ◦ メタデータ付加や OCI レジストリへのアップロード
  9. #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) { ... }
  10. #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) で プラグイン的に呼び出される
  11. #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 自体の作成時、 パラメータのバリデーション
  12. #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 が作用する リソースのバリデーション
  13. #k8sjp まとめ • Policy as Code のツール選択 ◦ 既存の OPA

    / Kyverno はポリシの記述にそれぞれ難あり • 新登場の第三極ツール Kubewarden ◦ WebAssembly でポリシを記述、OCI レジストリで配布 ◦ 理論上は WebAssembly を出力する任意の言語が利用可 ◦ Kubernetes コミュニティなら Go のスキルが活かせる