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 databaseclustersCré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 localOperators 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