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 applyCLI로 배포 전 매니페스트를 정책 검증한다. - 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가 정답이다.