K8s Kyverno 정책 엔진 심화

Kyverno란?

Kyverno는 Kubernetes 네이티브 정책 엔진이다. OPA Gatekeeper가 Rego라는 별도 언어를 사용하는 반면, Kyverno는 YAML만으로 정책을 작성한다. Kubernetes 리소스 매니페스트를 작성할 줄 알면 바로 정책을 만들 수 있어 학습 곡선이 낮다.

핵심 개념: 정책 타입 3가지

정책 타입 동작 용도
Validate 조건 미충족 시 리소스 생성 거부 보안 정책 강제, 컨벤션 검증
Mutate 리소스를 자동 수정 기본값 주입, 라벨 자동 추가
Generate 리소스 생성 시 연관 리소스 자동 생성 NetworkPolicy 자동 생성, 기본 리소스 프로비저닝

Validate: 보안 정책 강제

latest 태그 금지

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Enforce  # Audit(경고만) 또는 Enforce(차단)
  rules:
  - name: require-image-tag
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "이미지 태그 'latest'는 사용할 수 없습니다. 고정 버전을 지정하세요."
      pattern:
        spec:
          containers:
          - image: "!*:latest"

리소스 제한 필수화

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-limits
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "모든 컨테이너에 CPU/메모리 limits를 설정해야 합니다."
      pattern:
        spec:
          containers:
          - resources:
              limits:
                memory: "?*"
                cpu: "?*"

root 사용자 실행 차단

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-run-as-root
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-runasnonroot
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "컨테이너는 root로 실행할 수 없습니다."
      pattern:
        spec:
          containers:
          - securityContext:
              runAsNonRoot: true

Mutate: 리소스 자동 수정

기본 라벨 자동 주입

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-default-labels
spec:
  rules:
  - name: add-team-label
    match:
      any:
      - resources:
          kinds:
          - Pod
          - Deployment
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            +(managed-by): "kyverno"
            +(environment): "{{request.namespace}}"

+(key) 구문은 해당 라벨이 없을 때만 추가한다. 이미 존재하면 덮어쓰지 않는다.

이미지 레지스트리 강제 변환

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: replace-image-registry
spec:
  rules:
  - name: redirect-to-internal
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      foreach:
      - list: "request.object.spec.containers"
        patchStrategicMerge:
          spec:
            containers:
            - name: "{{element.name}}"
              image: "{{regex_replace_all('docker\.io', element.image, 'registry.internal')}}"

외부 Docker Hub 이미지를 사내 미러 레지스트리로 자동 리다이렉트한다. 네트워크가 제한된 환경에서 필수적인 패턴이다.

Generate: 연관 리소스 자동 생성

# 네임스페이스 생성 시 기본 NetworkPolicy 자동 생성
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: generate-default-netpol
spec:
  rules:
  - name: default-deny-ingress
    match:
      any:
      - resources:
          kinds:
          - Namespace
    generate:
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      name: default-deny-ingress
      namespace: "{{request.object.metadata.name}}"
      data:
        spec:
          podSelector: {}
          policyTypes:
          - Ingress

  - name: default-limitrange
    match:
      any:
      - resources:
          kinds:
          - Namespace
    generate:
      apiVersion: v1
      kind: LimitRange
      name: default-limits
      namespace: "{{request.object.metadata.name}}"
      data:
        spec:
          limits:
          - default:
              cpu: "500m"
              memory: "512Mi"
            defaultRequest:
              cpu: "100m"
              memory: "128Mi"
            type: Container

새 네임스페이스가 생성될 때마다 Deny-All NetworkPolicy기본 LimitRange가 자동 생성된다. K8s NetworkPolicy 제로 트러스트 설계의 기반을 자동화할 수 있다.

고급 기능: CEL 표현식과 외부 데이터

CEL 표현식 (Kyverno 1.11+)

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: check-replica-count
spec:
  validationFailureAction: Enforce
  rules:
  - name: min-replicas
    match:
      any:
      - resources:
          kinds:
          - Deployment
    validate:
      cel:
        expressions:
        - expression: "object.spec.replicas >= 2"
          message: "프로덕션 Deployment는 최소 2개 레플리카가 필요합니다."

Image Verification: 서명 검증

# cosign으로 서명된 이미지만 허용
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signature
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-cosign
    match:
      any:
      - resources:
          kinds:
          - Pod
    verifyImages:
    - imageReferences:
      - "registry.internal/*"
      attestors:
      - entries:
        - keys:
            publicKeys: |-
              -----BEGIN PUBLIC KEY-----
              MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
              -----END PUBLIC KEY-----

Cosign/Sigstore로 서명된 이미지만 클러스터에 배포할 수 있도록 강제한다. 소프트웨어 공급망 보안(Supply Chain Security)의 핵심 정책이다.

Kyverno vs OPA Gatekeeper

비교 항목 Kyverno OPA Gatekeeper
정책 언어 YAML (K8s 네이티브) Rego (전용 언어)
학습 곡선 낮음 높음 (Rego 학습 필요)
Mutate 지원 ✅ 네이티브 ⚠️ Alpha (Mutation)
Generate 지원
이미지 서명 검증 ✅ 내장 ❌ 별도 도구 필요
범용성 K8s 전용 범용 (K8s 외 사용 가능)
복잡 로직 ⚠️ 제한적 ✅ Rego의 풍부한 표현력

단순한 정책은 Kyverno, 복잡한 크로스 리소스 검증은 OPA Gatekeeper가 유리하다. 둘을 병행하는 팀도 있다.

운영 베스트 프랙티스

  • Audit → Enforce 단계적 적용 — 새 정책은 반드시 validationFailureAction: Audit으로 시작해 위반 현황을 파악한 후 Enforce로 전환한다.
  • exclude로 시스템 네임스페이스 제외kube-system, kyverno 등 시스템 네임스페이스는 정책에서 제외한다.
  • Policy Reporter 연동 — Kyverno Policy Reporter를 설치하면 정책 위반 현황을 Grafana 대시보드로 모니터링할 수 있다.
  • CI/CD에서 사전 검증kyverno apply CLI로 배포 전 매니페스트를 정책 검증한다.
  • Background Scan — Kyverno는 기존 리소스도 주기적으로 스캔한다. 정책 적용 이전에 생성된 리소스도 위반으로 감지된다.
# 시스템 네임스페이스 제외 예시
spec:
  rules:
  - name: check-something
    exclude:
      any:
      - resources:
          namespaces:
          - kube-system
          - kube-public
          - kyverno

# CI에서 정책 사전 검증
kyverno apply ./policies/ --resource ./manifests/deployment.yaml

정리

Kyverno는 YAML만으로 Kubernetes 정책을 관리할 수 있는 가장 진입장벽이 낮은 정책 엔진이다. Validate로 보안 기준을 강제하고, Mutate로 기본값을 주입하고, Generate로 연관 리소스를 자동 프로비저닝한다. 이미지 서명 검증까지 내장되어 있어 소프트웨어 공급망 보안도 하나의 도구로 해결할 수 있다. Rego를 배울 여유가 없는 팀이라면 Kyverno가 정답이다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux