Admission Controller는 k8s 클러스터에서 관리자가 정의한 정책(Policy)을 수행(Admission Control)하는 플러그인입니다.

admission-controller-phases

Admission Controller를 사용하는 이유

  • 보안성 측면: 인증 및 인가를 거친 요청에 대해 미리 정의한 정책을 적용하므로 보안성을 높일 수 있습니다.
  • 제어성 측면: 클러스터에 배포하는 App에 적절한 Label을 자동으로 기입하거나 App이 사용할 Memory 또는 CPU의 규모를 자동으로 제한하여, 클러스터 내 배포하는 리소스를 더욱 효과적으로 제어할 수도 있습니다.

Admission Controller 작동 방식

위의 표처럼, k8s API 서버로 온 요청은 인증(Authentication)과 인가(Authorization) 과정을 먼저 거친 다음 해당 요청에 대한 Admission Control이 수행됩니다.

Admission Control은 아래와 같이 2단계로 나눠 진행됩니다.

  • 변경(Mutate) 단계: 들어온 요청과 매칭되는 정책이 해당 요청의 일부 값을 변경하는 Mutate 정책일 경우, 해당 요청에서 변경되어야 하는 부분을 알려주는 값을 k8s API 서버로 반환합니다.
  • 검증(Validate) 단계: 들어온 요청과 매칭되는 정책이 해당 요청을 허용/거부하는 Validate 정책일 경우, 해당 요청이 정책에 부합하는지에 대해 true/false 값을 k8s API 서버로 반환합니다.

Admission Controller를 사용하는 방법

k8s 클러스터에는 Pod에 사용하는 Image나 인증서 등에 관한 다양한 Admission Controller가 기본적으로 준비되어 있습니다. (관련 링크) Admission Controller를 사용하려면 k8s API 서버의 config에 아래 내용을 추가합니다.

--enable-admission-plugins={추가하려는 Plugin 이름}

Admission Controller를 직접 구현하는 방법도 있습니다. k8s API 서버로부터 오는 요청을 받아서 특정 정책에 따른 로직을 수행 후 Admission Control 결과 양식에 따라 결과값을 반환하는 서비스를 구현하는 방식인데요.

이때 Admission Webhook이 사용되며, 이는 외부에서 작동하는 Admission Controller가 Admission Control 요청을 받고 이에 따른 특정 행위를 수행하도록 도와주는 역할을 합니다. 서드파티로 개발된 Kyverno와 같은 정책 엔진도 Admission Webhook을 사용합니다.

References