Kubernetes - OPA Gatekeeper
Reading time: 1 minute
L'auteur original de cette page est Guillaume
Définition
Open Policy Agent (OPA) Gatekeeper est un outil utilisé pour appliquer des politiques d'admission dans Kubernetes. Ces politiques sont définies à l'aide de Rego, un langage de politique fourni par OPA. Ci-dessous se trouve un exemple de base d'une définition de politique utilisant OPA Gatekeeper :
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
Cette politique Rego vérifie si certaines étiquettes sont présentes sur les ressources Kubernetes. Si les étiquettes requises sont manquantes, elle renvoie un message de violation. Cette politique peut être utilisée pour s'assurer que toutes les ressources déployées dans le cluster ont des étiquettes spécifiques.
Appliquer la contrainte
Pour utiliser cette politique avec OPA Gatekeeper, vous devez définir un ConstraintTemplate et une Constraint dans Kubernetes :
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"
Dans cet exemple YAML, nous définissons un ConstraintTemplate pour exiger des étiquettes. Ensuite, nous nommons cette contrainte ensure-pod-has-label
, qui fait référence au ConstraintTemplate k8srequiredlabels
et spécifie les étiquettes requises.
Lorsque Gatekeeper est déployé dans le cluster Kubernetes, il appliquera cette politique, empêchant la création de pods qui n'ont pas les étiquettes spécifiées.