Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #19] Webhook을 활용한 Kubernetes Admission Control 정책 적용

ygtoken 2025. 3. 17. 12:03
728x90

 

쿠버네티스에서는 새로운 리소스가 생성될 때, 이를 검증하고 승인하는 기능이 필요할 수 있습니다.

이를 위해 Admission Controller와 Webhook을 활용하여 쿠버네티스 클러스터의 보안 및 정책 준수를 강화하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. MutatingWebhook을 사용하여 Pod 생성 시 특정 레이블을 자동 추가

2. ValidatingWebhook을 활용하여 보안 정책 위반 리소스 생성 차단

3. kubectl 및 로그 분석을 활용한 Admission Webhook 디버깅 방법

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ MutatingWebhook을 사용하여 Pod 생성 시 특정 레이블을 자동 추가

 

❓ 문제 상황

 

운영팀에서 모든 Pod이 특정 레이블을 포함하도록 표준화해야 하지만, 이를 매번 수동으로 추가하는 것은 비효율적입니다.

이를 해결하기 위해 MutatingWebhook을 설정하여 새로운 Pod이 생성될 때 특정 레이블이 자동으로 추가되도록 해야 합니다.

자동 추가 레이블: "team": "devops"

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. MutatingWebhookConfiguration을 생성하여 Pod이 생성될 때 자동으로 레이블을 추가하는 Webhook을 설정합니다.

 

2. Webhook 서버를 실행하여 변경 요청을 처리할 수 있도록 설정합니다.

 


✅ 정답 Manifest (MutatingWebhook 설정)

 

🔹 MutatingWebhookConfiguration 생성

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: add-label-webhook
webhooks:
  - name: add-label.mydomain.com
    admissionReviewVersions: ["v1"]
    clientConfig:
      service:
        name: webhook-service
        namespace: default
        path: "/mutate"
      caBundle: Cg==
    rules:
      - apiGroups: [""]
        apiVersions: ["v1"]
        operations: ["CREATE"]
        resources: ["pods"]
    sideEffects: None
    timeoutSeconds: 5
    admissionReviewVersions: ["v1"]

이제 새로운 Pod이 생성될 때 자동으로 "team": "devops" 레이블이 추가됨

 


📌 적용 후 예상 결과 값

 

1. 새로운 Pod 생성 후 레이블 확인

kubectl get pod new-pod --show-labels

 

💡 예상 출력 값

NAME       READY   STATUS    RESTARTS   AGE   LABELS
new-pod    1/1     Running   0          1m    team=devops

Pod이 생성될 때 자동으로 레이블이 추가됨

 


2️⃣ ValidatingWebhook을 활용하여 보안 정책 위반 리소스 생성 차단

 

❓ 문제 상황

 

운영팀에서 모든 Pod이 특정 네임스페이스에서만 실행되도록 강제해야 합니다.

이를 위해 ValidatingWebhook을 설정하여 특정 네임스페이스 외에서 생성되는 Pod을 차단해야 합니다.

허용된 네임스페이스: restricted-namespace

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. ValidatingWebhookConfiguration을 생성하여 허용되지 않은 네임스페이스에서의 Pod 생성을 차단합니다.

 

2. Webhook 서버를 실행하여 정책을 검증하고 위반 시 요청을 거부하도록 설정합니다.

 


✅ 정답 Manifest (ValidatingWebhook 설정)

 

🔹 ValidatingWebhookConfiguration 생성

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: restrict-namespace-webhook
webhooks:
  - name: restrict-namespace.mydomain.com
    admissionReviewVersions: ["v1"]
    clientConfig:
      service:
        name: webhook-service
        namespace: default
        path: "/validate"
      caBundle: Cg==
    rules:
      - apiGroups: [""]
        apiVersions: ["v1"]
        operations: ["CREATE"]
        resources: ["pods"]
    sideEffects: None
    timeoutSeconds: 5

이제 특정 네임스페이스 외에서는 Pod을 생성할 수 없음

 


📌 적용 후 예상 결과 값

 

1. 허용되지 않은 네임스페이스에서 Pod 생성 시도

kubectl apply -f pod.yaml -n default

 

💡 예상 출력 값

Error from server (Forbidden): admission webhook "restrict-namespace.mydomain.com" denied the request: Pod creation is only allowed in 'restricted-namespace'

허용된 네임스페이스 외에서는 Pod 생성이 차단됨

 


3️⃣ kubectl 및 로그 분석을 활용한 Admission Webhook 디버깅 방법

 

❓ 문제 상황

 

운영팀에서 Webhook이 정상적으로 동작하는지 확인하고, 요청이 예상대로 처리되는지 점검해야 합니다.

kubectl 및 로그 분석을 활용하여 Webhook의 요청 및 응답을 디버깅해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl get validatingwebhookconfiguration 및 mutatingwebhookconfiguration 명령어를 사용하여 설정을 확인합니다.

 

2. Webhook 서버 로그를 확인하여 요청이 정상적으로 처리되는지 점검합니다.

 


✅ Webhook 상태 확인 및 디버깅 명령어

 

🔹 현재 설정된 MutatingWebhook 및 ValidatingWebhook 조회

kubectl get mutatingwebhookconfiguration
kubectl get validatingwebhookconfiguration

 

💡 예상 출력 값

NAME                       WEBHOOKS   AGE
add-label-webhook          1          5m
restrict-namespace-webhook 1          5m

 

🔹 특정 Webhook의 상세 설정 확인

kubectl describe mutatingwebhookconfiguration add-label-webhook

 

💡 예상 출력 값

Name:         add-label-webhook
Namespace:    default
Rules:
  - API Groups:  [""]
    API Versions:  ["v1"]
    Resources:  ["pods"]
    Operations:  ["CREATE"]

Webhook이 정상적으로 설정되었는지 확인 가능

728x90