Kubernetes - OPA Gatekeeper
Reading time: 1 minute
이 페이지의 원래 저자는 Guillaume입니다.
정의
Open Policy Agent (OPA) Gatekeeper는 Kubernetes에서 승인 정책을 시행하는 데 사용되는 도구입니다. 이러한 정책은 OPA에서 제공하는 정책 언어인 Rego를 사용하여 정의됩니다. 아래는 OPA Gatekeeper를 사용한 정책 정의의 기본 예입니다:
rego
regoCopy codepackage k8srequiredlabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[label]}
missing := required - provided
count(missing) > 0
msg := sprintf("Required labels missing: %v", [missing])
}
default allow = false
이 Rego 정책은 Kubernetes 리소스에 특정 레이블이 있는지 확인합니다. 필수 레이블이 누락된 경우 위반 메시지를 반환합니다. 이 정책은 클러스터에 배포된 모든 리소스가 특정 레이블을 갖도록 보장하는 데 사용할 수 있습니다.
제약 조건 적용
이 정책을 OPA Gatekeeper와 함께 사용하려면 Kubernetes에서 ConstraintTemplate 및 Constraint를 정의해야 합니다:
yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[label]}
missing := required - provided
count(missing) > 0
msg := sprintf("Required labels missing: %v", [missing])
}
default allow = false
yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ensure-pod-has-label
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels:
requiredLabel1: "true"
requiredLabel2: "true"
이 YAML 예제에서는 레이블을 요구하는 ConstraintTemplate을 정의합니다. 그런 다음 이 제약 조건의 이름을 ensure-pod-has-label
로 지정하고, 이는 k8srequiredlabels
ConstraintTemplate을 참조하며 필요한 레이블을 지정합니다.
Gatekeeper가 Kubernetes 클러스터에 배포되면, 이 정책을 시행하여 지정된 레이블이 없는 포드의 생성을 방지합니다.