Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Operators et CRDs pour développeurs

14 min de lecture

logo kubernetes

Les Custom Resource Definitions (CRDs) étendent Kubernetes avec de nouveaux types de ressources. En tant que développeur, vous n’avez pas besoin de créer des opérateurs — mais vous devez savoir utiliser les ressources custom que d’autres ont créées. Ce guide vous montre comment découvrir, manipuler et diagnostiquer les CRDs dans votre cluster.

  • Comprendre le modèle CRD/Operator sans entrer dans le développement
  • Découvrir les CRDs disponibles dans votre cluster
  • Manipuler des ressources custom avec kubectl
  • Installer un opérateur depuis OperatorHub
  • Diagnostiquer les problèmes courants liés aux CRDs

CRD et Operator : l’essentiel pour un développeur

Section intitulée « CRD et Operator : l’essentiel pour un développeur »

Une Custom Resource Definition (CRD) ajoute un nouveau type d’objet à Kubernetes. Au lieu de manipuler uniquement des Pods, Services ou Deployments, vous pouvez manipuler des objets métier comme PostgresCluster, Certificate ou GitRepository.

ConceptAnalogieExemple
CRDDéfinition de table SQLkind: PostgresCluster
Custom Resource (CR)Ligne dans la tableUn cluster PostgreSQL spécifique
OperatorApplication qui réagit aux CRsCrée les Pods, Services, Secrets nécessaires

L’opérateur est un controller qui observe les ressources custom et agit pour atteindre l’état désiré :

┌─────────────────────────────────────────────────────────────┐
│ Boucle de réconciliation │
├─────────────────────────────────────────────────────────────┤
│ 1. OBSERVER : L'opérateur watch les CRs │
│ 2. COMPARER : État actuel vs état désiré │
│ 3. AGIR : Créer/modifier/supprimer des ressources │
│ 4. RÉPÉTER : En continu │
└─────────────────────────────────────────────────────────────┘
Fenêtre de terminal
# Toutes les CRDs installées
kubectl get crds
# Exemple de sortie :
# NAME CREATED AT
# certificates.cert-manager.io 2026-03-20T10:00:00Z
# issuers.cert-manager.io 2026-03-20T10:00:00Z
# postgresclusters.postgres-operator.crunchydata.com 2026-03-15T08:30:00Z
Fenêtre de terminal
# Détails d'une CRD
kubectl describe crd certificates.cert-manager.io
# Structure YAML de la CRD
kubectl get crd certificates.cert-manager.io -o yaml
Fenêtre de terminal
# Tous les types de ressources disponibles (natifs + custom)
kubectl api-resources
# Filtrer par API group
kubectl api-resources --api-group=cert-manager.io
# Exemple de sortie :
# NAME SHORTNAMES APIVERSION NAMESPACED KIND
# certificates cert cert-manager.io/v1 true Certificate
# issuers cert-manager.io/v1 true Issuer
Fenêtre de terminal
# Lister les instances d'une CR
kubectl get certificates -n mon-namespace
# Dans tous les namespaces
kubectl get certificates -A
# Avec plus de détails
kubectl get certificates -o wide

Le format est identique aux ressources natives. Exemple avec cert-manager :

certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mon-app-tls
namespace: production
spec:
secretName: mon-app-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- mon-app.example.com
- www.mon-app.example.com
Fenêtre de terminal
kubectl apply -f certificate.yaml
Fenêtre de terminal
# Détails complets
kubectl describe certificate mon-app-tls -n production
# YAML brut
kubectl get certificate mon-app-tls -n production -o yaml
# JSONPath pour extraire un champ
kubectl get certificate mon-app-tls -n production \
-o jsonpath='{.status.conditions[0].status}'

Les CRs bien conçues exposent un champ .status mis à jour par l’opérateur :

status:
conditions:
- type: Ready
status: "True"
reason: CertificateIssued
message: Certificate is up to date and has been issued
lastTransitionTime: "2026-03-25T10:30:00Z"
notAfter: "2026-06-25T10:30:00Z"
notBefore: "2026-03-25T10:30:00Z"
renewalTime: "2026-05-25T10:30:00Z"
Fenêtre de terminal
# Édition interactive
kubectl edit certificate mon-app-tls -n production
# Patch (modifier un champ)
kubectl patch certificate mon-app-tls -n production \
--type=merge \
-p '{"spec":{"dnsNames":["mon-app.example.com","api.example.com"]}}'
Fenêtre de terminal
kubectl delete certificate mon-app-tls -n production
certificate-letsencrypt.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: api-tls
namespace: production
spec:
secretName: api-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- api.example.com
servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mon-app
namespace: monitoring
spec:
selector:
matchLabels:
app: mon-app
endpoints:
- port: metrics
interval: 30s
argo-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mon-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/mon-org/mon-app
path: k8s
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-credentials
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: db-credentials
data:
- secretKey: username
remoteRef:
key: secret/data/database
property: username
- secretKey: password
remoteRef:
key: secret/data/database
property: password

La plupart des opérateurs sont distribués via Helm :

Fenêtre de terminal
# Exemple : cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true

Certains opérateurs fournissent un manifest unique :

Fenêtre de terminal
# Exemple : metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Si votre cluster utilise Operator Lifecycle Manager :

Fenêtre de terminal
# Installer OLM (si pas déjà présent)
curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.28.0/install.sh | bash -s v0.28.0
# Installer un opérateur depuis OperatorHub
kubectl create -f https://operatorhub.io/install/prometheus.yaml
Fenêtre de terminal
# 1. Vérifier les événements de la CR
kubectl describe <kind> <name> -n <namespace>
# 2. Vérifier que l'opérateur tourne
kubectl get pods -n <operator-namespace>
# 3. Lire les logs de l'opérateur
kubectl logs -n <operator-namespace> deployment/<operator-name>

Erreur “no matches for kind” lors du kubectl apply

Section intitulée « Erreur “no matches for kind” lors du kubectl apply »
Fenêtre de terminal
# Le CRD n'est pas installé
kubectl get crd | grep <kind>
# Solution : installer l'opérateur d'abord
Fenêtre de terminal
# Vérifier les finalizers
kubectl get <kind> <name> -o jsonpath='{.metadata.finalizers}'
# Si l'opérateur ne tourne plus, retirer le finalizer manuellement
kubectl patch <kind> <name> \
--type=json \
-p='[{"op": "remove", "path": "/metadata/finalizers"}]'

L’opérateur n’a pas les droits nécessaires :

Fenêtre de terminal
# Vérifier les logs pour des erreurs RBAC
kubectl logs -n <operator-namespace> deployment/<operator-name> | grep -i forbidden
# Vérifier les Roles/ClusterRoles de l'opérateur
kubectl get clusterrole | grep <operator-name>
kubectl describe clusterrole <operator-role>

La commande kubectl explain fonctionne aussi avec les CRDs :

Fenêtre de terminal
# Structure générale
kubectl explain certificate
# Champ spécifique
kubectl explain certificate.spec.issuerRef
# Liste des champs disponibles
kubectl explain certificate.spec --recursive
  1. Vérifiez que la CRD existe : kubectl get crd <name>
  2. Lisez la documentation : Les CRDs ont souvent des exemples
  3. Utilisez kubectl explain : Pour comprendre les champs disponibles
  4. Validez avec --dry-run : kubectl apply -f cr.yaml --dry-run=client
  1. Préfixez par application : mon-app-certificate plutôt que certificate-1
  2. Utilisez des labels : Facilitez le filtrage et le monitoring
  3. Documentez : Ajoutez des annotations expliquant le but
  1. Surveillez les status : Les CRs exposent leur état dans .status
  2. Alertez sur les échecs : Conditions Ready=False ou Failed=True
  3. Tracez les changements : Activez l’audit logging pour les CRs sensibles
ConceptCe qu’il faut retenir
CRDNouveau type de ressource Kubernetes
CR (Custom Resource)Instance d’une CRD
OperatorController qui gère les CRs
kubectl api-resourcesDécouvrir les types disponibles
kubectl explainComprendre la structure d’une CR
.status.conditionsÉtat de la ressource
FinalizersRetardent la suppression pour nettoyage

Règle d’or : En tant que développeur, vous utilisez les CRs — vous n’avez pas besoin de comprendre le code de l’opérateur, seulement la spec que vous fournissez et le status qu’il retourne.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
8 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn