OPA Gatekeeper

Open Policy Agent (OPA) is een tool om in Kubernetes controles uit te voeren voordat een deployment geïnstalleerd kan worden. Het is een Admission Controller die als tussenlaag de policies uitvoert. Als er niet aan de voorwaardes in de policies wordt voldaan zal de deployment niet uitgevoerd worden.

OPA maakt gebruik van Templates waarin de Constraints (=beperkingen) worden gedefinieerd. Templates bestaan uit Custom Resource Definitions (CRDs) en Targets die worden geschreven in een taal genaamd ‘Rego‘.

De installatie van OPA kan het best via Helm gedaan worden, in Rancher vind je het terug in ‘Apps & Marketplace’.

OPA kan ook geïnstalleerd worden als Command Line tool.

MacOS:

curl -L -o opa https://openpolicyagent.org/downloads/v0.36.1/opa_darwin_amd64

Linux:

curl -L -o opa https://openpolicyagent.org/downloads/v0.36.1/opa_linux_amd64_static

Windows:

https://openpolicyagent.org/downloads/v0.36.1/opa_windows_amd64.exe

Voorbeelden voor OPA cli vind je hier.

Voorbeeld om pod containers te beperken met resource limits/requests

De Template hiervoor ziet er als volgt uit:

De Constraint die daar bij hoort:

Zoals in de Constraint is aangegeven, mogen de containers maximaal een resource limiet hebben van 200m voor CPU en 1Gi voor memory. De ‘Scope‘ voor de beperking is opgelegd aan de Namespaces ‘go-app’ en ‘default’.

We kunnen nu twee pods proberen aan te maken, één waarbij de limieten binnen de constraints vallen en één die dat overschrijdt.

Met het kubectl commando de pods aanmaken:

$ kubectl -n default apply -f good-pod.yaml
pod/good-pod created
$ kubectl -n default apply -f bad-pod.yaml
Error from server ([container-must-have-limits] container memory limit <2Gi> is higher than the maximum allowed of <1Gi>
Error from server ([container-must-have-limits] container cpu limit <300m> is higher than the maximum allowed of <200m>)