Gatekeeper
Kubernetes용 OPA 통합 도구
Kubernetes용 OPA 통합 도구
Gatekeeper는 Kubernetes 클러스터에 OPA(Open Policy Agent)를 통합하여 선언적 정책을 강제하는 어드미션 컨트롤러입니다. Pod, Service, Ingress 등 모든 Kubernetes 리소스 생성/수정 요청을 정책에 따라 허용하거나 거부합니다.
Gatekeeper는 ConstraintTemplate과 Constraint라는 두 가지 CRD를 사용합니다. ConstraintTemplate은 Rego 언어로 정책 로직을 정의하고, Constraint는 해당 템플릿을 특정 리소스에 적용합니다. 이를 통해 "privileged 컨테이너 금지", "특정 레지스트리 이미지만 허용", "리소스 제한 필수" 같은 정책을 선언적으로 관리합니다.
OPA Gatekeeper 라이브러리(gatekeeper-library)에서 즉시 사용 가능한 정책 템플릿을 제공합니다. Pod Security Standards(PSS)를 Gatekeeper로 구현한 정책, CIS 벤치마크 정책 등을 바로 적용할 수 있습니다.
Kyverno와 자주 비교되는데, Gatekeeper는 Rego 언어로 복잡한 정책을 표현할 수 있고, Kyverno는 YAML 기반으로 학습 곡선이 낮습니다. 조직의 정책 복잡도와 팀의 Rego 숙련도에 따라 선택합니다.
# Gatekeeper 설치
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm install gatekeeper gatekeeper/gatekeeper -n gatekeeper-system --create-namespace
# ConstraintTemplate: 허용된 레지스트리만 이미지 사용
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8sallowedrepos
spec:
crd:
spec:
names:
kind: K8sAllowedRepos
validation:
openAPIV3Schema:
type: object
properties:
repos:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sallowedrepos
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
satisfied := [good | repo = input.parameters.repos[_]; good = startswith(container.image, repo)]
not any(satisfied)
msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
}
---
# Constraint: 프로덕션 네임스페이스에 적용
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
name: prod-allowed-repos
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["production"]
parameters:
repos:
- "ghcr.io/myorg/"
- "gcr.io/myproject/"
# 정책 위반 테스트
kubectl run nginx --image=nginx -n production
# Error: admission webhook "validation.gatekeeper.sh" denied the request:
# container has an invalid image repo , allowed repos are ["ghcr.io/myorg/", "gcr.io/myproject/"]
플랫폼: "프로덕션에서 privileged 컨테이너가 발견됐어요. Gatekeeper로 차단 정책 넣읍시다."
개발팀: "모니터링 에이전트가 privileged 필요한데 어떡하죠?"
플랫폼: "예외 처리 가능해요. kube-system 네임스페이스는 exclude하거나, 특정 ServiceAccount만 허용하는 Constraint를 만들면 됩니다."
면접관: "Kubernetes 정책 관리를 어떻게 하시겠어요?"
지원자: "OPA Gatekeeper로 어드미션 정책을 구현합니다. gatekeeper-library의 PSS 정책을 기본으로 적용하고, 조직 요구사항에 맞는 커스텀 ConstraintTemplate을 추가합니다. Audit 모드로 기존 리소스 위반 현황을 파악하고 점진적으로 Deny로 전환합니다."
리뷰어: "이 ConstraintTemplate Rego에서 not any(satisfied) 대신 count(satisfied) == 0 쓰는 게 가독성이 나을 것 같아요."
작성자: "동의합니다. 그리고 violation 메시지에 namespace도 추가하겠습니다."