콘텐츠로 이동
Study NoteCKA

Admission — 요청 내용 검사

결론부터
Admission은 인증과 인가를 통과한 변경 요청의 내용을 수정하거나 검증한다.

Pod 생성 권한이 있는 사용자도 정책에 맞지 않는 Pod을 제출할 수 있다. 권한 다음에 내용을 검사하는 Admission의 역할과 API 서버 설정, 외부 webhook을 살펴본다.

인가를 통과한 뒤 내용을 검사하거나 고치는 단계다.

왜 따로 있는가 — 인가(RBAC)는 요청의 내용을 보지 않기 때문이다. RBAC의 관할은 “누가 · 어떤 동사를 · 어떤 리소스에”까지다. dev에게 Pod 생성 권한이 있으면 latest 태그든, 미승인 레지스트리 이미지든, limit 없는 Pod든 전부 통과한다. “생성은 허용하되, 이런 내용이면 고치거나 거부한다”는 규칙을 걸 자리가 admission이다.

Mutating과 Validating 어드미션 단계와 각 단계의 대표 플러그인
종류하는 일예
Mutating요청을 고친다DefaultStorageClass, ServiceAccount 주입
Validating거부하거나 통과시킨다ResourceQuota, PodSecurity, LimitRanger

Mutating이 먼저 돌고 Validating이 고쳐진 결과를 검사한다. 스케줄링과는 무관하다 — admission은 etcd 저장 전의 관문이라, 여기서 거부된 Pod는 스케줄러가 본 적도 없다.

켜고 끄기 — kube-apiserver 플래그

섹션 제목: “켜고 끄기 — kube-apiserver 플래그”

admission 컨트롤러는 별도 설치물이 아니라 API 서버 안에 내장돼 있고, 플래그로 켜고 끈다. kubeadm 클러스터라면 static Pod 매니페스트를 고친다.

터미널 창
# 활성 목록 확인
sudo grep admission-plugins /etc/kubernetes/manifests/kube-apiserver.yaml
# command에 추가 — 기본 셋에 더하거나 뺀다
- --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
- --disable-admission-plugins=DefaultStorageClass

중요한 내장 플러그인

  • NamespaceLifecycle — 없는 네임스페이스로의 생성을 거부하고, kube-system 같은 시스템 네임스페이스의 삭제를 막는다 (옛 NamespaceExists·NamespaceAutoProvision을 대체)
  • LimitRanger / ResourceQuota — 설정과 리소스
  • PodSecurity — 스케줄링
  • DefaultStorageClass — PVC에 기본 클래스를 채운다 (mutating의 대표 예)
  • NodeRestriction — kubelet이 자기 노드의 리소스만 만지게 제한한다
  • MutatingAdmissionWebhook / ValidatingAdmissionWebhook — 외부 정책 엔진 연동 (아래)

세부 설정 — AdmissionConfiguration 파일

섹션 제목: “세부 설정 — AdmissionConfiguration 파일”

일부 플러그인은 켜는 것만으로 끝나지 않고 세부 설정 파일이 따로 필요하다. 대표가 ImagePolicyWebhook — Pod 생성·수정 요청에서 컨테이너 이미지 이름을 뽑아 외부 webhook 서버에 물어보고, 응답대로 통과시키거나 거부한다. “미승인 레지스트리 이미지를 클러스터에 아예 못 들어오게” 하는 관문의 구현이다.

/etc/kubernetes/admission/admission-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ImagePolicyWebhook
configuration:
imagePolicy:
kubeConfigFile: /etc/kubernetes/admission/imagepolicy.kubeconfig # webhook 서버 주소·인증서
defaultAllow: false # webhook이 응답 없을 때 — false면 전부 거부

이 파일을 API 서버 플래그 --admission-control-config-file=<경로>로 넘긴다.

외부 webhook — 직접 만드는 admission

섹션 제목: “외부 webhook — 직접 만드는 admission”

내장 플러그인에 없는 규칙은 webhook 리소스 두 종으로 건다. 이쪽은 설정 파일이 아니라 진짜 API 리소스라(admissionregistration.k8s.io 그룹) kubectl로 만들고 조회한다.

시험 비중 낮음 webhook 서버를 직접 구현하는 데까지 갈 필요는 없다. 이런 리소스가 있다는 것, 정책 엔진이 여기에 붙는다는 것, 그리고 아래 함정이 “갑자기 아무것도 안 만들어진다” 유형의 트러블슈팅에서 쓸모 있다는 점을 챙긴다. 표에 나오는 OPA는 Open Policy Agent — Kyverno와 함께 정책을 코드로 쓰게 해 주는 도구다.

리소스시점쓰임
MutatingWebhookConfigurationvalidating보다 먼저사이드카 주입, 라벨·기본값 추가
ValidatingWebhookConfiguration저장 직전 마지막 검사정책 위반 거부 (OPA Gatekeeper, Kyverno)

API 서버는 등록된 rules에 걸리는 요청마다 AdmissionReview JSON을 webhook 서버(대개 클러스터 안의 Service)로 보내고, 응답의 allowed: true/false대로 통과 여부를 정한다.

  • Admission은 인증과 인가를 통과한 변경 요청의 내용을 수정하거나 검증한다.
  • Mutating 단계는 내용을 고치고 Validating 단계는 허용 여부를 판단한다.
  • AdmissionConfiguration은 API 서버가 읽는 설정 파일이며 API 리소스가 아니다.