안녕하세요! 쿠버네티스 보안의 핵심, Kyverno 시리즈의 두 번째 시간입니다. 🛡️
지난 시간에는 Kyverno의 전체적인 아키텍처를 살펴보았는데요. 오늘은 실전으로 들어가서 "어떻게 하면 Kyverno를 클러스터에 가장 완벽하게 설치하고 최적화할 수 있는가?"에 대해 다뤄보겠습니다. 특히 현업에서 가장 많이 쓰이는 Helm(헬름)을 이용한 설치와 values.yaml 파일의 주요 설정값들을 하나하나 상세히 파헤쳐 보겠습니다. 🚀

쿠버네티스 리소스를 개별 YAML로 관리하는 것은 매우 고통스러운 일입니다. Kyverno처럼 많은 CRD(Custom Resource Definitions)와 복잡한 Webhook 설정을 가진 솔루션은 더욱 그렇습니다.
- 버전 관리: 특정 버전의 Kyverno를 손쉽게 배포하고 롤백할 수 있습니다.
- 설정 자동화: 고가용성(HA) 설정이나 리소스 제한(Limit) 등을 values.yaml 파일 하나로 중앙 관리할 수 있습니다.
- 유지보수: helm upgrade 명령어 한 줄로 최신 보안 패치를 적용할 수 있습니다.
🏗️ 1단계: Kyverno 공식 Helm 레포지토리 등록
가장 먼저 할 일은 Kyverno 공식 차트 저장소를 추가하는 것입니다.
# 레포지토리 추가
helm repo add kyverno https://kyverno.github.io/kyverno/
# 최신 차트 정보 업데이트
helm repo update
# 설치 전 차트 버전 확인
helm search repo kyverno
⚙️ 2단계: 핵심 중의 핵심, values.yaml 주요 설정 파헤치기
단순히 helm install을 입력하기보다, 우리 서비스 환경에 맞게 설정을 커스터마이징하는 것이 중요합니다. KCA 시험과 실무에서 가장 비중 있게 다루는 values.yaml의 핵심 파라미터들을 정리했습니다.
① 고가용성 및 복제본 (Replica & HA) 🚀
운영 환경에서는 Kyverno Pod이 하나만 있으면 위험합니다. API 서버가 Kyverno에 응답을 못 받으면 리소스 생성이 막힐 수 있기 때문이죠.
- replicaCount: 최소 3개 이상을 권장합니다.
- topologySpreadConstraints: 여러 노드나 존(Zone)에 Pod을 골고루 분산시켜 가용성을 높입니다.
replicaCount: 3
podDisruptionBudget:
minAvailable: 1
② 리소스 관리 (Resources & Webhook) 🔋
Kyverno는 클러스터의 모든 요청을 검사하므로 리소스 할당과 타임아웃 설정이 매우 중요합니다.
- resources: requests와 limits를 설정하여 OOM(Out Of Memory)을 방지합니다.
- webhook.timeoutSeconds: Webhook 응답 대기 시간을 설정합니다. (기본 10초, 너무 길면 API 응답 속도가 저하됩니다.)
resources:
limits:
memory: 512Mi
requests:
cpu: 100m
memory: 256Mi
③ 서비스 및 통신 보안 (Service & RBAC) 🔒
Kyverno가 API 서버와 어떻게 통신하고 어떤 권한을 가질지 결정합니다.
- admissionController.container.image.tag: 사용할 Kyverno 버전을 명시적으로 지정합니다.
- rbac.create: Kyverno가 필요한 권한을 자동으로 생성하게 할지 결정합니다. (기본값 true)
- certManager.enabled: 외부 cert-manager를 사용하여 인증서를 관리할지 여부입니다.
④ 정책 보고 및 배경 스캔 (Background & Reports) 📋
- backgroundController.enabled: 기존 리소스에 대한 주기적인 정책 준수 스캔 여부를 결정합니다.
- cleanupController.enabled: 유효 기간이 지난 리소스를 삭제하는 기능을 활성화합니다.
📄 Kyverno 최적화 my-values.yaml 예제
# ---------------------------------------------------------
# 1. 복제본 및 고가용성 (HA) 설정
# ---------------------------------------------------------
replicaCount: 3
# Pod 분산 정책: 여러 노드에 균등하게 배포하여 가용성 확보
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/instance: kyverno
# 업그레이드 중에도 최소 1개의 Pod은 항상 가용 상태 유지
podDisruptionBudget:
minAvailable: 1
# ---------------------------------------------------------
# 2. 리소스 할당 및 타임아웃 (성능 최적화)
# ---------------------------------------------------------
admissionController:
container:
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
# Webhook 타임아웃: 너무 짧으면 요청이 실패하고, 너무 길면 API 응답이 느려짐
webhook:
timeoutSeconds: 15
# ---------------------------------------------------------
# 3. 인증서 관리 (cert-manager 연동 시)
# ---------------------------------------------------------
# 내부 자체 인증서 대신 외부 cert-manager를 사용하려면 true로 설정
certManager:
enabled: false
# ---------------------------------------------------------
# 4. 모니터링 및 메트릭 활성화
# ---------------------------------------------------------
# Prometheus 및 Grafana 연동을 위한 메트릭 서비스 활성화
metricsService:
enabled: true
serviceMonitor:
enabled: false # Prometheus Operator가 설치되어 있다면 true로 변경
# ---------------------------------------------------------
# 5. 배경 스캔 및 리소스 청소 (Controller 설정)
# ---------------------------------------------------------
backgroundController:
enabled: true
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
cleanupController:
enabled: true # 유효 기간 지난 리소스 자동 삭제 기능 활성화
resources:
requests:
cpu: 50m
memory: 64Mi
# ---------------------------------------------------------
# 6. 보안 및 필터링 (RBAC & Filters)
# ---------------------------------------------------------
# 특정 네임스페이스나 리소스를 검사 대상에서 제외 (장애 방지)
config:
resourceFilters:
- "[Event,*,*]"
- "[*,kube-system,*]"
- "[*,kube-public,*]"
- "[*,kube-node-lease,*]"
- "[Node,*,*]"
- "[APIService,*,*]"
- "[TokenReview,*,*]"
- "[SubjectAccessReview,*,*]"
- "[SelfSubjectAccessReview,*,*]"
🚀 3단계: 실제 설치 명령어 실행
최적화된 my-values.yaml 파일을 준비했다면, 아래 명령어로 설치를 진행합니다.
# 네임스페이스 생성
kubectl create namespace kyverno
# 최적화된 설정으로 설치
helm install kyverno kyverno/kyverno -n kyverno -f my-values.yaml
설치가 완료되면 반드시 아래 명령어로 모든 컴포넌트가 Running 상태인지 확인하세요! kubectl get pods -n kyverno
🔍 4단계: 설치 후 사용자 정의 설정 검증
설치가 끝났다고 끝이 아닙니다. 우리가 설정한 값이 제대로 반영되었는지 확인해야 합니다.
- CRD 확인: Kyverno가 사용하는 정책 리소스들이 잘 생성되었는지 확인합니다. (kubectl get crd | grep kyverno)
- Webhook 확인: API 서버에 Kyverno 웹훅이 잘 등록되었는지 확인합니다. (kubectl get mutatingwebhookconfigurations)
- ConfigMap 확인: 필터링 설정 등이 반영된 ConfigMap을 확인합니다.
💡 운영자를 위한 실무 팁
- Dry-run 활용: helm install --dry-run --debug를 사용하여 실제 설치 전에 생성될 YAML을 미리 검토하세요.
- Resource Filters: kube-system 네임스페이스 등 핵심 시스템 리소스는 정책 검사에서 제외하여 장애 전파를 막는 것이 안전합니다.
- Prometheus 연동: metricsService.enabled: true 설정을 통해 Grafana에서 Kyverno의 상태를 실시간으로 모니터링하세요.
🌟 마치며
오늘은 Helm을 이용해 Kyverno를 스마트하게 설치하고, values.yaml의 주요 설정들을 어떻게 최적화하는지 알아보았습니다. "기본 설정은 누구나 할 수 있지만, 정교한 튜닝은 안정적인 클러스터를 만드는 첫걸음입니다." 오늘 배운 설정값들을 잘 활용하셔서 탄탄한 보안 환경을 구축하시길 바랍니다.
다음 시간에는 드디어 많은 분이 기다리시던 **Chapter 3. Writing Policies (정책 작성법)**를 통해 실제 규칙(Rule)들을 어떻게 코딩하는지 다뤄보겠습니다. 기대해 주세요! 🙋♂️
'클라우드 > Kyverno' 카테고리의 다른 글
| [Kyverno] Policy(네임스페이스 단위) vs ClusterPolicy(클러스터 전체)의 차이 (0) | 2026.01.05 |
|---|---|
| [Kyverno] 고가용성(HA)을 위한 복제본 구성 및 리소스 할당 (0) | 2026.01.05 |
| 🏗️ Kyverno 아키텍처: 왜 "Kubernetes Native"인가? (0) | 2026.01.05 |
| 🚫 Kyverno는 왜 ValidatingWebhookConfiguration과 MutatingWebhookConfiguration을 제어할 수 없을까? (0) | 2025.12.30 |
| [Kyverno]퀵 스타트 가이드 (Quick Start Guides) (0) | 2025.12.29 |