Kubernetes - OPA Gatekeeper

Reading time: 1 minute

Der ursprüngliche Autor dieser Seite ist Guillaume

Definition

Open Policy Agent (OPA) Gatekeeper ist ein Tool, das verwendet wird, um Zulassungspolitiken in Kubernetes durchzusetzen. Diese Politiken werden mit Rego definiert, einer von OPA bereitgestellten Richtlinensprache. Unten ist ein einfaches Beispiel für eine Richtlinendefinition mit 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

Diese Rego-Richtlinie überprüft, ob bestimmte Labels auf Kubernetes-Ressourcen vorhanden sind. Wenn die erforderlichen Labels fehlen, gibt sie eine Verletzungsnachricht zurück. Diese Richtlinie kann verwendet werden, um sicherzustellen, dass alle im Cluster bereitgestellten Ressourcen über spezifische Labels verfügen.

Constraint anwenden

Um diese Richtlinie mit OPA Gatekeeper zu verwenden, würden Sie ein ConstraintTemplate und ein Constraint in Kubernetes definieren:

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"

In diesem YAML-Beispiel definieren wir ein ConstraintTemplate, um Labels zu verlangen. Dann benennen wir diese Einschränkung ensure-pod-has-label, die auf das k8srequiredlabels ConstraintTemplate verweist und die erforderlichen Labels angibt.

Wenn Gatekeeper im Kubernetes-Cluster bereitgestellt wird, wird es diese Richtlinie durchsetzen und die Erstellung von Pods verhindern, die nicht über die angegebenen Labels verfügen.

References