Creating a Simple Policy
Kyvernoには2種類のポリシーリソースがあります:クラスター全体のリソースに使用されるClusterPolicyと、名前空間付きリソースに使用されるPolicyです。Kyvernoポリシーの理解を深めるために、まずはシンプルなPodラベル要件から始めましょう。ご存知の通り、Kubernetesではラベルがクラスター内のリソースにタグ付けするために使用されます。
以下は、CostCenterラベルを持たないPodの作成をブロックするClusterPolicyのサンプルです:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: check-team
match:
any:
- resources:
kinds:
- Deployment
validate:
allowExistingViolations: false
message: "Label 'CostCenter' is required on the Deployment pod template"
pattern:
spec:
template:
metadata:
labels:
CostCenter: "?*"
spec.validationFailureActionは、検証に失敗したリソースを許可して報告する(Audit)か、ブロックする(Enforce)かをKyvernoに指示します。デフォルトはAuditですが、この例ではEnforceに設定されています
rulesセクションには、検証する1つ以上のルールが含まれています
matchステートメントはチェックの範囲を設定します。この場合、すべてのPodリソースが対象になります
validateステートメントは、定義された内容を肯定的にチェックしようとします。このステートメントがリクエストされたリソースと比較して真の場合、許可されます。偽の場合は、ブロックされます
messageは、このルールが検証に失敗した場合にユーザーに表示されるメッセージです
patternオブジェクトは、リソースでチェックされるパターンを定義します。この場合、metadata.labels内にCostCenterがあるかをチェックします
次のコマンドを使用してポリシーを作成します:
clusterpolicy.kyverno.io/require-labels created
次に、ui名前空間で実行されているPodを確認し、適用さ れているラベルを確認してください:
NAME READY STATUS RESTARTS AGE LABELS
ui-67d8cf77cf-d4j47 1/1 Running 0 9m app.kubernetes.io/component=service,app.kubernetes.io/created-by=eks-workshop,app.kubernetes.io/instance=ui,app.kubernetes.io/name=ui,pod-template-hash=67d8cf77cf
実行中のPodに必要なラベルがなく、Kyvernoがそれを終了しなかったことに注目してください。これは、KyvernoがAdmissionControllerとして機能し、クラスターに既に存在するリソースには干渉しないためです。
ただし、実行中のPodを削除すると、 必要なラベルがないため再作成されることはありません。ui名前空間で実行中のPodを削除してみましょう:
pod "ui-67d8cf77cf-d4j47" deleted
No resources found in ui namespace.
前述の通り、Podは再作成されませんでした。ui