
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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 »Qu’est-ce qu’une CRD ?
Section intitulée « Qu’est-ce qu’une CRD ? »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.
| Concept | Analogie | Exemple |
|---|---|---|
| CRD | Définition de table SQL | kind: PostgresCluster |
| Custom Resource (CR) | Ligne dans la table | Un cluster PostgreSQL spécifique |
| Operator | Application qui réagit aux CRs | Crée les Pods, Services, Secrets nécessaires |
Le pattern Controller
Section intitulée « Le pattern Controller »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 │└─────────────────────────────────────────────────────────────┘Découvrir les CRDs de votre cluster
Section intitulée « Découvrir les CRDs de votre cluster »Lister toutes les CRDs
Section intitulée « Lister toutes les CRDs »# Toutes les CRDs installéeskubectl 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:00ZExplorer une CRD spécifique
Section intitulée « Explorer une CRD spécifique »# Détails d'une CRDkubectl describe crd certificates.cert-manager.io
# Structure YAML de la CRDkubectl get crd certificates.cert-manager.io -o yamlDécouvrir les API groups
Section intitulée « Découvrir les API groups »# Tous les types de ressources disponibles (natifs + custom)kubectl api-resources
# Filtrer par API groupkubectl 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 IssuerLister les ressources custom
Section intitulée « Lister les ressources custom »# Lister les instances d'une CRkubectl get certificates -n mon-namespace
# Dans tous les namespaceskubectl get certificates -A
# Avec plus de détailskubectl get certificates -o wideInteragir avec des ressources custom
Section intitulée « Interagir avec des ressources custom »Créer une ressource custom
Section intitulée « Créer une ressource custom »Le format est identique aux ressources natives. Exemple avec cert-manager :
apiVersion: cert-manager.io/v1kind: Certificatemetadata: name: mon-app-tls namespace: productionspec: secretName: mon-app-tls-secret issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - mon-app.example.com - www.mon-app.example.comkubectl apply -f certificate.yamlInspecter une ressource custom
Section intitulée « Inspecter une ressource custom »# Détails completskubectl describe certificate mon-app-tls -n production
# YAML brutkubectl get certificate mon-app-tls -n production -o yaml
# JSONPath pour extraire un champkubectl get certificate mon-app-tls -n production \ -o jsonpath='{.status.conditions[0].status}'Comprendre le champ status
Section intitulée « Comprendre le champ 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"Modifier une ressource custom
Section intitulée « Modifier une ressource custom »# Édition interactivekubectl 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"]}}'Supprimer une ressource custom
Section intitulée « Supprimer une ressource custom »kubectl delete certificate mon-app-tls -n productionExemples de CRDs courantes
Section intitulée « Exemples de CRDs courantes »cert-manager : Certificats TLS
Section intitulée « cert-manager : Certificats TLS »apiVersion: cert-manager.io/v1kind: Certificatemetadata: name: api-tls namespace: productionspec: secretName: api-tls-secret issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - api.example.comPrometheus : ServiceMonitor
Section intitulée « Prometheus : ServiceMonitor »apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: mon-app namespace: monitoringspec: selector: matchLabels: app: mon-app endpoints: - port: metrics interval: 30sArgo CD : Application
Section intitulée « Argo CD : Application »apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: mon-app namespace: argocdspec: 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: trueExternal Secrets : Intégration vault
Section intitulée « External Secrets : Intégration vault »apiVersion: external-secrets.io/v1beta1kind: ExternalSecretmetadata: name: db-credentials namespace: productionspec: 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: passwordInstaller un opérateur
Section intitulée « Installer un opérateur »Option 1 : Helm (recommandé)
Section intitulée « Option 1 : Helm (recommandé) »La plupart des opérateurs sont distribués via Helm :
# Exemple : cert-managerhelm repo add jetstack https://charts.jetstack.iohelm repo update
helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set crds.enabled=trueOption 2 : kubectl apply
Section intitulée « Option 2 : kubectl apply »Certains opérateurs fournissent un manifest unique :
# Exemple : metrics-serverkubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlOption 3 : OperatorHub (OpenShift / OLM)
Section intitulée « Option 3 : OperatorHub (OpenShift / OLM) »Si votre cluster utilise Operator Lifecycle Manager :
# 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 OperatorHubkubectl create -f https://operatorhub.io/install/prometheus.yamlDiagnostiquer les problèmes
Section intitulée « Diagnostiquer les problèmes »La CR reste en état Pending/Unknown
Section intitulée « La CR reste en état Pending/Unknown »# 1. Vérifier les événements de la CRkubectl describe <kind> <name> -n <namespace>
# 2. Vérifier que l'opérateur tournekubectl get pods -n <operator-namespace>
# 3. Lire les logs de l'opérateurkubectl 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 »# Le CRD n'est pas installékubectl get crd | grep <kind>
# Solution : installer l'opérateur d'abordLa CR est bloquée en Terminating
Section intitulée « La CR est bloquée en Terminating »# Vérifier les finalizerskubectl get <kind> <name> -o jsonpath='{.metadata.finalizers}'
# Si l'opérateur ne tourne plus, retirer le finalizer manuellementkubectl patch <kind> <name> \ --type=json \ -p='[{"op": "remove", "path": "/metadata/finalizers"}]'Problème de permissions
Section intitulée « Problème de permissions »L’opérateur n’a pas les droits nécessaires :
# Vérifier les logs pour des erreurs RBACkubectl logs -n <operator-namespace> deployment/<operator-name> | grep -i forbidden
# Vérifier les Roles/ClusterRoles de l'opérateurkubectl get clusterrole | grep <operator-name>kubectl describe clusterrole <operator-role>Utiliser kubectl explain
Section intitulée « Utiliser kubectl explain »La commande kubectl explain fonctionne aussi avec les CRDs :
# Structure généralekubectl explain certificate
# Champ spécifiquekubectl explain certificate.spec.issuerRef
# Liste des champs disponibleskubectl explain certificate.spec --recursiveBonnes pratiques développeur
Section intitulée « Bonnes pratiques développeur »Avant de créer une CR
Section intitulée « Avant de créer une CR »- Vérifiez que la CRD existe :
kubectl get crd <name> - Lisez la documentation : Les CRDs ont souvent des exemples
- Utilisez kubectl explain : Pour comprendre les champs disponibles
- Validez avec
--dry-run:kubectl apply -f cr.yaml --dry-run=client
Nommage et organisation
Section intitulée « Nommage et organisation »- Préfixez par application :
mon-app-certificateplutôt quecertificate-1 - Utilisez des labels : Facilitez le filtrage et le monitoring
- Documentez : Ajoutez des annotations expliquant le but
Surveillance
Section intitulée « Surveillance »- Surveillez les status : Les CRs exposent leur état dans
.status - Alertez sur les échecs : Conditions
Ready=FalseouFailed=True - Tracez les changements : Activez l’audit logging pour les CRs sensibles
À retenir
Section intitulée « À retenir »| Concept | Ce qu’il faut retenir |
|---|---|
| CRD | Nouveau type de ressource Kubernetes |
| CR (Custom Resource) | Instance d’une CRD |
| Operator | Controller qui gère les CRs |
kubectl api-resources | Découvrir les types disponibles |
kubectl explain | Comprendre la structure d’une CR |
.status.conditions | État de la ressource |
| Finalizers | Retardent 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.
Testez vos connaissances
Section intitulée « Testez vos connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications