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 cleanupController.replicas=2 \
  --set reportsController.replicas=2

1.2 리소스 할당

# values.yaml
admissionController:
  replicas: 3
  container:
    resources:
      limits:
        cpu: '2'
        memory: 2Gi
      requests:
        cpu: 500m
        memory: 512Mi
  topologySpreadConstraints:
    - maxSkew: 1
      topologyKey: kubernetes.io/hostname
      whenUnsatisfiable: DoNotSchedule
      labelSelector:
        matchLabels:
          app.kubernetes.io/component: admission-controller

backgroundController:
  replicas: 2
  resources:
    limits:
      cpu: '1'
      memory: 1Gi
    requests:
      cpu: 200m
      memory: 256Mi

1.3 failurePolicy 전략

# 프로덕션 권장: 핵심 정책은 Fail, 비핵심은 Ignore
# Helm values
admissionController:
  failurePolicy: Fail # Webhook 장애 시 요청 거부 (보안 우선)

# 또는 개별 정책에서 설정
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: critical-policy
spec:
  failurePolicy: Fail
  validationFailureAction: Enforce

주의: failurePolicy: Fail 설정 시 Kyverno가 다운되면 모든 리소스 생성/수정이 차단됩니다. PDB(PodDisruptionBudget)를 반드시 설정하세요.

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

2. 정책 보고서(Policy Reports)

2.1 PolicyReport CRD

# 네임스페이스별 정책 보고서 조회
kubectl get policyreport -n production

# 클러스터 레벨 보고서
kubectl get clusterpolicyreport

# 상세 보고서 조회
kubectl get policyreport -n production -o yaml

2.2 보고서 구조

apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
  name: polr-ns-production
  namespace: production
results:
  - message: "Validation rule 'require-labels' passed"
    policy: require-labels
    rule: check-app-label
    result: pass
    source: kyverno
    category: Best Practices
    timestamp:
      nanos: 0
      seconds: 1710950400
    resources:
      - apiVersion: apps/v1
        kind: Deployment
        name: web-app
        namespace: production
summary:
  pass: 45
  fail: 3
  warn: 2
  error: 0
  skip: 0

2.3 Policy Reporter UI

# Policy Reporter 설치 (선택적 UI)
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm install policy-reporter policy-reporter/policy-reporter -n kyverno \
  --set ui.enabled=true \
  --set kyvernoPlugin.enabled=true

3. 모니터링

3.1 Prometheus 메트릭

Kyverno는 기본적으로 Prometheus 메트릭을 노출합니다:

# 메트릭 엔드포인트
# http://kyverno-svc.kyverno:8000/metrics

주요 메트릭:

메트릭설명
kyverno_admission_requests_total총 Admission 요청 수
kyverno_admission_review_duration_secondsAdmission 리뷰 처리 시간
kyverno_policy_results_total정책 결과 (pass/fail/warn/error)
kyverno_policy_execution_duration_seconds정책 실행 시간
kyverno_policy_changes_total정책 변경 횟수
kyverno_client_queries_totalKubernetes API 쿼리 수

3.2 ServiceMonitor 설정

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kyverno
  namespace: kyverno
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: kyverno
  endpoints:
    - port: metrics
      interval: 30s
      path: /metrics

3.3 Grafana 대시보드

주요 대시보드 패널:

  • Admission 요청률 및 레이턴시
  • 정책 결과 분포 (pass/fail/warn)
  • 정책별 실행 시간
  • Webhook 에러율
  • 리소스 사용량 (CPU/메모리)
# 알림 규칙 예시 (PrometheusRule)
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kyverno-alerts
  namespace: kyverno
spec:
  groups:
    - name: kyverno
      rules:
        - alert: KyvernoWebhookHighLatency
          expr: histogram_quantile(0.99, rate(kyverno_admission_review_duration_seconds_bucket[5m])) > 10
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: 'Kyverno webhook latency is high'
        - alert: KyvernoHighFailureRate
          expr: rate(kyverno_admission_requests_total{success="false"}[5m]) > 0.1
          for: 5m
          labels:
            severity: critical

4. 백그라운드 스캐닝

4.1 기존 리소스 정책 평가

Background Controller가 기존 리소스에 대해 정책을 주기적으로 평가합니다:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: check-existing-resources
spec:
  validationFailureAction: Audit # 기존 리소스는 Audit 모드 권장
  background: true # 백그라운드 스캐닝 활성화 (기본값: true)
  rules:
    - name: check-labels
      match:
        any:
          - resources:
              kinds:
                - Deployment
      validate:
        message: 'Required label missing'
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: '?*'

4.2 스캐닝 주기 설정

# Helm values로 스캐닝 주기 조정
helm upgrade kyverno kyverno/kyverno -n kyverno \
  --set backgroundController.backgroundScanInterval=1h

5. PolicyException (예외 메커니즘)

5.1 정책 예외 정의

특정 리소스나 네임스페이스에 대해 정책 예외를 정의할 수 있습니다:

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-*'
            - 'node-exporter-*'

5.2 예외 활성화

# PolicyException 기능 활성화 (Helm)
helm upgrade kyverno kyverno/kyverno -n kyverno \
  --set features.policyExceptions.enabled=true \
  --set features.policyExceptions.namespace="*"

6. 트러블슈팅

6.1 Webhook 타임아웃

# Webhook 타임아웃 확인
kubectl get mutatingwebhookconfigurations kyverno-resource-mutating-webhook-cfg -o yaml | grep timeout

# 타임아웃 증가
helm upgrade kyverno kyverno/kyverno -n kyverno \
  --set admissionController.webhookTimeout=30

6.2 API 서버 연결 문제

# Kyverno Pod 로그 확인
kubectl logs -n kyverno -l app.kubernetes.io/component=admission-controller --tail=100

# Webhook 상태 확인
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations

# Kyverno 서비스 엔드포인트 확인
kubectl get endpoints -n kyverno kyverno-svc

6.3 정책이 적용되지 않는 경우

# 정책 상태 확인
kubectl get clusterpolicy -o wide
kubectl describe clusterpolicy require-labels

# 정책 보고서에서 실패 원인 확인
kubectl get policyreport -A -o jsonpath='{range .items[*].results[?(@.result=="fail")]}{.policy}: {.message}{"\n"}{end}'

# dry-run으로 정책 테스트
kubectl apply -f test-resource.yaml --dry-run=server

6.4 성능 문제

# Admission 리뷰 레이턴시 확인
kubectl exec -n kyverno deploy/kyverno-admission-controller -- wget -qO- localhost:8000/metrics | grep admission_review_duration

# 리소스 사용량 확인
kubectl top pods -n kyverno

# Background Controller 스캔 상태
kubectl logs -n kyverno -l app.kubernetes.io/component=background-controller --tail=50

7. 업그레이드 전략

# 현재 버전 확인
helm list -n kyverno

# 업그레이드 (Helm)
helm repo update
helm upgrade kyverno kyverno/kyverno -n kyverno \
  --reuse-values \
  --version X.Y.Z

# CRD 수동 업그레이드 (필요 시)
kubectl apply -f https://raw.githubusercontent.com/kyverno/kyverno/release-X.Y/config/crds/kyverno.io_clusterpolicies.yaml

업그레이드 주의사항:

  • CRD 변경이 있을 수 있으므로 릴리스 노트 확인
  • Audit 모드에서 먼저 테스트
  • PDB가 설정되어 있는지 확인
  • 롤백 계획 준비

8. 정리

Kyverno 프로덕션 운영 핵심:

  1. HA 배포: 레플리카 3+, PDB 설정, TopologySpreadConstraints
  2. 정책 보고서: PolicyReport CRD로 정책 준수 현황 가시화
  3. 모니터링: Prometheus 메트릭 + Grafana 대시보드 + 알림 규칙
  4. 백그라운드 스캐닝: 기존 리소스에 대한 주기적 정책 평가
  5. 예외 메커니즘: PolicyException으로 정당한 예외 관리
  6. 트러블슈팅: Webhook 로그, 정책 상태, 보고서를 통한 진단