- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. HA(고가용성) 배포
- 2. 정책 보고서(Policy Reports)
- 3. 모니터링
- 4. 백그라운드 스캐닝
- 5. PolicyException (예외 메커니즘)
- 6. 트러블슈팅
- 7. 업그레이드 전략
- 8. 정리
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_seconds | Admission 리뷰 처리 시간 |
| kyverno_policy_results_total | 정책 결과 (pass/fail/warn/error) |
| kyverno_policy_execution_duration_seconds | 정책 실행 시간 |
| kyverno_policy_changes_total | 정책 변경 횟수 |
| kyverno_client_queries_total | Kubernetes 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 프로덕션 운영 핵심:
- HA 배포: 레플리카 3+, PDB 설정, TopologySpreadConstraints
- 정책 보고서: PolicyReport CRD로 정책 준수 현황 가시화
- 모니터링: Prometheus 메트릭 + Grafana 대시보드 + 알림 규칙
- 백그라운드 스캐닝: 기존 리소스에 대한 주기적 정책 평가
- 예외 메커니즘: PolicyException으로 정당한 예외 관리
- 트러블슈팅: Webhook 로그, 정책 상태, 보고서를 통한 진단