๐Ÿš€ Kubernetes webhook ์šด์˜ - ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์€ ์‚ด๋ฆฌ๊ณ , ๋ฆฌ์Šคํฌ๋Š” ์ค„์ด๋Š” ์‚ฌ๋ก€ ๊ณต์œ 

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) ๋ชฉํ‘œ

  1. ์‚ฌ์ „ ์ฐจ๋‹จ: ์ž˜๋ชป๋œ ์„ค์ •์ด ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ˜์˜๋˜๊ธฐ ์ „ Admission ๋‹จ๊ณ„์—์„œ ์ž๋™ ๊ฒ€์ฆ/์ˆ˜์ •.
  2. ํ‘œ์ค€ํ™”: ํŒ€ยท์„œ๋น„์Šค ๊ฐ„ ์šด์˜ ๊ธฐ์ค€ ์ผ๊ด€์„ฑ ํ™•๋ณด.
  3. ๊ฐ€์‹œ์„ฑยท์‹ ๋ขฐ์„ฑ: ๋ชจ๋‹ˆํ„ฐ๋ง/๋ณด์•ˆ/์ธ์ฆ์„œ ๋“ฑ ๊ธฐ๋ณธ ํ’ˆ์งˆ ์†์„ฑ์˜ ์ž๋™ ๋ถ€์—ฌ.
  4. ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์œ ์ง€: ์ ์ง„์  ๋กค์•„์›ƒ๊ณผ ์˜ˆ์™ธยทํŠœ๋‹์œผ๋กœ ๋งˆ์ฐฐ ์ตœ์†Œํ™”.
  5. ์„ฑ๋Šฅ ๋ณด์ „: 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) ์ •์ฑ… ์„ค๊ณ„ ์›์น™

  1. ์ตœ์†Œ ๊ธฐ๋Šฅยท๋ช…ํ™• ์ฑ…์ž„: ๊ฐ Webhook์˜ ๋ชฉ์ ๊ณผ ์ž…๋ ฅ/์ถœ๋ ฅ(๋ณ€๊ฒฝ ํ•ญ๋ชฉ)์„ ๋ช…์‹œ.
  2. ์˜ˆ์™ธ ์„ค๊ณ„: System Namespace, Legacy App, Sidecar ์ฃผ์ž… ๋“ฑ ์˜ˆ์™ธ ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € ์ •์˜.
  3. ์ •์ฑ… ๊ณ„์ธตํ™”: Must-Have โ†’ Should-Have โ†’ Nice-to-Have 3๋‹จ๊ณ„๋กœ ๋ถ„๋ฅ˜/์ ์šฉ.
  4. ๊ฐ€์‹œ์„ฑ: ์œ„๋ฐ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ช…ํ™•ยทํ–‰๋™๊ฐ€๋Šฅํ•˜๊ฒŒ(์ˆ˜์ • ์˜ˆ์‹œยท์ฐธ์กฐ ๋งํฌ ํฌํ•จ).
  5. ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ: ์œ„๋ฐ˜ยท์ง€์—ฐยท์‹คํŒจ์œจ์„ ๋Œ€์‹œ๋ณด๋“œ/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์ถ•์„ ์ง€ํ‚ค๋ฉด ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜๊ณผ ํ”Œ๋žซํผ ์‹ ๋ขฐ์„ฑ์„ ๋™์‹œ์— ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.