Aller au contenu
  1. Découvrir/

2 minutes pour comprendre... CEL

·3 mins
Le langage des règles de validation et d’autorisation dans Kubernetes.

En 2 minutes #

CEL ou Common Expression Language est un langage open source dédié à l’évaluation d’expressions. Il a été concu pour être performant (pouvant évaluer en quelques nanosecondes ou microsecondes) et intégré de manière indépendante dans des applications. CEL est donc communément utilisé pour les décisions booléennes mais il est également possible de construire des objets JSON avec. Par exemple, dans l’IAM de Google Cloud, un sous-ensemble de CEL est utilisé pour écrire des conditions permettant de prendre des décisions d’autorisation.

Vis à vis de Kubernetes, CEL est directement utilisé dans l’API afin de déclarer et évaluer des règles de validation, d’autorisation et d’autres contraintes ou conditions. Voici quelques exemples concrets d’utilisation dans Kubernetes :

  • empêcher un utilisateur de dépasser un certain nombre de réplicas dans ses manifestes Kubernetes
  • interdire l’utilisation de certaines valeurs dans les SecurityContext ou bien les Capabilities
  • autoriser une modification sur des ressources en fonction d’un selector
  • contraindre les noms de ressources
  • forcer l’utilisation des probes

En savoir plus… #

Fonctionnalités principales #

Voici un exemple permettant avec CEL d’interdire l’utilisation de tag latest dans les Deployments :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
  name: image-tag-latest
spec:
  failurePolicy: Fail
  matchConstraints:
    resourceRules:
      - apiGroups: ["apps"]
        apiVersions: ["v1"]
        operations: ["CREATE", "UPDATE"]
        resources: ["deployments"]
  validations:
    # the field below contains a CEL expression to validate the request
    - expression: |
        object.spec.template.spec.containers.all(container,
          container.image.contains(":") &&
          [container.image.substring(container.image.lastIndexOf(":")+1)].all(image,
            !image.contains("/") && !(image in ["latest", ""])
          )
        )
      message: "Image tag 'latest' is not allowed. Use a tag from a specific version."
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: image-tag-latest
spec:
  policyName: image-tag-latest # references a `ValidatingAdmissionPolicy` name
  validationActions: [Deny] # `Deny` specifies that a validation failure results in a denied request
  matchResources: {} # an empty `matchResources` means that all resources matched by the policy are validated by this binding

Ecosystème #

Il existe de nombreuses solutions incluant CEL dans leurs fonctionnalités, en voici quelques-unes :

Bon à savoir #

  • CEL est un standard natif de Kubernetes pour la validation de ressources (GA depuis la version 1.30)
  • dans le contexte de Kubernetes, nativement, les ValidatingAdmissionPolicy ne peuvent pas prendre en compte les valeurs présentes dans d’autres ressources précédement appliqués

Technologies similaires #

Liens complémentaires #