카테고리 없음

Kubernetes Admission Controller

심플코더 2025. 3. 30. 10:27

Kubernetes API Request Flow

우리가 평소에 kubectl 명령어로 Pod를 만들거나 Service를 만들 때, 요청은 Kubernetes의 API server로 전달된다.

 

API server는 다음과 같은 일련의 과정을 거쳐 작업을 수행하게된다.

 

1. Authenticaion

클러스터는 먼저 이 요청이 누구로부터 온 것인지 Authentication 과정을 거친다. 보통은 kubeconfig에 있는 인증서 정보를 활용해서 인증을 진행한다.

 

2. Authorization

이 사용자가 해당 작업을 할 수 있는 권한이 있는지를 확인한다.

RBAC(Role Based Access Control)에 의해 create, get, delete와 같은 작업 권한이 체크된다.

 

RBAC의 한계

RBAC만으로도 대부분의 접근 권한 통제는 해결할 수 있다. 특정 유저가 pod만 만들 수 있게 할 수도 있고, 특정 네임스페이스에만 접근할 수 있도록 제한할 수도 있다.

 

그러나 만약 Pod 안에 정의된 이미지 정보나 컨테이너 설정까지 제어해야한다면 RBAC 만으로는 제어할 수 없다.

이 때 등장하는 개념이 `Admission Controller`이다.

 

Admission Controller

Admission Controlller는 인증/권한 검사 이후 실제로 리소스가 클러스터에 생성되기 전에 중간에 개입하는 Hook에 해당한다.

단순히 Validation만 수행하는 것이 아니라 요청을 보고 수정하거나 자동으로 리소스를 추가하는 작업도 수행한다.

대략적으로 요청 거부, 요청 필드 수정, 리소스 자동 생성의 작업을 수행한다.

 

Kubernetes에서 기본적으로 제공하는 Admission Controller

AlwaysPullImages Pod 생성 시 이미지가 항상 Pull 되도록 강제
DefaultStorageClass PVC 생성 시 StorageClass가 없으면 기본 StorageClass 할당
EventRateLimit API Server가 처리하는 이벤트 수를 제한
NamespaceExists (Deprecated)존재하지 않는 Namespace에 리소스를 생성하는 요청 거부
NamespaceAutoProvision (Deprecated) Namespace가 없으면 자동 생성

 

우리가 존재하지 않는 Namespace를 설정하여 Pod를 생성하려고 하면 존재하지 않는 Namespace라는 메시지와 함께 생성이 거부되는데, 이러한 작업이 사실은 Admission Controller에 의해 이루어지고 있었던 것이다.

 

NamespaceAutoProvision과 NamespaceExists의 경우 Deprecated되어 대신 namespaceLifeCycle을 사용한다.

 

Admission Controller 관련 명령어

kube-apiserver -h | grep enable-admission-plugins

또는

ps -ef | grep kube-apiserver | grep admission-plugins

위 명령어를 통해 활성화된 Admission Controller의 목록을 확인할 수 있다.

 

kube-apiserver.service를 실행하면서 플러그로 `--enable-admission-plugins`의 파라미터로 추가한 admission plugins들은 해당 kube-apiserver에서 활성화되며 반대로 `--disable-admission-plugins`에 추가한 내용들은 disabled된다.