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

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

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
    Kubewarden を使って
    任意の言語でポリシを書こう
    チェシャ猫 (@y_taka_23)
    Kubernetes Meetup Tokyo #42 (24th Jun. 2021)

    View Slide

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

    View Slide

  3. #k8sjp

    View Slide

  4. #k8sjp
    OPA

    View Slide

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

    View Slide

  6. #k8sjp
    Kyverno

    View Slide

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

    View Slide

  8. #k8sjp
    Kubewarden

    View Slide

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

    View Slide

  10. #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

    View Slide

  11. #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 ポリシを指定
    (ここでは公式が配布しているものを指定)

    View Slide

  12. #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
    ポリシの適用対象の指定

    View Slide

  13. #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
    ポリシの実装者が自由に
    指定できるパラメータ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. #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) { ... }

    View Slide

  23. #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) で
    プラグイン的に呼び出される

    View Slide

  24. #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 自体の作成時、
    パラメータのバリデーション

    View Slide

  25. #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 が作用する
    リソースのバリデーション

    View Slide

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

    View Slide

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

    View Slide