Kyverno
개요
키베르노는 어드미션 컨트롤에서 웹훅을 통해 승인 제어 정책을 마음대로 짤 수 있도록 도와주는 애드온이다.
최근 Validation Admission Policy 등을 통해 쿠버 자체적으로 동적 정책 구성을 지원하려고 하고 있지만, 이 애드온이 상당히 완성도가 높아서 앞으로도 꾸준히 수요는 있을 것으로 생각된다.
일단 문서가 정리 수준이 가히 GOAT라고 할 수 있을 정도로 읽기 편하게 돼있다..!
심지어 정책 예시를 위한 페이지가 따로 마련돼있어서, 여기에서 몇 개 적용을 하는 식으로만 사용해도 크게 문제 없을 정도이다..[1]
특징
동작 원리
Admission Webhook을 보면 간단하게 어드미션 요청을 웹훅을 쏠 수 있지만, 키베르노는 여기에 각종 다양한 추가 기능이 내장돼있다.
가령 시크릿에 저장된 인증서를 갱신시키거나, 정책에 위반된 요청을 리포트한다던가.
실제로 설치를 하게 된다면, 띄워지는 오브젝트는 다음과 같다.
워크로드로 보자면 4개가 구조적으로 분리돼있다.
- admission controller - 승인 제어를 수행하는 핵심 컴포넌트
- background - 사용자의 정책을 동적으로 등록하고 관리하는 컴포넌트
- 그렇기에 정책을 만들 때, 이 친구한테 권한을 부여해야 하는 경우가 많을 것이다.
- reports - 정책들이 적용될 때 진행 내용을 담는 보고서([[#PolicyReport]]) 오브젝트를 관리하는 컴포넌트
- cleanup - 주기적으로 오브젝트를 청소하는 [[#CleanupPolicy]] 오브젝트를 관리하는 컴포넌트
오브젝트 구조
여기에서 전반적인 오브젝트들과 사용법을 담는다.
직접 만들어보고 실험을 해보고 싶다면 플레이그라운드로 테스트를 해보는 것도 가능하다.[2]
Policy
정책을 만들 때는 위와 같은 방식으로 만들면 된다.
하나의 정책을 작성하면 거기에 여러가지 규칙을 지정할 수 있다.
이 규칙은 여러 조건에 따라 요청을 필터링하고, 이후에는 검증하거나, 변형하거나, 생성하는 등의 동작을 수행할 수 있다.
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
background: false
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- "*"
operations:
- CREATE
validate:
failureAction: Audit
message: "The label `app.kubernetes.io/name` is required."
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
이게 예시인데, ClusterPolicy를 만들 수도 있고, 네임스페이스 Policy를 만들 수도 있다.
CleanupPolicy
apiVersion: kyverno.io/v2
kind: ClusterCleanupPolicy
metadata:
name: cleandeploy
spec:
match:
any:
- resources:
kinds:
- Deployment
selector:
matchLabels:
canremove: "true"
conditions:
any:
- key: "{{ target.spec.replicas }}"
operator: LessThan
value: 2
schedule: "*/5 * * * *"
정책 중 이렇게 청소를 하는 정책도 짤 수 있다.
이렇게 직접적으로 정책을 짜도 되지만, 그냥 오브젝트에 cleanup.kyverno.io/ttl: 2m
과 같은 식으로 라벨을 쓰면 알아서 또 지워준다.
PolicyReport
apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
creationTimestamp: "2023-12-06T13:19:03Z"
generation: 2
labels:
app.kubernetes.io/managed-by: kyverno
name: 487df031-11d8-4ab4-b089-dfc0db1e533e
namespace: kube-system
ownerReferences:
- apiVersion: v1
kind: Pod
name: kube-apiserver-kind-control-plane
uid: 487df031-11d8-4ab4-b089-dfc0db1e533e
resourceVersion: "720507"
uid: 0ec04a57-4c3d-492d-9278-951cd1929fe3
results:
- category: Pod Security Standards (Baseline)
message: validation rule 'adding-capabilities' passed.
policy: disallow-capabilities
result: pass
rule: adding-capabilities
scored: true
severity: medium
source: kyverno
timestamp:
nanos: 0
seconds: 1701868762
- category: Pod Security Standards (Baseline)
message: 'validation error: Sharing the host namespaces is disallowed. The fields
spec.hostNetwork, spec.hostIPC, and spec.hostPID must be unset or set to `false`.
rule host-namespaces failed at path /spec/hostNetwork/'
policy: disallow-host-namespaces
result: fail
rule: host-namespaces
scored: true
severity: medium
source: kyverno
timestamp:
nanos: 0
seconds: 1701868762
# ...
scope:
apiVersion: v1
kind: Pod
name: kube-apiserver-kind-control-plane
namespace: kube-system
uid: 487df031-11d8-4ab4-b089-dfc0db1e533e
summary:
error: 0
fail: 2
pass: 10
skip: 0
warn: 0
이건 직접 만드는 건 아니고, 정책이 적용됐을 때 이 정책이 적용된 결과를 키베르노에서 담는 오브젝트이다.
여태 요청들이 통과한 개수나, 실패한 이유 등등이 담긴다.
설치
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
헬름으로 딸깍 설치가 가능하다.
관련 문서
이름 | noteType | created |
---|---|---|
Kyverno | knowledge | 2025-03-17 |
E-Kyverno 기본 실습 | topic/explain | 2025-03-17 |
S-exec 명령어가 승인 제어에 걸리는 이유 | topic/shooting | 2025-03-17 |