쿠버네티스에서는 새로운 리소스가 생성될 때, 이를 검증하고 승인하는 기능이 필요할 수 있습니다.
이를 위해 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이 정상적으로 설정되었는지 확인 가능