Kubernetes - OPA Gatekeeper

이 페이지의 원 저자는 Guillaume

정의

Open Policy Agent (OPA) Gatekeeper는 Kubernetes에서 입장 정책을 강제하는 데 사용되는 도구입니다. 이러한 정책은 OPA가 제공하는 정책 언어인 Rego를 사용하여 정의됩니다. 아래는 OPA 게이트키퍼를 사용한 정책 정의의 기본 예제입니다:

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에 ConstraintTemplateConstraint을 정의해야 합니다:

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
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을 참조하고 필요한 레이블을 지정합니다.

Kubernetes 클러스터에 Gatekeeper가 배포되면이 정책을 강제하여 지정된 레이블이없는 팟의 생성을 방지합니다.

참고 자료

Last updated