Skip to content

필사 모드: Kyverno 아키텍처 내부 분석: Kubernetes 네이티브 정책 엔진

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

1. Kyverno란

1.1 Kubernetes 네이티브 정책 엔진

Kyverno는 Kubernetes를 위해 설계된 정책 엔진입니다. OPA/Gatekeeper와 달리 **별도의 정책 언어 없이 YAML과 CEL로 정책을 정의**할 수 있어 Kubernetes 사용자에게 친숙합니다.

핵심 특징:

- YAML 기반 정책 정의 (Rego 학습 불필요)

- Kubernetes 리소스로 정책 관리 (kubectl로 CRUD)

- validate, mutate, generate, verifyImages 4가지 규칙 타입

- CEL(Common Expression Language) 지원

- 백그라운드 스캐닝으로 기존 리소스에도 정책 적용

1.2 CNCF 프로젝트 현황

Kyverno는 CNCF **Incubating** 프로젝트로, 활발한 커뮤니티와 빠른 릴리스 주기를 가지고 있습니다.

2. 아키텍처 개요

2.1 컨트롤러 구성

+-------------------+ +------------------------+

| Kubernetes | | Kyverno |

| API Server | | |

| | | +--------------------+ |

| Webhook --------->|---->| | Admission | |

| (Mutating/ | | | Controller | |

| Validating) | | +--------------------+ |

| | | |

| | | +--------------------+ |

| | | | Background | |

| | | | Controller | |

| | | +--------------------+ |

| | | |

| | | +--------------------+ |

| | | | Reports | |

| | | | Controller | |

| | | +--------------------+ |

+-------------------+ +------------------------+

**Admission Controller**: API 요청을 가로채서 정책을 실시간 적용

- MutatingWebhookConfiguration: mutate 규칙 처리

- ValidatingWebhookConfiguration: validate 규칙 처리

**Background Controller**: 기존 리소스에 대한 정책 평가

- 주기적으로 클러스터의 기존 리소스를 스캔

- generate 규칙의 동기화(synchronize) 처리

**Reports Controller**: 정책 보고서 생성 및 관리

- PolicyReport / ClusterPolicyReport CRD 관리

- 정책 위반 결과를 리소스로 저장

2.2 Webhook 구성

Kyverno는 설치 시 자동으로 Webhook을 구성합니다:

Kyverno가 자동 생성하는 MutatingWebhookConfiguration

apiVersion: admissionregistration.k8s.io/v1

kind: MutatingWebhookConfiguration

metadata:

name: kyverno-resource-mutating-webhook-cfg

webhooks:

- name: mutate.kyverno.svc-fail

clientConfig:

service:

name: kyverno-svc

namespace: kyverno

path: /mutate/fail

rules:

- apiGroups: ['*']

apiVersions: ['*']

operations: ['CREATE', 'UPDATE']

resources: ['*']

failurePolicy: Fail

sideEffects: None

timeoutSeconds: 10

2.3 failurePolicy 설정

| 설정 | 동작 | 사용 시나리오 |

| ------ | ------------------------- | ---------------------- |

| Fail | Webhook 실패 시 요청 거부 | 프로덕션 보안 정책 |

| Ignore | Webhook 실패 시 요청 허용 | 초기 도입, 비핵심 정책 |

3. 정책 타입

3.1 ClusterPolicy vs Policy

ClusterPolicy: 클러스터 전체에 적용

apiVersion: kyverno.io/v1

kind: ClusterPolicy

metadata:

name: require-labels

spec:

validationFailureAction: Enforce

rules:

- name: check-labels

match:

any:

- resources:

kinds:

- Pod

validate:

message: "Label 'app.kubernetes.io/name' is required"

pattern:

metadata:

labels:

app.kubernetes.io/name: '?*'

Policy: 특정 네임스페이스에만 적용

apiVersion: kyverno.io/v1

kind: Policy

metadata:

name: require-labels

namespace: production

spec:

validationFailureAction: Enforce

rules:

- name: check-labels

match:

any:

- resources:

kinds:

- Pod

validate:

message: "Label 'app.kubernetes.io/name' is required"

pattern:

metadata:

labels:

app.kubernetes.io/name: '?*'

3.2 validationFailureAction

| 모드 | 동작 |

| ------- | ---------------------------------- |

| Enforce | 정책 위반 시 요청 거부 |

| Audit | 정책 위반을 기록하지만 요청은 허용 |

spec:

validationFailureAction: Audit # 또는 Enforce

validationFailureActionOverrides:

- action: Enforce

namespaces:

- production

- action: Audit

namespaces:

- development

4. 규칙 타입

4.1 validate - 검증

리소스가 정책을 충족하는지 검증:

rules:

- name: validate-resources

match:

any:

- resources:

kinds:

- Deployment

validate:

message: 'CPU and memory limits are required'

pattern:

spec:

template:

spec:

containers:

- resources:

limits:

memory: '?*'

cpu: '?*'

4.2 mutate - 변형

리소스를 자동으로 수정:

rules:

- name: add-default-labels

match:

any:

- resources:

kinds:

- Deployment

- StatefulSet

mutate:

patchStrategicMerge:

metadata:

labels:

app.kubernetes.io/managed-by: kyverno

4.3 generate - 생성

리소스 생성 시 관련 리소스를 자동 생성:

rules:

- name: generate-networkpolicy

match:

any:

- resources:

kinds:

- Namespace

generate:

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

name: default-deny

namespace: '{{ request.object.metadata.name }}'

synchronize: true

data:

spec:

podSelector: {}

policyTypes:

- Ingress

- Egress

4.4 verifyImages - 이미지 검증

컨테이너 이미지의 서명과 증명을 검증:

rules:

- name: verify-image-signature

match:

any:

- resources:

kinds:

- Pod

verifyImages:

- imageReferences:

- 'ghcr.io/myorg/*'

attestors:

- entries:

- keyless:

url: https://fulcio.sigstore.dev

roots: |

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

5. match/exclude 필터링

5.1 리소스 매칭

rules:

- name: my-rule

match:

any:

- resources:

kinds:

- Deployment

- StatefulSet

namespaces:

- production

- staging

names:

- 'web-*'

selector:

matchLabels:

tier: frontend

- resources:

kinds:

- Service

exclude:

any:

- resources:

namespaces:

- kube-system

- kyverno

- subjects:

- kind: ServiceAccount

name: admin-sa

namespace: kube-system

- clusterRoles:

- cluster-admin

6. 설치 및 기본 구성

Helm으로 설치

helm repo add kyverno https://kyverno.github.io/kyverno/

helm repo update

helm install kyverno kyverno/kyverno -n kyverno --create-namespace

HA 구성

helm install kyverno kyverno/kyverno -n kyverno --create-namespace \

--set admissionController.replicas=3 \

--set backgroundController.replicas=2 \

--set reportsController.replicas=2

정책 라이브러리 확인

https://kyverno.io/policies/

7. 정리

Kyverno 아키텍처의 핵심:

1. **Kubernetes 네이티브**: YAML/CEL 기반 정책, kubectl로 관리

2. **3개 컨트롤러**: Admission(실시간), Background(기존 리소스), Reports(보고서)

3. **4가지 규칙 타입**: validate, mutate, generate, verifyImages

4. **유연한 매칭**: 리소스 종류, 네임스페이스, 사용자, 역할별 필터링

5. **Audit/Enforce 모드**: 점진적 정책 도입 지원

다음 글에서는 Kyverno의 정책 엔진 내부 동작을 심층 분석합니다.

현재 단락 (1/228)

Kyverno는 Kubernetes를 위해 설계된 정책 엔진입니다. OPA/Gatekeeper와 달리 **별도의 정책 언어 없이 YAML과 CEL로 정책을 정의**할 수 있어 Ku...

작성 글자: 0원문 글자: 4,693작성 단락: 0/228