Part 11: Admission Webhook - 정책 제어
Part 11: Admission Webhook - 정책 제어
Part 11: Admission Control 및 정책
27. Admission Controllers
27.1 Admission Controller 개념
Admission Controller란?
Admission Controller는 API 요청이 인증/인가를 통과한 후, etcd에 저장되기 전에 요청을 가로채서 검증하거나 수정하는 플러그인이다.
API 요청 처리 흐름:
1
2
3
4
5
6
7
8
9
1. Authentication (인증)
↓
2. Authorization (인가: RBAC)
↓
3. Admission Control
├─ Mutating Admission: 요청 수정
└─ Validating Admission: 요청 검증
↓
4. etcd에 저장
주요 내장 Admission Controllers:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NamespaceLifecycle:
- 삭제 중인 네임스페이스에 리소스 생성 차단
- default, kube-system, kube-public 삭제 차단
LimitRanger:
- LimitRange 정책 적용
ResourceQuota:
- ResourceQuota 정책 적용
ServiceAccount:
- ServiceAccount 자동 생성 및 토큰 주입
DefaultStorageClass:
- PVC에 기본 StorageClass 자동 설정
PodSecurity (신규):
- Pod Security Standards 적용 (v1.23+)
NodeRestriction:
- kubelet이 자기 노드의 Pod만 수정 가능하도록 제한
27.2 Validating Admission
Validating Admission은 요청을 검증하고 승인/거부한다 (수정 불가).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: pod-label-validator
webhooks:
- name: validate.pod.labels
clientConfig:
service:
name: webhook-server
namespace: default
path: "/validate"
caBundle: LS0tLS... # CA 인증서
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 5
failurePolicy: Fail
27.3 Mutating Admission
Mutating Admission은 요청을 수정한 후 다음 단계로 전달한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: sidecar-injector
webhooks:
- name: inject.sidecar
clientConfig:
service:
name: sidecar-injector
namespace: default
path: "/mutate"
caBundle: LS0tLS...
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
28. OPA (Open Policy Agent)
28.1 OPA 개념
OPA (Open Policy Agent)란?
OPA는 정책을 코드로 작성하여 다양한 시스템에서 정책 기반 제어를 할 수 있는 범용 정책 엔진이다.
OPA의 특징:
- 선언적 정책 언어 (Rego)
- Kubernetes 외 다양한 시스템 지원
- 정책과 애플리케이션 분리
28.2 Gatekeeper
Gatekeeper = OPA + Kubernetes:
Gatekeeper는 Kubernetes에서 OPA를 쉽게 사용할 수 있도록 하는 프로젝트다.
Gatekeeper 설치:
1
2
3
4
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.14/deploy/gatekeeper.yaml
# 확인
kubectl get pods -n gatekeeper-system
28.3 정책 작성 (Rego)
ConstraintTemplate 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg, "details": {"missing_labels": missing}}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("You must provide labels: %v", [missing])
}
Constraint 생성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: pods-must-have-labels
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces:
- "production"
parameters:
labels:
- "app"
- "owner"
- "environment"
학습 정리
핵심 개념
- Admission Controllers로 API 요청 검증 및 수정
- Validating Admission으로 요청 검증, Mutating Admission으로 요청 수정
- OPA/Gatekeeper로 복잡한 정책을 Rego 언어로 작성
- ConstraintTemplate과 Constraint로 재사용 가능한 정책 관리
다음 단계
- Admission Controllers 이해
- OPA/Gatekeeper 사용법 학습
- 스케줄링 학습 → Part 12로 이동
실습 과제
- Gatekeeper 설치 및 정책 적용
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Gatekeeper 설치 kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.14/deploy/gatekeeper.yaml # ConstraintTemplate 생성 kubectl apply -f required-labels-template.yaml # Constraint 생성 kubectl apply -f required-labels-constraint.yaml # 테스트 (실패) kubectl run nginx --image=nginx -n production # 테스트 (성공) kubectl run nginx --image=nginx -n production --labels=app=nginx,owner=john,environment=prod
추가 학습 자료
This post is licensed under CC BY 4.0 by the author.