Scheduling/85/Validating and Mutating Admission Controllers

y001·2025년 2월 20일
post-thumbnail

1. Admission Controller의 두 가지 유형

Kubernetes의 Admission Controller는 크게 두 가지 유형으로 나뉜다.

1) Validating Admission Controller (검증)

  • 요청을 검사하고, 조건을 만족하지 않으면 거부한다.
  • 예제: NamespaceExists 또는 NamespaceLifecycle Admission Controller
    • 요청한 네임스페이스가 존재하지 않으면 요청을 거부한다.

2) Mutating Admission Controller (변경)

  • 요청을 변경할 수 있다. (요청이 클러스터에 반영되기 전에 수정)
  • 예제: DefaultStorageClass
    • PVC(Persistent Volume Claim)를 만들 때 Storage Class가 지정되지 않았다면 기본 Storage Class를 자동으로 추가한다.

2. Admission Controller 실행 순서

  1. Mutating Admission Controller (변경)
    • 먼저 실행되어 요청을 변경할 수 있음.
  2. Validating Admission Controller (검증)
    • 변경된 요청을 최종적으로 검증하고 허용 또는 거부.

예제:

  • NamespaceAutoProvisioning(네임스페이스가 없으면 자동 생성) → Mutating Admission Controller
  • NamespaceExists(네임스페이스가 없으면 요청 거부) → Validating Admission Controller

⚠️ 만약 실행 순서가 반대로 된다면?

  • NamespaceExists가 먼저 실행되면 네임스페이스가 없는 요청은 바로 거부됨.
  • NamespaceAutoProvisioning이 실행되지 못하고 네임스페이스도 생성되지 않음.

그래서 항상 Mutating Admission Controller가 먼저 실행됨.


3. 사용자 정의 Admission Controller(Webhook)

기본적으로 Kubernetes에 내장된 Admission Controller만 사용할 수 있지만, Webhook을 이용하면 사용자가 직접 Admission Controller를 만들 수 있다.

1) Webhook의 종류

  • MutatingAdmissionWebhook → 요청을 변경 가능
  • ValidatingAdmissionWebhook → 요청을 검증하고 허용/거부 가능

2) Webhook의 동작 방식

  1. 사용자가 Kubernetes API Server에 요청을 보냄.
  2. API Server가 내장된 Admission Controller를 통과시킴.
  3. Webhook이 설정된 경우, Webhook 서버로 요청을 전달.
  4. Webhook 서버는 AdmissionReview JSON 형식으로 요청을 받고, 허용 여부를 응답.
    • allowed: true → 요청 허용
    • allowed: false → 요청 거부

4. Webhook 구성 방법

1) Webhook 서버 배포

  • Python, Go 등으로 개발 가능.
  • Kubernetes 클러스터 내에 Deployment로 배포할 수도 있고, 외부에서 실행할 수도 있음.
  • 예제:
    • Validating Webhook: 특정 사용자(user1)가 자신의 이름과 같은 객체를 생성하려 하면 거부.
    • Mutating Webhook: 모든 요청에 user 라벨을 자동 추가.

2) Kubernetes에서 Webhook 설정

Webhook을 Kubernetes에 등록하려면 Webhook Configuration 객체를 생성해야 한다.

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-validation-webhook
webhooks:
  - name: pod-policy.example.com
    clientConfig:
      service:
        name: webhook-service
        namespace: default
        path: "/validate"
    rules:
      - apiGroups: [""]
        apiVersions: ["v1"]
        operations: ["CREATE"]
        resources: ["pods"]
    admissionReviewVersions: ["v1"]
    sideEffects: None

설명

  • webhooks: 여러 개의 Webhook을 설정 가능.
  • clientConfig: Webhook 서버의 위치 (클러스터 내부 webhook-service 사용).
  • rules: 특정 리소스(Pod) 생성 시에만 Webhook 실행.
  • admissionReviewVersions: API 버전 지정.

0개의 댓글