Skip to content
Published on

Kyvernoポリシーエンジン分析: 検証、変形、生成ルールの深層分析

Authors

1. Validateルール

1.1 パターンマッチング

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-run-as-non-root
spec:
  validationFailureAction: Enforce
  rules:
    - name: check-security-context
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: 'Containers must run as non-root'
        pattern:
          spec:
            containers:
              - securityContext:
                  runAsNonRoot: true

演算子: ?*(空でない値)、*(任意の値)、X|Y(または)、!X(否定)、>X<X(数値比較)

1.2 denyルール

rules:
  - name: deny-latest-tag
    validate:
      deny:
        conditions:
          any:
            - key: '{{ request.object.spec.containers[].image }}'
              operator: AnyIn
              value: ['*:latest']

1.3 CEL式

rules:
  - name: check-replica-count
    validate:
      cel:
        expressions:
          - expression: 'object.spec.replicas >= 2'
            message: 'Deployment must have at least 2 replicas'

2. Mutateルール

2.1 patchStrategicMerge

rules:
  - name: add-sidecar
    mutate:
      patchStrategicMerge:
        spec:
          template:
            spec:
              containers:
                - name: log-collector
                  image: fluentbit:latest

2.2 patchesJson6902

rules:
  - name: add-annotation
    mutate:
      patchesJson6902: |-
        - op: add
          path: /metadata/annotations/modified-by
          value: kyverno

3. Generateルール

3.1 dataベース生成

rules:
  - name: generate-default-limitrange
    generate:
      apiVersion: v1
      kind: LimitRange
      name: default-limits
      namespace: '{{ request.object.metadata.name }}'
      synchronize: true
      data:
        spec:
          limits:
            - default:
                cpu: 500m
                memory: 512Mi
              type: Container

3.2 cloneベース生成

rules:
  - name: clone-configmap
    generate:
      apiVersion: v1
      kind: ConfigMap
      name: shared-config
      namespace: '{{ request.object.metadata.name }}'
      clone:
        namespace: default
        name: template-configmap

4. 変数とコンテキスト

context:
  - name: namespaceInfo
    apiCall:
      urlPath: '/api/v1/namespaces/{{ request.namespace }}'
  - name: allowedRegistries
    configMap:
      name: allowed-registries
      namespace: kyverno

5. まとめ

  1. validate: パターンマッチング、deny条件、CEL式、foreachで多様な検証
  2. mutate: Strategic Merge Patch、JSON Patchでリソースを自動修正
  3. generate: data/cloneベースのリソース自動生成、synchronizeで同期
  4. 変数システム: JMESPath、API呼び出し、ConfigMapルックアップで動的ポリシー
  5. アンカーシステム: 条件付き、否定、等値アンカーで精密なパターンマッチング