Skip to content
Published on

Kyvernoアーキテクチャ内部分析: Kubernetesネイティブポリシーエンジン

Authors

1. Kyvernoとは

KyvernoはKubernetesのために設計されたポリシーエンジンです。OPA/Gatekeeperとは異なり、別のポリシー言語なしにYAMLとCELでポリシーを定義できます。

主な特徴: YAMLベースのポリシー定義、kubectlによるKubernetesリソース管理、4つのルールタイプ(validate、mutate、generate、verifyImages)、CELサポート、バックグラウンドスキャン。


2. アーキテクチャ概要

Admission Controller: APIリクエストを傍受してリアルタイムでポリシーを適用 Background Controller: 既存リソースに対するポリシー評価を定期的に実行 Reports Controller: PolicyReport/ClusterPolicyReport CRDの生成と管理

2.1 Webhook構成

KyvernoはインストールからMutatingWebhookConfigurationとValidatingWebhookConfigurationを自動構成します。failurePolicyはFail(Webhook失敗時に拒否)またはIgnore(失敗時に許可)に設定できます。


3. ポリシータイプ

3.1 ClusterPolicy vs Policy

# ClusterPolicy: クラスタ全体に適用
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: Enforce
  rules:
    - name: check-labels
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "Label 'app.kubernetes.io/name' is required"
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: '?*'

3.2 validationFailureAction

  • Enforce: ポリシー違反時にリクエストを拒否
  • Audit: 違反を記録するがリクエストは許可

4. ルールタイプ

4.1 validate

rules:
  - name: validate-resources
    match:
      any:
        - resources:
            kinds:
              - Deployment
    validate:
      message: 'CPU and memory limits are required'
      pattern:
        spec:
          template:
            spec:
              containers:
                - resources:
                    limits:
                      memory: '?*'
                      cpu: '?*'

4.2 mutate

rules:
  - name: add-default-labels
    match:
      any:
        - resources:
            kinds:
              - Deployment
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            app.kubernetes.io/managed-by: kyverno

4.3 generate

rules:
  - name: generate-networkpolicy
    match:
      any:
        - resources:
            kinds:
              - Namespace
    generate:
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      name: default-deny
      namespace: '{{ request.object.metadata.name }}'
      synchronize: true
      data:
        spec:
          podSelector: {}
          policyTypes:
            - Ingress
            - Egress

4.4 verifyImages

rules:
  - name: verify-image-signature
    match:
      any:
        - resources:
            kinds:
              - Pod
    verifyImages:
      - imageReferences:
          - 'ghcr.io/myorg/*'
        attestors:
          - entries:
              - keyless:
                  url: https://fulcio.sigstore.dev

5. インストール

helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno -n kyverno --create-namespace

6. まとめ

  1. Kubernetesネイティブ: YAML/CELベースのポリシー、kubectlで管理
  2. 3つのコントローラ: Admission(リアルタイム)、Background(既存リソース)、Reports
  3. 4つのルールタイプ: validate、mutate、generate、verifyImages
  4. 柔軟なマッチング: リソース種類、ネームスペース、ユーザー、ロールによるフィルタリング
  5. Audit/Enforceモード: 段階的なポリシー導入をサポート