Skip to content
Published on

Kyverno vs OPA/Gatekeeper: 정책 엔진 비교 분석

Authors

1. 아키텍처 비교

1.1 Kyverno

  • Kubernetes 네이티브 설계
  • 3개의 컨트롤러: Admission, Background, Reports
  • 정책이 Kubernetes CRD(ClusterPolicy/Policy)
  • 하나의 프로젝트에서 validate, mutate, generate, verifyImages 모두 지원

1.2 OPA/Gatekeeper

  • OPA는 범용 정책 엔진, Gatekeeper는 Kubernetes 어댑터
  • Webhook Controller + Audit Controller
  • ConstraintTemplate(정책 스키마) + Constraint(정책 인스턴스) 2계층 모델
  • validate 중심, mutation은 Gatekeeper v3.10+에서 별도 알파 지원

2. 정책 언어 비교

2.1 Kyverno: YAML + CEL

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: Enforce
  rules:
    - name: check-app-label
      match:
        any:
          - resources:
              kinds:
                - Deployment
      validate:
        message: "Label 'app.kubernetes.io/name' is required"
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: '?*'

2.2 OPA/Gatekeeper: Rego

# ConstraintTemplate 정의
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
      validation:
        openAPIV3Schema:
          type: object
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels
        violation[{"msg": msg}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("Missing required labels: %v", [missing])
        }

---
# Constraint 인스턴스
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: require-app-label
spec:
  match:
    kinds:
      - apiGroups: ['apps']
        kinds: ['Deployment']
  parameters:
    labels:
      - 'app.kubernetes.io/name'

2.3 비교 요약

항목KyvernoOPA/Gatekeeper
정책 언어YAML + CELRego
학습 곡선낮음 (K8s YAML 경험 활용)높음 (Rego 별도 학습)
정책 구조ClusterPolicy 1개 리소스ConstraintTemplate + Constraint 2개
재사용성include/exclude로 범위 조정ConstraintTemplate으로 파라미터화
표현력패턴 매칭 + CELRego (튜링 완전)
디버깅kubectl + 정책 보고서OPA playground + Rego 테스트

3. 기능 비교

3.1 Validation

기능KyvernoOPA/Gatekeeper
패턴 매칭네이티브 지원Rego로 구현
CEL 지원지원v3.16+ 지원
조건부 검증앵커 시스템Rego 로직
foreach지원Rego 반복문
외부 데이터 참조API call, ConfigMapExternal Data Provider

3.2 Mutation

기능KyvernoOPA/Gatekeeper
Strategic Merge Patch지원미지원
JSON Patch지원알파 지원 (v3.10+)
조건부 변형지원제한적
foreach 변형지원미지원

3.3 Generation

기능KyvernoOPA/Gatekeeper
리소스 자동 생성네이티브 지원미지원
리소스 클론지원미지원
동기화지원미지원

3.4 Image Verification

기능KyvernoOPA/Gatekeeper
cosign 서명 검증네이티브 지원외부 도구 필요
Notary v2지원미지원
Attestation 검증지원외부 도구 필요
SBOM 검증지원미지원

4. 성능 비교

4.1 Webhook 레이턴시

일반적인 정책 수에서의 평균 레이턴시:

정책 수KyvernoOPA/Gatekeeper
10개~5ms~3ms
50개~15ms~8ms
100개~30ms~15ms
500개~80ms~40ms

OPA/Gatekeeper는 Rego 정책을 미리 컴파일하여 평가 속도가 빠르지만, Kyverno는 YAML 파싱 오버헤드가 있습니다.

4.2 메모리 사용량

구성KyvernoOPA/Gatekeeper
기본 설치~200MB~150MB
100개 정책~500MB~300MB
리포트 활성화 시+200MB+100MB (Audit)

4.3 성능 최적화 팁

Kyverno:

  • match/exclude를 세밀하게 설정하여 불필요한 정책 평가 방지
  • webhookTimeoutSeconds 적절히 설정
  • Reports Controller 별도 스케일링

OPA/Gatekeeper:

  • Data Sync 최소화
  • Constraint 범위를 좁게 설정
  • Audit 주기 최적화

5. 생태계 비교

5.1 정책 라이브러리

항목KyvernoOPA/Gatekeeper
공식 정책 수300+ (kyverno.io/policies)200+ (OPA Library)
Pod Security Standards내장 정책 제공별도 라이브러리
커뮤니티CNCF IncubatingCNCF Graduated

5.2 도구 통합

도구KyvernoOPA/Gatekeeper
ArgoCD지원지원
Flux지원지원
Backstage플러그인 있음플러그인 있음
Prometheus메트릭 내장메트릭 내장

6. 마이그레이션 가이드

6.1 OPA에서 Kyverno로

  1. ConstraintTemplate의 Rego 로직을 Kyverno YAML 패턴으로 변환
  2. Constraint의 match 조건을 Kyverno match/exclude로 변환
  3. 파라미터를 Kyverno 변수(JMESPath, context)로 대체
  4. Audit 모드로 먼저 배포하여 동작 검증
  5. 점진적으로 Enforce 모드로 전환

6.2 선택 가이드

Kyverno를 선택할 때:

  • Kubernetes 전용 환경
  • YAML에 익숙한 팀
  • mutation, generation, image verification이 필요한 경우
  • 학습 곡선을 최소화하고 싶은 경우

OPA/Gatekeeper를 선택할 때:

  • Kubernetes 외 환경에서도 OPA를 사용하는 경우
  • 복잡한 정책 로직이 필요한 경우 (Rego의 표현력)
  • 대규모 정책에서 성능이 중요한 경우
  • 이미 Rego에 익숙한 팀

7. 정리

비교 항목KyvernoOPA/Gatekeeper
접근성높음 (YAML 기반)중간 (Rego 학습 필요)
기능 범위넓음 (4가지 규칙 타입)좁음 (validation 중심)
성능보통우수
표현력보통 (CEL로 보완)높음 (Rego)
이미지 검증네이티브외부 도구 필요
생태계 성숙도IncubatingGraduated

두 도구 모두 프로덕션에서 검증되었으며, 팀의 역량과 요구사항에 따라 선택하면 됩니다.