Passer au contenu principal

Expertise (Kubernetes)

Custom Resource Definitions et Operators

Kubernetes est extensible par conception. Les Custom Resource Definitions (CRD) permettent d'ajouter ses propres types d'objets à l'API Kubernetes. Les Operators combinent CRDs et controllers pour automatiser la gestion d'applications stateful complexes — bases de données, brokers, systèmes distribués.

Custom Resource Definitions

Une CRD enregistre un nouveau type d'objet dans l'API server. Une fois créée, on peut utiliser kubectl pour créer, lister, modifier et supprimer des instances de ce type — exactement comme un Deployment ou un Service.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: databaseclusters.db.example.com
spec:
  group: db.example.com
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              replicas:
                type: integer
                minimum: 1
              version:
                type: string
              storageSize:
                type: string
  scope: Namespaced
  names:
    plural: databaseclusters
    singular: databasecluster
    kind: DatabaseCluster
    shortNames: ["dbc"]
kubectl apply -f databasecluster-crd.yaml
kubectl get crds
kubectl get databaseclusters

Créer une Custom Resource

apiVersion: db.example.com/v1
kind: DatabaseCluster
metadata:
  name: prod-db
spec:
  replicas: 3
  version: "17"
  storageSize: "50Gi"

Controller personnalisé

Une CRD seule ne fait rien. Un controller surveille les instances de la CRD et agit pour faire converger l'état réel vers l'état désiré. C'est la boucle de réconciliation (reconcile loop).

Les frameworks pour écrire des controllers Kubernetes :

  • controller-runtime (Go) : utilisé par Kubebuilder et Operator SDK. Standard de l'écosystème.
  • Kubebuilder (Go) : génère le scaffolding complet (CRD, controller, webhooks, tests).
  • Operator SDK (Go / Ansible / Helm) : surcouche de Kubebuilder, supporte Ansible et Helm pour les équipes non-Go.
  • kopf (Python) : framework Python pour les controllers. Plus simple pour prototyper.
# Scaffolding avec Kubebuilder
kubebuilder init --domain example.com --repo github.com/myorg/db-operator
kubebuilder create api --group db --version v1 --kind DatabaseCluster
make manifests   # Génère les CRDs depuis les structs Go
make install     # Installe les CRDs dans le cluster
make run         # Lance le controller en local

Operators de référence

Avant d'écrire un operator, vérifier Operator Hub ou Artifact Hub — il en existe probablement un :

  • CloudNativePG : Operator PostgreSQL, référence pour la gestion de clusters PG en production sur Kubernetes
  • Prometheus Operator : gestion de Prometheus via CRDs (ServiceMonitor, PrometheusRule...)
  • cert-manager : gestion de certificats TLS
  • External Secrets Operator : synchronisation depuis Vault, AWS Secrets Manager, GCP Secret Manager
  • Strimzi : Kafka sur Kubernetes

Sources