Admission Controllerλ₯Ό μ΄μ©νμ¬, Cluster λ° Pod λ± λ€μν μμμ λ¬Έμ κ° λλ κ²μ μ¬μ μ λ§κ³ μνλ κ²½νμ κΈμ 곡μ ν©λλ€. [μΆμ²] https://medium.com/@sridharcloud/kubernetes-admission-controllers-how-20-webhooks-saved-my-production-cluster-104d930f87dc
Kubernetes Admission Webhook μ΄μμ λν΄μ
1) κ°μ
- λͺ©μ : Kubernetes ν΄λ¬μ€ν°μ μμ μ±Β·λ³΄μΒ·μ»΄νλΌμ΄μΈμ€λ₯Ό κ°ννκΈ° μν΄ Admission Webhookμ 체κ³μ μΌλ‘ λμ Β·μ΄μνλ νμ€μ μ μνλ€.
- μ μ© λμ: νλ«νΌ μμ§λμ΄λ§ ν, SRE, 보μν, κ° μλΉμ€ νμ λ°°ν¬ νμ΄νλΌμΈ λ΄λΉμ.
- λ²μ: OPA Gatekeeper, cert-manager, Datadog(λͺ¨λν°λ§ μ£Όμ ), Azure Policy/Workload Identity, Linkerd(Service Mesh) λ± μ£Όμ Webhookκ³Ό μ μ± λ‘€μμΒ·μ΅μ ν μ μ°¨.
2) λ°°κ²½ λ° λ¬Έμ μ μ
- ν λΆμ°(6κ° ν/30λͺ ), Kubernetes μλ ¨λ νΈμ°¨, λ¬ΈμΒ·κ΅μ‘·리λ§μΈλ μ€μ¬μ μ¬νμ ν΅μ νκ³ λ°μ.
- λν μ¬κ³ μ ν:
- 리μμ€ κ³ κ°: Memory limit λ―Έμ€μ Podλ‘ μΈν Node NotReady.
- μ΄μ λλ½: λΌλ²¨/μ΄λ Έν μ΄μ λ―Έν‘μΌλ‘ λͺ¨λν°λ§ μ¬κ°μ§λ λ°μ.
- 보μ/μ»΄νλΌμ΄μΈμ€: μ‘°μ§ μ μ± λΆμΌμΉ, μλ μ κ² λΉμ© κ³Όλ€.
- μΈμ¦μ λ§λ£: μλ κ΄λ¦¬λ‘ κ°±μ λλ½ β μλΉμ€ μ€λ¨.
- ν΅μ¬ μΈμ: βμ¬λμ΄ 47κ° κ·μΉμ κΈ°μ΅βνλ μ κ·Όμμ βAdmission λ¨κ³ μλ μ§νβμΌλ‘ μ ν νμ.
3) λͺ©ν
- μ¬μ μ°¨λ¨: μλͺ»λ μ€μ μ΄ ν΄λ¬μ€ν°μ λ°μλκΈ° μ Admission λ¨κ³μμ μλ κ²μ¦/μμ .
- νμ€ν: νΒ·μλΉμ€ κ° μ΄μ κΈ°μ€ μΌκ΄μ± ν보.
- κ°μμ±Β·μ λ’°μ±: λͺ¨λν°λ§/보μ/μΈμ¦μ λ± κΈ°λ³Έ νμ§ μμ±μ μλ λΆμ¬.
- κ°λ° μμ°μ± μ μ§: μ μ§μ λ‘€μμκ³Ό μμΈΒ·νλμΌλ‘ λ§μ°° μ΅μν.
- μ±λ₯ 보μ : Webhook μ¦κ°μ λ°λ₯Έ λ°°ν¬ μ§μ°μ νμ© κ°λ₯ν λ²μ(3~4μ΄)λ‘ κ΄λ¦¬.
4) λμ μ루μ κ°μ
4.1 OPA Gatekeeper (Policy as Code)
- μν : Validating(κ²μ¦) λ° μ νκ³Ό κΈ°μ€(Constraint)μ μ μΈμ μΌλ‘ μ§ν.
- ν΅μ¬ μ μ± : Resource limits, Security Context, Network Policy λ±.
- κ΅ν: κ³Όλν μΌκ΄ κ°μ λ μλΉμ€ λ©μ μ£Όμ λ±κ³Ό μΆ©λ κ°λ₯ β λ¨μ μμ ν μ μ§ κ°ν.
4.2 cert-manager (Certificate Lifecycle)
- μν : Certificate 리μμ€ κ²μ¦/λ³ν, μλ κ°±μ (Webhook)μΌλ‘ λ§λ£ μν μ κ±°.
- ν¨κ³Ό: μΈμ¦μ λ§λ£λ‘ μΈν μλΉμ€ μ€λ¨ μλ°©(βλ§κ° λ°©μ§β κ³μΈ΅).
4.3 Datadog Mutating Webhook (Monitoring-by-Default)
- μν : Podμ λͺ¨λν°λ§ λΌλ²¨/μ΄λ Έν μ΄μ μλ μ£Όμ .
- ν¨κ³Ό: λͺ¨λν°λ§ 컀λ²λ¦¬μ§ 60% β 95% (1κ°μ). κΈ°λ³Έκ°μ νμΌλ‘ μ΄μ νμ§ ν보.
4.4 Azure Policy / Workload Identity
- μν : μ‘°μ§ λ³΄μ μ μ± μλ μ§ν(κ²μ¦), Azure μλΉμ€ μΈμ¦ μλν(λ³ν).
- ν¨κ³Ό: 보μ κ°μ¬ λλΉ μμ£Ό λΆλ μμμ μ κ±°, μΈμ¦ μ€λ₯ κ°μ.
4.5 Linkerd Webhook (Service Mesh)
- ꡬμ±: Proxy Injector, Tap Injector, Service Profile Validator, Policy Validator.
- ν¨κ³Ό: κ°λ°μλ λ©μ 볡μ‘λλ₯Ό λͺ°λΌλ μλ μ£Όμ /κ²μ¦μΌλ‘ μ΄μ νλ.
5) μ μ± μ€κ³ μμΉ
- μ΅μ κΈ°λ₯Β·λͺ ν μ± μ: κ° Webhookμ λͺ©μ κ³Ό μ λ ₯/μΆλ ₯(λ³κ²½ νλͺ©)μ λͺ μ.
- μμΈ μ€κ³: System Namespace, Legacy App, Sidecar μ£Όμ λ± μμΈ κ²½λ‘λ₯Ό λ¨Όμ μ μ.
- μ μ± κ³μΈ΅ν: Must-Have β Should-Have β Nice-to-Have 3λ¨κ³λ‘ λΆλ₯/μ μ©.
- κ°μμ±: μλ° λ©μμ§λ λͺ νΒ·νλκ°λ₯νκ²(μμ μμΒ·μ°Έμ‘° λ§ν¬ ν¬ν¨).
- κ΄μΈ‘ κ°λ₯μ±: μλ°Β·μ§μ°Β·μ€ν¨μ¨μ λμ보λ/KPIλ‘ μμ μΆμ .
6) λ¨κ³μ λ‘€μμ(4μ£Ό νμ€ μ μ°¨)
- 1μ£Ό μ°¨ β 곡μ§: μ μ± λͺ©μ Β·μν₯ λ²μΒ·μμ κ°μ΄λΒ·μ§μ μ±λ μλ΄.
- 2μ£Ό μ°¨ β κ²½κ³ λͺ¨λ: Warn-only(μ°¨λ¨ μμ)λ‘ λ‘κ·Έ/μλ¦Όλ§ λ°ν, μμ¨ μμ κΈ°κ°.
- 3μ£Ό μ°¨ β μ§ν λͺ¨λ: μ°¨λ¨ νμ±ν(Blocking). μ΄ μμ μ λ€μ μλ° ν΄μ μν.
- 4μ£Ό μ°¨ β μ΅μ ν: μ€μ μλ° ν¨ν΄Β·μ£μ§ μΌμ΄μ€ λ°μν΄ Constraint/Webhook νλ.
7) μ±λ₯ μ΅μ ν μ λ΅
- Namespace νκ²ν : κ΄λ ¨ λ€μμ€νμ΄μ€μλ§ Webhook μ€ν.
- 리μμ€ νν°λ§: νμν 리μμ€ νμ μλ§ ν μ μ©.
- Timeout νλ: 30s β 5sλ‘ μΆμ(μλΉμ€ νΉμ±μ λ§κ²).
- FailurePolicy: μλΉμ€ μν₯λμ λ°λΌ Fail-Open vs Fail-Closed κ΅¬λΆ μ μ©.
- ν¨κ³Ό: 20+ Webhook ꡬλ νκ²½μμ λ°°ν¬ μ§μ° 8β10μ΄ β 3β4μ΄λ‘ λ¨μΆ.
8) μ°μ μμ(Webhook μ μ± κ³μΈ΅)
Must-Have
- Resource Limits Validation: CPU/Memory νλ λ―Έμ€μ μ°¨λ¨ β 리μμ€ κ³ κ° λ°©μ§.
- Security Context Policies: RunAsNonRoot, readOnlyRootFilesystem λ± λ³΄μ κΈ°μ€ κ°μ .
- Network Policy Validation: λ€μμ€νμ΄μ€/μλΉμ€ λ 벨 μΈλΆν 보μ₯.
- Certificate Management: μΈμ¦μ λ°κΈΒ·κ°±μ μλνλ‘ κ°μ©μ± ν보.
Really-Should-Have
- Label/Annotation Injection: λͺ¨λν°λ§Β·λΌμ°ν Β·λ°±μ λ± νκ·Έ μλ μ£Όμ .
- Image Policy Enforcement: μ·¨μ½/λ―ΈμΈκ° μ΄λ―Έμ§ μ¬μ© μ°¨λ¨(RegistryΒ·μλͺ Β·SBOM κΈ°μ€).
- Service Mesh Injection: μ¬μ΄λμΉ΄ μλ μ£Όμ μΌλ‘ λ©μ νμ€ν.
- Backup Annotation Injection: λ°μ΄ν° μμμ±Β·λ°±μ μ μ± μΌκ΄ν.
Nice-to-Have
- Cost Allocation Labels: λΉμ© νκΉ μλνλ‘ ν/μλΉμ€ λ¨μ μ μ° κ°λ₯.
- Compliance Validation: κ·μ μ€μ κ²μ¦(μ°μ λ³ νμ νλͺ©).
- Custom Business Logic: μ‘°μ§/λλ©μΈλ³ νΉν μ μ± (μΉμΈΒ·λΌλ²¨Β·μ΄λ¦ κ·μΉ λ±).
9) μ΄μ νμ€ λ° κ±°λ²λμ€
- λ³κ²½ κ΄λ¦¬: μ μ± λ³κ²½μ PRΒ·μ½λ리뷰·μ€ν μ΄μ§ κ²μ¦ ν μ μ§ λ°μ.
- μμΈ μΉμΈ: νμμ μμΈλ λ§λ£μΌ/μ¬μ /보μ κ³ν λͺ μ, λ체 ν΅μ μ μ©.
- μ₯μ λμ: μ μ± μ€νμ§(blocking) λ°μ μ Fail-Open μ ν κΈ°μ€Β·μ μ°¨ μ¬μ μ μ.
- μ§ν/KPI:
- λ°°ν¬ νκ· μ§μ° μκ°(p50/p95), Webhook νμμμ/μ€ν¨μ¨
- μ μ± μλ° λ°μ 건μΒ·ν΄κ²° 리λνμ
- λͺ¨λν°λ§ 컀λ²λ¦¬μ§, μΈμ¦μ λ§λ£ μ¬κ³ 건μ
- μ΄λ―Έμ§ μ μ± μλ°λ₯ , λ€νΈμν¬ μ μ± μ€μμ¨
10) μν λ° λμ
- κ³Όλν μ°¨λ¨μΌλ‘ κ°λ° λ§μ°° β κ²½κ³ λͺ¨λΒ·κ°μ΄λΒ·μ¬μ 곡μ§λ‘ μν.
- λ κ±°μΒ·μ¬μ΄λμΉ΄ μΆ©λ β Namespace/Label κΈ°λ° μμΈμ μ€μ½ν νμ .
- μ±λ₯ μ ν β νκ²ν Β·νν°λ§Β·TimeoutΒ·FailurePolicy μ΅μ ν.
- μ΄μ 볡μ‘μ± μ¦κ° β μ μ± μΉ΄νλ‘κ·ΈΒ·RunbookΒ·λμ보λλ‘ νμ€ν.
11) λΆλ‘ A: Gatekeeper μμ μ€μΌλ ν€
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8srequiredresources
# spec.crd/spec.targets/rego λ±μ μ‘°μ§ νμ€ λ ν¬μ μμ λ³Έλ¬Έ μ°Έμ‘°
μμ μλ¬ λ©μμ§(κ²μ¦ μ€ν¨)
admission webhook "validation.gatekeeper.sh" denied the request:
[denied by k8srequiredresources] Container must have memory limits set
12) λΆλ‘ B: νμ€ Webhook μΉ΄νλ‘κ·Έ(μν)
cert-manager-webhookβ Certificate κ²μ¦/λ³ν/μλ κ°±μgatekeeper-webhookβ OPA Policy κ²μ¦datadog-webhookβ λͺ¨λν°λ§ λΌλ²¨/μ΄λ Έν μ΄μ μλ μ£Όμazure-policy-validating-webhook-configurationβ μ‘°μ§ μ μ± κ²μ¦azure-wi-webhook-mutating-webhook-configurationβ Workload Identity μ£Όμlinkerd-proxy-injector-webhook-configβ μ¬μ΄λμΉ΄ νλ‘μ μ£Όμlinkerd-tap-injector-webhook-configβ Tap λλ²κΉ μ£Όμlinkerd-sp-validator-webhook-configβ μλΉμ€ νλ‘ν κ²μ¦linkerd-policy-validator-webhook-configβ κΆν μ μ± κ²μ¦
13) κ²°λ‘
Admission Webhookμ μ¬λμ μ€μμ μ¬λμ λ§κ°μ λͺ¨λ λ€λ£¨λ μλν μΈ΅μ΄λ€. λ¨μν μΆλ°, λͺ νν μμΈ, μ μ§μ μ§ν, μ±λ₯ μ΅μ νλΌλ 4μΆμ μ§ν€λ©΄ κ°λ°μ κ²½νκ³Ό νλ«νΌ μ λ’°μ±μ λμμ λ¬μ±ν μ μλ€.
