Kyverno

개요

키베르노는 어드미션 컨트롤에서 웹훅을 통해 승인 제어 정책을 마음대로 짤 수 있도록 도와주는 애드온이다.
최근 Validation Admission Policy 등을 통해 쿠버 자체적으로 동적 정책 구성을 지원하려고 하고 있지만, 이 애드온이 상당히 완성도가 높아서 앞으로도 꾸준히 수요는 있을 것으로 생각된다.

일단 문서가 정리 수준이 가히 GOAT라고 할 수 있을 정도로 읽기 편하게 돼있다..!
심지어 정책 예시를 위한 페이지가 따로 마련돼있어서, 여기에서 몇 개 적용을 하는 식으로만 사용해도 크게 문제 없을 정도이다..[1]

특징

동작 원리


Admission Webhook을 보면 간단하게 어드미션 요청을 웹훅을 쏠 수 있지만, 키베르노는 여기에 각종 다양한 추가 기능이 내장돼있다.
가령 시크릿에 저장된 인증서를 갱신시키거나, 정책에 위반된 요청을 리포트한다던가.

실제로 설치를 하게 된다면, 띄워지는 오브젝트는 다음과 같다.
워크로드로 보자면 4개가 구조적으로 분리돼있다.

오브젝트 구조

여기에서 전반적인 오브젝트들과 사용법을 담는다.
직접 만들어보고 실험을 해보고 싶다면 플레이그라운드로 테스트를 해보는 것도 가능하다.[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

참고


  1. https://kyverno.io/policies/ ↩︎

  2. https://playground.kyverno.io/#/ ↩︎