Kubernetes/Udemy - CKAD with Tests

Validating & Mutating Admission Controllers

비번변경 2022. 1. 12. 23:06

Validating & Mutating Admission Controllers

Validating Admission Controller

요청을 검증하는 검증 승인 컨트롤러

 

예시 )

  • NamespaceExist
  • NamespaceLifecycle

요청 내용의 네임스페이스가 존재하는지 확인하고 없으면 요청을 거부한다.

 

Mutating Admission Controller

요청 수행 전에 요청 내용을 변경할 수 있다.

 

예시 )

  • DefaultStorageClass : 기본 활성화 플러그인으로, PVC 생성 요청을 확인하여 PVC에 StorageClass 설정이 존재하는지 확인한다. StorageClass 설정이 없는 경우, default StorageClass로 구성하도록 StorageClasss 설정을 수정한다.

 

Admission Controller는 요청을 검증하는 Validating admission controller와 요청 내용을 변경할 수 있는 Mutating admission controller가 존재한다.

일반적으로 Mutating admission controller에 의한 변경을 검증 과정에서 고려할 수 있도록 Mutating admission controller를 수행한 후, Validating admission controller를 수행한다.

실행 순서가 반대가 되는 경우, Validating admission controller에 의해 유효하지 않은 요청은 거부되므로 Mutating admission controller은 실행되지 않는다.

 

Webhook

사용자 정의 로직을 가진 admission controller가 필요할 때 사용한다. 

쿠버네티스 클러스터 내외에 사용자 정의 코드/로직으로 동작하는 Webhook 서비스를 호스팅하고 요청을 Webhook으로 전달하도록 구성해두면, Admission controller를 통과한 요청이 Webhook에 도달하게 된다. 요청자, 수행 작업, 객체 세부 정보 등의 요청 정보가 포함된 JSON 형식의 AdmissionReview 객체를 전달하여 Admission Webhook Server를 호출하며, 요청을 수신한 Webhook 서버는 요청의 허용 여부를 AdmissonReview 객체로 응답한다. 허용 시 응답의 allowed 필드 값이 true로 설정되며, 기본값으로 설정된 응답은 요청을 거부한 것이다.

 

설정 방법

1. Admission Webhook Server 개발

다양한 프로그래밍 언어를 사용해 개발할 수 있다. Admission Webhook Server는 API 요청을 허용하거나 거부할 로직이나 코드가 포함된 서버이며, Webhook은 요청을 적절히 수신하고 응답할 수 있어야 한다.

 

요구 사항

  1. Validating / Mutating API를 수신받을 수 있어야 한다.
  2. JSON 형식의 객체로 응답할 수 있어야 한다.

2. Admission Webhook Server 호스팅

개발이 완료되면 별도 서버 또는 쿠버네티스 내 포드로 호스팅한다. 쿠버네티스 내에 배포하는 경우, 포드 접근에 사용할 서비스(Service) 객체 또한 생성되어야 한다.

 

3. Kubernetes에 WebhookConfiguration 객체 생성

객체 정의 yaml 파일 형식은 다음과 같다.

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata: 
  name: "pod-policy.example.com"
webhooks:
  name: "pod-policy.example.com"
  clientConfig:
    service:
      namespace: "webhook-namespace"
      name: "webhook-service"
  caBundle: "VALUES" 
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      operations: ["CREATE"]
      resoucres: ["pods"]
      scope: "Namespaced"
  • kind : Webhook의 유형. ValidatingWebhookConfiguration 또는 MutatingWebhookConfiguration.
  • webhooks.clientConfig : Webhook 서버의 위치
    외부에 구축한 경우 - webhook.clientkConfig.url 필드에 URL 값 설정
    쿠버네티스 클러스터 내에 배포한 경우 - 접근 시 필요한 서비스의 네임스페이스와 이름 지정 필요 (예시 참조)
  • webhooks.clientConfig.caBundle : api server와 webhook server 간 TLS 통신을 위한 인증서 번들 구성
  • webhooks.rules : webhook을 호출할 규칙을 구성한다.