Skip to content
Published on

Kyvernoプロダクション運用: HA、モニタリング、トラブルシューティング

Authors

1. HA(高可用性)デプロイ

1.1 レプリカ構成

helm install kyverno kyverno/kyverno -n kyverno --create-namespace \
  --set admissionController.replicas=3 \
  --set backgroundController.replicas=2 \
  --set reportsController.replicas=2

1.2 リソース割り当てとトポロジー

admissionController:
  replicas: 3
  container:
    resources:
      limits:
        cpu: '2'
        memory: 2Gi
      requests:
        cpu: 500m
        memory: 512Mi
  topologySpreadConstraints:
    - maxSkew: 1
      topologyKey: kubernetes.io/hostname
      whenUnsatisfiable: DoNotSchedule

1.3 failurePolicy戦略

  • Fail: Webhookダウン時にリクエストを拒否(セキュリティ優先)
  • Ignore: Webhookダウン時にリクエストを許可(可用性優先)

failurePolicy: Fail使用時は必ずPDBを設定:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: kyverno-admission-controller
  namespace: kyverno
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app.kubernetes.io/component: admission-controller

2. ポリシーレポート

kubectl get policyreport -n production
kubectl get clusterpolicyreport

レポートにはポリシーごと、ネームスペースごとのpass/fail/warn数が含まれます。Policy Reporter UIで可視化できます:

helm install policy-reporter policy-reporter/policy-reporter -n kyverno \
  --set ui.enabled=true --set kyvernoPlugin.enabled=true

3. モニタリング

3.1 Prometheusメトリクス

主要メトリクス: kyverno_admission_requests_totalkyverno_admission_review_duration_secondskyverno_policy_results_total

3.2 アラートルール

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kyverno-alerts
spec:
  groups:
    - name: kyverno
      rules:
        - alert: KyvernoWebhookHighLatency
          expr: histogram_quantile(0.99, rate(kyverno_admission_review_duration_seconds_bucket[5m])) > 10
          for: 5m
        - alert: KyvernoHighFailureRate
          expr: rate(kyverno_admission_requests_total{success="false"}[5m]) > 0.1
          for: 5m

4. バックグラウンドスキャニング

apiVersion: kyverno.io/v1
kind: ClusterPolicy
spec:
  validationFailureAction: Audit
  background: true
  rules:
    - name: check-labels
      validate:
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: '?*'

5. PolicyException

apiVersion: kyverno.io/v2beta1
kind: PolicyException
metadata:
  name: allow-privileged-monitoring
  namespace: monitoring
spec:
  exceptions:
    - policyName: disallow-privileged
      ruleNames:
        - check-privileged
  match:
    any:
      - resources:
          kinds: ['Pod']
          namespaces: ['monitoring']
          names: ['prometheus-*']

6. トラブルシューティング

# Kyvernoログの確認
kubectl logs -n kyverno -l app.kubernetes.io/component=admission-controller --tail=100

# Webhookステータスの確認
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations

# ポリシーステータスの確認
kubectl get clusterpolicy -o wide
kubectl describe clusterpolicy require-labels

# Admissionレイテンシの確認
kubectl exec -n kyverno deploy/kyverno-admission-controller -- wget -qO- localhost:8000/metrics | grep admission_review_duration

7. まとめ

  1. HAデプロイ: 3+レプリカ、PDB、TopologySpreadConstraints
  2. ポリシーレポート: PolicyReport CRDでコンプライアンス状況の可視化
  3. モニタリング: Prometheusメトリクス + Grafanaダッシュボード + アラートルール
  4. バックグラウンドスキャニング: 既存リソースに対する定期的なポリシー評価
  5. 例外メカニズム: PolicyExceptionで正当な例外を管理
  6. トラブルシューティング: Webhookログ、ポリシーステータス、レポートによる診断