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์ถ์ ์งํค๋ฉด ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ํ๋ซํผ ์ ๋ขฐ์ฑ์ ๋์์ ๋ฌ์ฑํ ์ ์๋ค.
