# Kubernetes - OPA Gatekeeper

**L'auteur original de cette page est** [**Guillaume**](https://www.linkedin.com/in/guillaume-chapela-ab4b9a196)

## 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 :
```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
```
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 :
```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"
```
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.

## Références

* [https://github.com/open-policy-agent/gatekeeper](https://github.com/open-policy-agent/gatekeeper)
