25๋ ๋ AWS EKS Hands-on Study ์คํฐ๋ ์ ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
Kyverno

Kyverno๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ค์ดํฐ๋ธ ์ ์ฑ ์์ง์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค์ ๋ํ ์ ์ฑ ์ ์ ์ / ๊ฒ์ฆ / ๋ณํ / ์ ์ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ,
์ฟ ๋ฒ๋คํฐ์ค CRD๋ฅผ ํ์ฉํด YAML ๊ธฐ๋ฐ์ผ๋ก ์ ์ฑ ์ ์ ์ํ ์ ์๋ค.
Validation (๊ฒ์ฆ)
- ์๋ชป๋ ๋ฆฌ์์ค๊ฐ ํด๋ฌ์คํฐ์ ์์ฑ๋์ง ์๋๋ก ์ฐจ๋จํ๋ค.
- Admission Controller๋ก ๋์ํ์ฌ ์ ์ฑ ์ ๋ง์กฑํ์ง ์๋ ๋ฆฌ์์ค๋ Denied ์ฒ๋ฆฌํ๋ค.
Mutation (๋ณ๊ฒฝ)
- ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์์ ํ ์ ์๋ค.
- MutatingAdmissionWebhook์ ํ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ณํํ๋ค.
Generation (์์ฑ)
- ํน์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋ ๋ ์๋์ผ๋ก ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ด๋ Kubernetes ๋ฆฌ์์ค ํ ํ๋ฆฟ์ ์๋ํํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
Verification (์๋ช ๊ฒ์ฆ)
- ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์๋ช ์ ๊ฒ์ฆํ์ฌ ๋ณด์ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
kyverno ์ํคํ ์ฒ

Kyverno๋ Webhook, Engine, Report Controller, Background Controller ๋ฑ์ ์ฃผ์ ์ปดํฌ๋ํธ๋ก ๋์ํ๋ค.
Webhook Controller (์นํ ์ปจํธ๋กค๋ฌ)
- ValidatingWebhookConfiguration ๋ฐ MutatingWebhookConfiguration์ ๊ด๋ฆฌํ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ๊ฐ ์์ฒญ์ ๋ณด๋ผ ์ ์๋๋ก Webhook์ ๋ฑ๋กํ๋ค.
- ์๋์ผ๋ก TLS ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ์ฌ Webhook ๋ณด์์ ์ ์งํ๋ค.
- Webhook ์์ฒญ์ ๋ฐ์ผ๋ฉด Engine ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ์ฌ ์ ์ฑ ์ ์ ์ฉํ๋ค.
Engine Controller (์์ง ์ปจํธ๋กค๋ฌ)
- Kyverno ์ ์ฑ ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ์์ง์ผ๋ก ๋ณํ(Mutate), ๊ฒ์ฆ(Validate), ์์ฑ(Generate) ๋ฑ์ ์์ ์ ์ํํ๋ค.
- Webhook Controller์ ์ฐ๋ํ์ฌ ์์ฒญ์ ๊ฒ์ฌํ๊ณ ์ ์ฑ ์ ์ ์ฉํ๋ค.
- ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ค์บํ์ฌ ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ์ ์ฑ ์ ์ฉ ๊ฒฐ๊ณผ๋ฅผ etcd ์ ์ฅ์์ ๋ฐ์ํ๋ค.
Report Controllers (๋ฆฌํฌํธ ์ปจํธ๋กค๋ฌ)
- ์ ์ฑ ์ ์ฉ ๊ฒฐ๊ณผ๋ฅผ ์์งํ์ฌ ๋ฆฌํฌํธ ์์ฑํ๋ฉฐ ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ PolicyReport ๋ฆฌ์์ค ํํ๋ก ์ ์ฅํ๋ฉฐ, ๊ด๋ฆฌ์๋ kubectl get policyreport ๋ช ๋ น์ด๋ก ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
Background Controller (๋ฐฑ๊ทธ๋ผ์ด๋ ์ปจํธ๋กค๋ฌ)
- ๊ธฐ์กด ๋ฆฌ์์ค์๋ ์ ์ฑ ์ ์ ์ฉํ๋ค.
- Webhook ๋ฐฉ์์ด ์๋ ํด๋ฌ์คํฐ ๋ด ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ค์บํ๊ณ ์ ์ฑ ์๋ฐ ์ฌํญ์ ์๋์ผ๋ก ์์ ํ๊ฑฐ๋ ๋ณด๊ณ ํ๋ค.
kyverno ์ค์น
cat << EOF > kyverno-value.yaml
config:
resourceFiltersExcludeNamespaces: [ kube-system ]
admissionController:
serviceMonitor:
enabled: true
backgroundController:
serviceMonitor:
enabled: true
cleanupController:
serviceMonitor:
enabled: true
reportsController:
serviceMonitor:
enabled: true
EOF
kubectl create ns kyverno
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno --version 3.3.7 -f kyverno-value.yaml -n kyverno
kubectl get pod,svc -n kyverno
NAME READY STATUS RESTARTS AGE
pod/kyverno-admission-controller-df7b67cf-xj8c2 0/1 Running 0 21s
pod/kyverno-background-controller-8544847cf-pg7dz 1/1 Running 0 21s
pod/kyverno-cleanup-controller-5db46d8ddb-44kq8 1/1 Running 0 21s
pod/kyverno-reports-controller-77f95686d4-xjppx 1/1 Running 0 21s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kyverno-background-controller-metrics ClusterIP 10.100.113.109 <none> 8000/TCP 23s
service/kyverno-cleanup-controller ClusterIP 10.100.151.180 <none> 443/TCP 23s
service/kyverno-cleanup-controller-metrics ClusterIP 10.100.28.67 <none> 8000/TCP 23s
service/kyverno-reports-controller-metrics ClusterIP 10.100.32.13 <none> 8000/TCP 23s
service/kyverno-svc ClusterIP 10.100.125.77 <none> 443/TCP 23s
service/kyverno-svc-metrics ClusterIP 10.100.71.20 <none> 8000/TCP 23s
์ธ์ฆ์ ํ์ธ
kubectl -n kyverno get secret kyverno-svc.kyverno.svc.kyverno-tls-ca -o jsonpath='{.data.tls\.crt}' | base64 -d
-----BEGIN CERTIFICATE-----
MIIC7TCCAdWgAwIBAgIBADANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA0qLmt5...
...
-----END CERTIFICATE-----
kubectl -n kyverno get secret kyverno-svc.kyverno.svc.kyverno-tls-ca -o jsonpath='{.data.tls\.crt}' | base64 -d | step certificate inspect --short
X.509v3 Root CA Certificate (RSA 2048) [Serial: 0]
Subject: *.kyverno.svc
Issuer: *.kyverno.svc
Valid from: 2025-03-15T20:56:51Z
to: 2026-03-15T21:56:51Z
Kyverno Webhook ์๋ฒ๋ ์์ฒด ์๋ช ๋ TLS ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋๋ฐ kubectl get secret ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ TLS ์ธ์ฆ์๋ฅผ ์ง์ ํ์ธ ๊ฐ๋ฅํ๋ค.
Validating Webhook์์๋ ๊ฐ์ CA ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ฒ์ ํต์ ํ๋ค.
ํด๋ฌ์คํฐ ์ ์ฑ ์ ์ฉ
kubectl apply -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: check-team
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'team' is required"
pattern:
metadata:
labels:
team: "?*"
EOF
kubectl get ClusterPolicy
NAME ADMISSION BACKGROUND READY AGE MESSAGE
require-labels true true True 26s Ready
ํ๋ ์์ฑ ํ ์คํธ
kubectl create deployment nginx --image=nginx
error: failed to create deployment: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Deployment/default/nginx was blocked due to the following policies
require-labels:
autogen-check-team: 'validation error: label ''team'' is required. rule autogen-check-team
failed at path /spec/template/metadata/labels/team/'
Kyverno ์ ์ฑ ์ด ๋์ํ์ฌ ๋ผ๋ฒจ์ด ์๋ ๊ฒฝ์ฐ ๋ฐฐํฌ๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
kubectl run nginx --image nginx --labels team=backend
pod/nginx created
kubectl get pod -l team=backend
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 10s
team=backend ๋ผ๋ฒจ์ ํฌํจํ๋ฉด ์ ์์ ์ผ๋ก ์์ฑ๋๋ค.
Muatate๋ฅผ ํ์ฉํ ํ๋ ์๋ ๋ผ๋ฒจ๋ง ์ ์ฉ
kubectl apply -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-labels
spec:
rules:
- name: add-team
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
metadata:
labels:
+(team): bravo
EOF
kubectl get mutatingwebhookconfigurations
NAME WEBHOOKS AGE
aws-load-balancer-webhook 3 27m
kube-prometheus-stack-admission 1 5m55s
kyverno-policy-mutating-webhook-cfg 1 3m26s
kyverno-resource-mutating-webhook-cfg 1 3m26s
kyverno-verify-mutating-webhook-cfg 1 3m26s
pod-identity-webhook 1 7h20m
vpc-resource-mutating-webhook 1 7h20m
kubectl get ClusterPolicy
NAME ADMISSION BACKGROUND READY AGE MESSAGE
add-labels true true True 17s Ready
Kyverno์ Mutating ์ ์ฑ ์ ์ฌ์ฉํ์ฌ Pod ์์ฑ ์ team=bravo ๋ผ๋ฒจ์ ์๋ ์ถ๊ฐํ๋๋ก ์ค์ ํ๋ค.
kubectl run redis --image redis
pod/redis created
kubectl get pod redis --show-labels
NAME READY STATUS RESTARTS AGE LABELS
redis 1/1 Running 0 8s run=redis,team=bravo
๋ผ๋ฒจ์ ๋ช ์ํ์ง ์์์์๋ team=bravo๊ฐ ์๋ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
'Infra > AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AEWS] #8์ฃผ์ฐจ ์ ํจ์ค, ArgoCD ์ค์ต (1) | 2025.03.30 |
---|---|
[AEWS] #7์ฃผ์ฐจ Fargate ๋ฐฐํฌ ์ค์ต (1) | 2025.03.23 |
[AEWS] #6์ฃผ์ฐจ IRSA ์ค์ต (4) (1) | 2025.03.16 |
[AEWS] #6์ฃผ์ฐจ EKS ์ธ์ฆ/์ธ๊ฐ (3) (1) | 2025.03.16 |
[AEWS] #6์ฃผ์ฐจ ์๋น์ค ์ด์นด์ดํธ, role ๊ถํ ํ์ธ ์ค์ต (2) (0) | 2025.03.16 |