ポリシーが実際に塞ぐものを見る
このラボは本物の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)。
- Kyvernoがどのように呼び出されるかを確認してください。Webhook設定が登録されている必要があります(保存先:
/root/kca/install.txt)。 - ClusterPolicy
require-team(Enforce)でteamラベルを要求し、ラベルのないPodが拒否される様子と、ラベルを備えたPod(ok-pod)が起動する様子を確認してください(保存先:/root/kca/validate.txt)。 - ポリシー(
add-defaults)でPodにownerラベルを注入し、Pod(mutated)に実際に入った内容を確認してください(保存先:/root/kca/mutate.txt)。mutateとvalidateの順序も書きます。 - ポリシー(
gen-baseline)で、新しいネームスペースにbaselineConfigMapを作らせ、ネームスペース(tenant-x)を作成して確認してください(保存先:/root/kca/generate.txt)。 - ポリシー(
warn-only)をAuditで適用し、違反するPod(violator)が作成される様子と、PolicyReportに記録される様子を確認してください(保存先:/root/kca/audit.txt)。 require-teamに例外を追加してシステムネームスペースを除外し、なぜそうする必要があるのかを書いてください(保存先:/root/kca/exclude.txt)。- ファイル(
/root/kca/test-pod.yaml)を作成し、kyvernoCLIで、クラスターに適用する前にテストしてください(結果の保存先:/root/kca/cli.txt)。 enforce_blocks=yes、audit_blocks=no、policies=の3行と説明を書いてください(保存先:/root/kca/report.md)。
参考
- ポリシーの動作方式は、
spec.validationFailureAction(旧バージョン)または、ルールの中のvalidate.failureAction(新バージョン)です。クラスターのKyvernoのバージョンに合うほうを使ってください。kubectl explain clusterpolicy.specで確認できます。 - ポリシーを付けた直後は、まだ効かないことがあります。 Webhook設定が更新されるまで、数秒かかります。テストする前に、少し待ってください。
generateは、アドミッションではなく、バックグラウンドコントローラーが行います。そのため、そのコントローラーのServiceAccountに権限が必要です。 なければ、ポリシーは問題ないのに何も作られません。- CLIは
kyverno apply <정책> --resource <매니페스트>(プレースホルダーはポリシーとマニフェストです)です。クラスターがなくてもよいので、CIで使います。 - よくある間違い1: 対象の範囲を広げるときに、システムワークロードのラベルと復旧経路を確認しないこと。このポリシーに違反するシステムPodの再作成が止まることがあります。ルールの
excludeとWebhookのnamespaceSelectorは、別の段階のフィルターです。 - よくある間違い2:
Auditで適用しておいて、そのポリシーが遮断していると思い込むこと。Auditポリシーは違反を許可して報告し、ほかのEnforceポリシーは、それでも拒否できます。
ポリシーはどのように呼び出されるのか
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つの動作のタイミングと、例外の話を書いてください。