# Kubernetes - OPA Gatekeeper **El autor original de esta página es** [**Guillaume**](https://www.linkedin.com/in/guillaume-chapela-ab4b9a196) ## Definición Open Policy Agent (OPA) Gatekeeper es una herramienta utilizada para hacer cumplir políticas de admisión en Kubernetes. Estas políticas se definen utilizando Rego, un lenguaje de políticas proporcionado por OPA. A continuación se muestra un ejemplo básico de una definición de política utilizando 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 ``` Esta política de Rego verifica si ciertas etiquetas están presentes en los recursos de Kubernetes. Si faltan las etiquetas requeridas, devuelve un mensaje de violación. Esta política se puede utilizar para garantizar que todos los recursos desplegados en el clúster tengan etiquetas específicas. ## Aplicar Restricción Para usar esta política con OPA Gatekeeper, debes definir un **ConstraintTemplate** y un **Constraint** en 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" ``` En este ejemplo de YAML, definimos un **ConstraintTemplate** para requerir etiquetas. Luego, nombramos esta restricción `ensure-pod-has-label`, que hace referencia al ConstraintTemplate `k8srequiredlabels` y especifica las etiquetas requeridas. Cuando Gatekeeper se despliega en el clúster de Kubernetes, hará cumplir esta política, impidiendo la creación de pods que no tengan las etiquetas especificadas. ## Referencias * [https://github.com/open-policy-agent/gatekeeper](https://github.com/open-policy-agent/gatekeeper)