TT Lab
はじめる
学ぶ 学習パス コース

KCA — Kyverno認定アソシエイト

ポリシーが実際に塞ぐものを見る

TT Labで続きを見る

このラボは本物のKyvernoで動きます

VMの中で、k3s + Kyvernoが実際に起動しています。アドミッションWebhookが登録されているので、ポリシーを付けると、本当に拒否され、本当に値が注入され、本当にほかのオブジェクトが作られます。

初期のポリシー作成ラボは、CRDだけがロードされた偽のクラスターで動きます。そこでは、ポリシーをどれだけうまく書いても何も起きません。それなのにkubectl applyは成功するので、画面だけを見れば正常です。

最初の起動に4–5分かかります。Kyvernoをインストールし、Webhookが登録されるのを待ちます。

想定学習時間は70分です。セッションは最初は60分なので、残り時間を確認して、期限が切れる前に延長してください。このラボは、k3s 1.35.8とKyverno 1.19.1に固定されています。既存のポリシーを読む練習のためにClusterPolicyを使いますが、このAPIはKyverno 1.19で非推奨(deprecated)になり、公式ドキュメントは1.20で削除する予定だと案内しています。新しいプロジェクトにそのままコピーせず、サポートされているバージョンと新しいポリシーAPIを確認してください。

目標

ポリシーの3つの動作(validate・mutate・generate)が、それぞれいつ、どのように起きるのかを直接確認し、EnforceとAuditの違い、そして例外を忘れたときに何が起きるかを見ます。

なぜ重要なのか

ポリシーエンジンで最も危険な状態は、「ポリシーが間違っていること」ではなく、ポリシーがどこにも適用されていないことです。後者は静かだからです。

そして、3つの動作は起きるタイミングが違います。

動作 いつ 何を
mutate アドミッション、validateより先 オブジェクトを書き換えます
validate アドミッション 拒否するか、通過させます
generate アドミッションのあとに、別のコントローラーが 別のオブジェクトを作ります

この順序を知らないと、ポリシーがお互いを無力化します。mutateがラベルを入れているのに、validateがそのラベルを要求しているなら、順序のおかげで通過します。 逆にgenerateはアドミッションの外で起きるので、別の権限が必要です。

ステップ

Podは、次のネームスペースに作成します(kca)。

  1. Kyvernoがどのように呼び出されるかを確認してください。Webhook設定が登録されている必要があります(保存先: /root/kca/install.txt)。
  2. ClusterPolicy require-team(Enforce)でteamラベルを要求し、ラベルのないPodが拒否される様子と、ラベルを備えたPod(ok-pod)が起動する様子を確認してください(保存先: /root/kca/validate.txt)。
  3. ポリシー(add-defaults)でPodにownerラベルを注入し、Pod(mutated)に実際に入った内容を確認してください(保存先: /root/kca/mutate.txt)。mutateとvalidateの順序も書きます。
  4. ポリシー(gen-baseline)で、新しいネームスペースにbaseline ConfigMapを作らせ、ネームスペース(tenant-x)を作成して確認してください(保存先: /root/kca/generate.txt)。
  5. ポリシー(warn-only)をAuditで適用し、違反するPod(violator)が作成される様子と、PolicyReportに記録される様子を確認してください(保存先: /root/kca/audit.txt)。
  6. require-teamに例外を追加してシステムネームスペースを除外し、なぜそうする必要があるのかを書いてください(保存先: /root/kca/exclude.txt)。
  7. ファイル(/root/kca/test-pod.yaml)を作成し、kyverno CLIで、クラスターに適用する前にテストしてください(結果の保存先: /root/kca/cli.txt)。
  8. enforce_blocks=yes、audit_blocks=no、policies=の3行と説明を書いてください(保存先: /root/kca/report.md)。

参考

ポリシーはどのように呼び出されるのか

Kyvernoがどのように呼び出されるかを確認してください。Webhook設定が登録されている必要があります(保存先: /root/kca/install.txt)。

ValidatingWebhookConfigurationが登録されていてはじめて、APIサーバーがKyvernoに問い合わせます。

拒否する

ClusterPolicy require-team(Enforce)でteamラベルを要求し、ラベルのないPodが拒否される様子と、ラベルを備えたPod(ok-pod)が起動する様子を確認してください(保存先: /root/kca/validate.txt)。

Enforceでなければ止まりません。ラベルのないPodと、ラベルを備えたPodを両方テストしてください。

書き換える、そして順序がある

ポリシー(add-defaults)でPodにownerラベルを注入し、Pod(mutated)に実際に入った内容を確認してください(保存先: /root/kca/mutate.txt)。mutateとvalidateの順序も書きます。

mutateは、validateより先に実行されます。そのため、mutateが入れた値を、validateが要求できます。

別のものを作る

ポリシー(gen-baseline)で、新しいネームスペースにbaseline ConfigMapを作らせ、ネームスペース(tenant-x)を作成して確認してください(保存先: /root/kca/generate.txt)。

generateは、バックグラウンドコントローラーが行います。そのため、そのコントローラーに権限が必要で、すぐには作られません。

止めずに記録だけする

ポリシー(warn-only)をAuditで適用し、違反するPod(violator)が作成される様子と、PolicyReportに記録される様子を確認してください(保存先: /root/kca/audit.txt)。

Auditポリシーは、違反してもオブジェクトを作ってくれます。結果はPolicyReportに蓄積されます。

ポリシーの範囲を広げるときに、例外と復旧を確認する

require-teamに例外を追加してシステムネームスペースを除外し、なぜそうする必要があるのかを書いてください(保存先: /root/kca/exclude.txt)。

前のステップは、kcaだけを対象にしていました。今回は対象を広げつつ、システムネームスペースをexcludeします。ポリシーの例外だけで、Webhook呼び出しまで除外されたと判断しないでください。

適用する前にテストする

ファイル(/root/kca/test-pod.yaml)を作成し、kyverno CLIで、クラスターに適用する前にテストしてください(結果の保存先: /root/kca/cli.txt)。

kyverno apply <정책> --resource <매니페스트>(プレースホルダーはポリシーとマニフェストです)は、クラスターなしでポリシーをテストします。CIで使います。

何を学んだか

enforce_blocks=yes、audit_blocks=no、policies=の3行と説明を書いてください(保存先: /root/kca/report.md)。

enforce_blocks=、audit_blocks=、policies=の3行と一緒に、3つの動作のタイミングと、例外の話を書いてください。