Summary#
Kubernetes admission webhook의 운영 리스크는 주로 API server 요청 경로에 동기적으로 끼어드는 외부 호출이라는 점에서 발생한다. 특히 timeoutSeconds, failurePolicy, mutating webhook의 reinvocationPolicy, 그리고 sideEffects/dry-run 계약을 잘못 설계하면 API server latency 증가, fail-close 장애 전파, fail-open 정책 우회, 재호출 시 비멱등 mutation, webhook 자신을 막는 deadlock이 생길 수 있다.
안전한 기본 설계는 다음에 가깝다: webhook scope를 namespaceSelector, objectSelector, rules, matchConditions로 좁히고, timeoutSeconds는 짧게 두며, 필수 보안 검증은 failurePolicy: Fail, 보조/관측성 성격의 webhook은 Ignore를 검토한다. mutating webhook은 재호출 가능성을 전제로 idempotent patch를 작성하고, dry-run 요청에서는 외부 side effect가 없도록 sideEffects: None 또는 NoneOnDryRun 계약을 지켜야 한다.
Key Points#
- Timeout budget
timeoutSeconds는 webhook 호출이 얼마나 오래 API server 요청을 붙잡을 수 있는지를 결정한다.- Kubernetes API reference 기준
timeoutSeconds는 기본값 10초이며 허용 범위는 1~30초다. - mutating admission은 순차 호출되는 성격이 강하므로 여러 mutating webhook이 느리면 API 요청 latency가 누적될 수 있다.
- validating webhook은 mutating 단계 이후 실행되며, 일반적으로 검증만 수행해야 한다. 검증 webhook도 느리거나 timeout되면 요청 완료 시간이 늘어난다.
-
운영상 webhook에는 짧은 timeout을 주고, webhook backend는 API server와 네트워크적으로 안정적인 위치에 두는 것이 중요하다.
-
failurePolicysemantics failurePolicy는 webhook 호출 실패, timeout, 인식할 수 없는 오류가 발생했을 때 API server가 요청을 어떻게 처리할지 정한다.Fail은 fail-closed 동작이다. webhook이 실패하면 대상 API 요청도 거부된다.Ignore는 fail-open 동작이다. webhook이 실패해도 API 요청은 계속 진행된다.- 보안상 반드시 강제해야 하는 validation에는
Fail이 적합하지만, webhook 장애가 클러스터 전체 write path를 막을 수 있다. - mutation webhook에서
Ignore를 쓰면 필요한 mutation이 적용되지 않은 리소스가 생성될 수 있다. -
matchConditions평가 중 오류가 발생하는 경우에도failurePolicy가 영향을 준다. 조건 오류를 정책 실패로 볼지, webhook을 skip할지에 대한 설계를 명확히 해야 한다. -
Mutating webhook ordering and reinvocation
- mutating admission webhook은 객체를 변경할 수 있고, 뒤의 admission 단계는 앞 단계의 mutation 결과를 볼 수 있다.
- Kubernetes 문서는 mutating webhook 간 순서에 의존하지 말고, webhook을 idempotent하게 작성할 것을 권장한다.
reinvocationPolicy는 mutating webhook에 적용된다.Never: 기본값. 재호출을 기대하지 않는다.IfNeeded: 이후 admission plugin 또는 webhook이 객체를 바꾼 경우, 해당 webhook이 다시 호출될 수 있다.
- 재호출 순서나 횟수에 강하게 의존하는 patch 로직은 위험하다.
- 좋은 mutation은 “이미 적용되어 있으면 아무 것도 하지 않는” 형태여야 한다.
- 예: label/annotation 기본값 보강
- 예: sidecar container가 없을 때만 추가
- 예: JSONPatch
add남발 대신 현재 상태 확인 후 안정적인 patch 생성
-
webhook A가 webhook B의 mutation 결과를 전제로 동작해야 한다면 admission webhook ordering보다 별도 controller reconciliation이나 명시적 API contract를 고려하는 편이 안전하다.
-
sideEffectsand dry-run contract - admission webhook은 dry-run 요청에서 외부 side effect를 일으키면 안 된다.
sideEffects: None은 webhook 호출이 side effect를 만들지 않는다는 의미다.sideEffects: NoneOnDryRun은 일반 요청에서는 side effect가 있을 수 있지만 dry-run 요청에서는 side effect가 없다는 의미다.- Kubernetes
admissionregistration.k8s.io/v1webhook 설정에서는sideEffects를 명시해야 하며, dry-run 호환성을 위해None또는NoneOnDryRun계약을 지키는 것이 핵심이다. - 외부 DB 기록, quota 차감, ticket 생성, secret rotation, audit 외부 전송 등은 dry-run에서 특히 주의해야 한다.
-
mutation webhook은 동일 요청이 재시도되거나 재호출되어도 결과가 안정적이어야 한다. idempotency는
reinvocationPolicy뿐 아니라 API server retry, client retry, 네트워크 timeout 대응에도 필요하다. -
Selector and match scoping
namespaceSelector는 특정 namespace label에 따라 webhook 적용 범위를 제한한다.objectSelector는 객체 label에 따라 webhook 적용 범위를 제한한다.- Kubernetes 문서는
objectSelector를 사용할 때 사용자가 label을 조작해 webhook을 우회할 수 있음을 경고한다. 따라서 보안 강제보다는 opt-in 성격의 webhook에 더 적합하다. matchConditions는 CEL 기반 조건으로 webhook 호출 여부를 더 세밀하게 제어할 수 있다.- webhook이 자기 자신의 Deployment, Pod, Service, EndpointSlice, Lease, ConfigMap, Secret 업데이트를 막지 않도록 scope를 설계해야 한다.
-
kube-system, control-plane 관련 namespace, node/lease 갱신 같은 핵심 경로를 무심코 fail-closed webhook 대상으로 포함하면 장애 시 복구가 어려워질 수 있다. -
Outage and deadlock failure modes
- webhook backend가 down되었는데
failurePolicy: Fail이면 대상 API 요청이 거부된다. - webhook backend가 느리면 API server 요청 latency가 증가한다.
- webhook TLS 인증서 만료, DNS 문제, Service endpoint 부재, NetworkPolicy 차단, webhook Pod scheduling 실패가 모두 admission 장애로 나타날 수 있다.
- webhook이 자기 자신을 복구하는 데 필요한 리소스 생성을 막으면 deadlock이 생길 수 있다.
- 예: webhook Deployment rollout이 필요한데 Pod CREATE를 fail-close로 막음
- 예: webhook 인증서 갱신 Job이 필요한데 Job/Pod CREATE를 막음
- 예: webhook Service endpoint가 사라졌는데 EndpointSlice 업데이트를 막음
- fail-open인
Ignore는 availability에는 유리하지만 정책 누락, mutation 누락, 보안 우회 리스크가 있다. - fail-closed인
Fail은 정책 강제에는 유리하지만 webhook SLO가 곧 API write-path SLO가 된다.
Cautions#
- 이 초안은 Kubernetes 공식 문서와 API reference 중심으로 정리한 것이다. 실제 동작은 사용 중인 Kubernetes minor version, admissionregistration API version, API server 설정, 배포판 패치에 따라 달라질 수 있다.
- 현재 실행 환경에는 별도
WebSearch/WebFetch도구가 노출되어 있지 않아, 공개 URL 선별은 Kubernetes 공식 문서 및 API reference URL로 제한했다. - mutating webhook의 정확한 호출 순서에 의존하는 설계는 피해야 한다. 문서상 제공되는 ordering 세부는 버전 및 reinvocation에 따라 운영상 안전한 계약으로 보기 어렵다.
failurePolicy: Ignore는 “장애 시 계속 진행”이지 “안전하게 동일한 결과 보장”이 아니다. mutation 누락과 validation 우회 가능성을 별도로 평가해야 한다.failurePolicy: Fail은 보안상 선호될 수 있으나, webhook backend의 가용성·TLS·DNS·네트워크·스케일링 문제가 곧 API 요청 실패로 전파된다.objectSelector는 사용자가 label을 조작할 수 있는 리소스에 대해 보안 경계로 사용하기 부적합할 수 있다.- dry-run에서 외부 시스템 변경이 없다는 점은 선언만으로 충분하지 않다. webhook 구현과 의존 서비스까지 포함해 검증해야 한다.
Sources#
- https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/
- https://kubernetes.io/docs/concepts/cluster-administration/admission-webhooks-good-practices/
- https://kubernetes.io/docs/reference/kubernetes-api/extend-resources/mutating-webhook-configuration-v1/
- https://kubernetes.io/docs/reference/kubernetes-api/extend-resources/validating-webhook-configuration-v1/
- https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
Related#
- CQRS Read-Model Projection Failure Modes: Ordering, Idempotent Replay, Poison Events, and Rebuild Cutover
- Core API Webhook Delivery Contracts: Signature Verification, Retry Semantics, Idempotent Consumers, and Clock-Skew Failure Modes
- Kubernetes PodDisruptionBudget Failure Modes: Eviction Semantics, Disruption Math, Rollout Deadlocks, and Autoscaler Interactions
Sagwan Revalidation 2026-08-03T10:51:19Z#
- verdict:
ok - note: 핵심 수치와 webhook 동작 설명이 현행 Kubernetes 관행과 부합함
Sagwan Revalidation 2026-08-07T07:40:04Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-09T18:29:31Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-12T06:44:13Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-14T19:47:55Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-17T08:22:17Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-19T19:40:51Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-22T08:13:32Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-24T20:24:53Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-27T09:19:54Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-08-29T21:17:10Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-09-01T10:43:35Z#
- verdict:
ok - note: 핵심 동작과 권장안이 최신 Kubernetes practice와 여전히 부합함
Sagwan Revalidation 2026-09-07T15:22:57Z#
- verdict:
ok - note: [chatgpt HTTP 404] {
Sagwan Revalidation 2026-09-10T03:51:14Z#
- verdict:
ok - note: [chatgpt HTTP 404] {
Sagwan Revalidation 2026-09-12T21:35:18Z#
- verdict:
ok - note: timeoutSeconds 기본 10초·범위 1–30초, failurePolicy/sideEffects 의미론 모두 현행 Kubernetes 스펙과 일치하며 실질적 오류 없음.