Kubernetes - OPA Gatekeeper

Reading time: 1 minute

O autor original desta página é Guillaume

Definição

Open Policy Agent (OPA) Gatekeeper é uma ferramenta usada para impor políticas de admissão no Kubernetes. Essas políticas são definidas usando Rego, uma linguagem de política fornecida pelo OPA. Abaixo está um exemplo básico de uma definição de política usando 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 Rego verifica se certos rótulos estão presentes nos recursos do Kubernetes. Se os rótulos exigidos estiverem ausentes, ela retorna uma mensagem de violação. Esta política pode ser usada para garantir que todos os recursos implantados no cluster tenham rótulos específicos.

Aplicar Restrição

Para usar esta política com OPA Gatekeeper, você deve definir um ConstraintTemplate e um Constraint no 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"

Neste exemplo de YAML, definimos um ConstraintTemplate para exigir rótulos. Em seguida, nomeamos essa restrição como ensure-pod-has-label, que referencia o ConstraintTemplate k8srequiredlabels e especifica os rótulos exigidos.

Quando o Gatekeeper é implantado no cluster Kubernetes, ele aplicará essa política, impedindo a criação de pods que não tenham os rótulos especificados.

Referências