Kyverno는 Kubernetes 용 policy engine입니다. Kyverno 정책을 활용하여 kubernetes 리소스가 정책에 부합하는지 검사하고, 필요하면 리소스를 변경하거나 생성할 수 있습니다. 이 문서에서는 Kyverno 구조 및 동작 방식과 활용 방안을 간략히 소개합니다.
맛보기 : Kyverno 정책 설정 및 활용 예시
먼저 모든 Pod는 app.kubernetes.io/name 라벨을 포함하도록 하는 규칙을 포함하는 아래 정책을 배포하고 실제로 어떻게 동작하는지 확인해보려고 합니다.
A. Policy 적용하기
아래와 같이 예시 정책을 적용합니다. 만일 아직 Kyverno가 설치되지 않았다면 아래 설치하기 섹션을 먼저 진행합니다.
kubectl create -f- << EOF apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-labels spec: validationFailureAction: enforce rules: - name: check-for-labels match: any: - resources: kinds: - Pod exclude: resources: namespaces: - kube-system - kyverno validate: message: "label 'app.kubernetes.io/name' is required" pattern: metadata: labels: app.kubernetes.io/name: "?*" EOF |
B. 정책 위반 시 차단(enforce) 예시
이제 아래와 같이 라벨 없이 Deployment 생성을 시도해보면,
kubectl create deployment nginx --image=nginx |
아래와 같은 에러를 확인할 수 있습니다.
TIP. ClusterPolicy에는 Pods에 매칭하도록 되어 있지만, Kyverno는 기본적으로 Pods를 생성하는(위 예시의 Deployment를 포함하는) 모든 sources에 적용됩니다.
C. 정책 위반 시 감사(audit) 예시
위의 Policy에서 validationFailureAction를 audit을로 변경하여 적용한 후 동일하게 테스트해보면 이번에는 에러 없이 배포되지만, 해당 pod을 describe해 보면 아래와 같은 로그를 확인할 수 있습니다.
이제 테스트로 생성한 deployment를 삭제하여 정리합니다.
kubectl delete deployment nginx |
D. 정책을 준수하는 경우 예시
다시 위의 Policy에서 validationFailureAction를 enforce로 변경하여 적용한 후 아래와 같이 이름 라벨을 포함하도록 Pod를 생성하면 이 Pod 설정은 정책에 부합하므로 차단되지 않고 warning도 발생하지 않습니다.
kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx |
Kyverno의 특징 (vs. OPA Gatekeeper)
- Kyverno는 Kubernetes native
- 새로운 언어를 배울 필요 없음. OPA Gatekeeper는 독자적인 policy 언어인 Rego를 사용하여 policy를 정의
- OPA Gatekeeper와 유사하게 pre-defined policy library 제공
구조 및 동작 방식
Kyverno는 Kubernetes Cluster에서 dynamic admission controller로 동작합니다. Kyverno는 kube-apiserver로부터 admission HTTP callback들의 확인 또는 변경을 수신하고, 정책 수용과 요청 거절을 반환하기 위한 정책을 적용합니다.
- Webhook : kube-apiserver의 AdmissionReview 요청을 처리
- Monitor : webhook에 필요한 설정을 생성하고 관리
- PolicyController : policy 리소스를 감시하며, 설정된 스캔 간격에 따라서 백그라운드 스캔을 시작
- GenerateController : 생성된 리소스들의 생명주기를 관리
설치하기
Kyverno는 최신 버전의 manifest 또는 Helm을 사용하여 설치할 수 있습니다.
A. Manifest를 이용한 설치
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml |
B. Helm chart를 이용한 설치 (High Availability)
# Add the Helm repository helm repo add kyverno https://kyverno.github.io/kyverno/ # Scan your Helm repositories to fetch the latest available charts. helm repo update # Install the Kyverno Helm chart into a new namespace called "kyverno" helm install kyverno kyverno/kyverno -n kyverno --create-namespace --set replicaCount=3 |
C. Compatibility Matrix (원본 링크)
- Kubernetes 1.23.0-1.23.2의 알려진 문제 때문에 1.23 버전은 1.23.3부터 지원합니다.
- Kyverno v1.7.0은 N-2 version에 호환하는 Kubernetes project와 동일한 정책을 따릅니다. 일반적으로는 이전 버전에서도 동작하겠지만, 테스트되지는 않았습니다.
Policies and Rules
Policy는 Rule들의 집합이고, 각 rule은 하나의 match와 mutate, validate, generate resource 또는 verifyImages 중 하나로 구성됩니다. Policy의 종류(kind)는 클러스터 전체에 적용되는 ClusterPolicy와 namespace에 적용되는 Policy가 있습니다.
정책은 정의된 순서대로 적용됩니다. admission control에서 mutation 규칙은 validation 규칙 전에 적용되기 때문에 mutation에 의한 결과를 validation할 수 있습니다. 모든 mutation 규칙은 모든 정책에서 validation 규칙이 적용되기 전에 적용됩니다.
Example Policies
- Kyverno Official Policies : https://kyverno.io/policies
- aws-eks-best-practices/policies/kyverno at master · aws/aws-eks-best-practices
참고 자료
- Kyverno Official Page : Introduction
'고기 대신 SW 한점 > Public Cloud' 카테고리의 다른 글
Istio - Observability (0) | 2023.01.17 |
---|---|
[Public Cloud] Pod test (0) | 2023.01.10 |
[AWS] LandingZone - VPC Design (1) | 2023.01.06 |
[AWS] LandingZone - OU 설계안 (0) | 2023.01.06 |
[AWS] HPA - Horizontal Pod Autoscaler (0) | 2023.01.05 |