본문 바로가기
클라우드/Kyverno

[kyverno]🛠️ 왜 Helm으로 설치해야 할까요?

by gasbugs 2026. 1. 5.

안녕하세요! 쿠버네티스 보안의 핵심, Kyverno 시리즈의 두 번째 시간입니다. 🛡️

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

 

쿠버네티스 리소스를 개별 YAML로 관리하는 것은 매우 고통스러운 일입니다. Kyverno처럼 많은 CRD(Custom Resource Definitions)와 복잡한 Webhook 설정을 가진 솔루션은 더욱 그렇습니다.

  • 버전 관리: 특정 버전의 Kyverno를 손쉽게 배포하고 롤백할 수 있습니다.
  • 설정 자동화: 고가용성(HA) 설정이나 리소스 제한(Limit) 등을 values.yaml 파일 하나로 중앙 관리할 수 있습니다.
  • 유지보수: helm upgrade 명령어 한 줄로 최신 보안 패치를 적용할 수 있습니다.

🏗️ 1단계: Kyverno 공식 Helm 레포지토리 등록

가장 먼저 할 일은 Kyverno 공식 차트 저장소를 추가하는 것입니다.

Bash
# 레포지토리 추가
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을 골고루 분산시켜 가용성을 높입니다.
YAML
replicaCount: 3
podDisruptionBudget:
  minAvailable: 1

② 리소스 관리 (Resources & Webhook) 🔋

Kyverno는 클러스터의 모든 요청을 검사하므로 리소스 할당과 타임아웃 설정이 매우 중요합니다.

  • resources: requests와 limits를 설정하여 OOM(Out Of Memory)을 방지합니다.
  • webhook.timeoutSeconds: Webhook 응답 대기 시간을 설정합니다. (기본 10초, 너무 길면 API 응답 속도가 저하됩니다.)
YAML
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단계: 설치 후 사용자 정의 설정 검증

설치가 끝났다고 끝이 아닙니다. 우리가 설정한 값이 제대로 반영되었는지 확인해야 합니다.

  1. CRD 확인: Kyverno가 사용하는 정책 리소스들이 잘 생성되었는지 확인합니다. (kubectl get crd | grep kyverno)
  2. Webhook 확인: API 서버에 Kyverno 웹훅이 잘 등록되었는지 확인합니다. (kubectl get mutatingwebhookconfigurations)
  3. 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)들을 어떻게 코딩하는지 다뤄보겠습니다. 기대해 주세요! 🙋‍♂️