Kubernetes - OPA Gatekeeper

Reading time: 1 minute

L'autore originale di questa pagina è Guillaume

Definizione

Open Policy Agent (OPA) Gatekeeper è uno strumento utilizzato per applicare politiche di ammissione in Kubernetes. Queste politiche sono definite utilizzando Rego, un linguaggio di policy fornito da OPA. Di seguito è riportato un esempio base di una definizione di policy utilizzando 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

Questa policy Rego verifica se sono presenti determinate etichette sulle risorse Kubernetes. Se le etichette richieste mancano, restituisce un messaggio di violazione. Questa policy può essere utilizzata per garantire che tutte le risorse distribuite nel cluster abbiano etichette specifiche.

Applica Vincolo

Per utilizzare questa policy con OPA Gatekeeper, è necessario definire un ConstraintTemplate e un Constraint in Kubernetes:

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 questo esempio YAML, definiamo un ConstraintTemplate per richiedere etichette. Poi, nominiamo questo vincolo ensure-pod-has-label, che fa riferimento al ConstraintTemplate k8srequiredlabels e specifica le etichette richieste.

Quando Gatekeeper è distribuito nel cluster Kubernetes, applicherà questa politica, impedendo la creazione di pod che non hanno le etichette specificate.

Riferimenti