Les offres mélangent souvent deux profils. L'administrateur Kubernetes installe, met à jour et dépanne des clusters avec Helm, Terraform et kubectl. Le développeur Go Kubernetes construit des extensions : une CRD qui décrit une base de données ou un environnement, un contrôleur qui crée les ressources correspondantes, un webhook qui refuse une configuration invalide. Il lit le code de client-go et de controller-runtime, et il sait ce que fait l'API server quand deux écritures arrivent en même temps.
Le CV montre mal la différence. « Opérateur Kubernetes » peut désigner un chart Helm empaqueté avec Operator SDK ou un contrôleur Go écrit avec Kubebuilder et maintenu en production. Demandez ce que fait Reconcile quand l'objet vient d'être supprimé, comment le statut est mis à jour et comment le contrôleur a été testé. Une réponse floue sur la réconciliation signale un usage d'outils tout faits.
Côté Go, le niveau attendu est celui d'un développeur back-end confirmé : context.Context, goroutines, erreurs, tests table-driven. La plupart des bugs d'un opérateur viennent pourtant de Kubernetes : cache pas encore à jour, conflit de version d'objet, finaliseur jamais retiré. Le PDF couvre six axes et un cas de 20 minutes.
Les bibliothèques Go et les objets Kubernetes du poste
client-go
La bibliothèque officielle pour appeler l'API Kubernetes en Go. Elle fournit les clients typés, les informers qui gardent une copie locale des objets et les files de travail avec limitation de débit. Les autres outils du poste reposent dessus. Un candidat qui l'a utilisée directement comprend mieux ce que les frameworks font à sa place.
controller-runtime
Le framework qui organise un contrôleur autour d'une fonction Reconcile. Il gère le cache partagé, les watches, l'élection de leader, les métriques et les webhooks. La plupart des opérateurs Go récents l'utilisent, directement ou via Kubebuilder. L'erreur classique consiste à oublier que les lectures passent par un cache qui peut être en retard.
Kubebuilder
Le générateur de projets d'opérateurs maintenu dans kubernetes-sigs. Il crée la structure, les types Go de la CRD et les marqueurs à partir desquels controller-gen produit le schéma OpenAPI, les rôles RBAC et les manifestes. La série 4 est la version actuelle. Un candidat qui cite Kubebuilder doit savoir ce que ces marqueurs génèrent.
Operator SDK et OLM
L'outil du projet Operator Framework. Pour le Go, il s'appuie sur Kubebuilder. Il permet aussi d'écrire un opérateur avec Helm ou Ansible et de l'empaqueter pour OLM (Operator Lifecycle Manager), très présent sur OpenShift. Un opérateur Helm demande peu de Go : demandez de quel type était l'opérateur cité sur le CV.
CRD (CustomResourceDefinition)
Une CRD ajoute un type d'objet à l'API Kubernetes, avec son schéma de validation, ses versions et sa sous-ressource status. Les règles CEL (x-kubernetes-validations) vérifient des contraintes entre champs sans webhook. Faire évoluer une CRD de v1alpha1 vers v1 sans casser les objets existants demande une conversion entre versions.
Webhooks d'admission
Des services HTTPS que l'API server appelle avant d'enregistrer un objet. Le webhook de mutation complète des valeurs, celui de validation refuse une configuration incorrecte. Ils ont besoin d'un certificat, souvent fourni par cert-manager. Mal configuré, un webhook en panne bloque des créations dans tout le cluster. Les ValidatingAdmissionPolicy en CEL en remplacent une partie.
envtest et kind
envtest démarre un vrai API server et etcd, sans nœuds, pour tester un contrôleur en quelques secondes. kind crée un cluster complet dans des conteneurs Docker pour les tests de bout en bout dans la CI. Sans ces tests, chaque modification se vérifie à la main sur un cluster partagé.
Cobra
La bibliothèque de CLI en Go, utilisée par kubectl et Helm. Les équipes plateforme l'emploient pour leurs outils internes et leurs plugins kubectl, avec la lecture du kubeconfig fournie par cli-runtime. Une bonne CLI se comporte comme kubectl pour le choix du cluster et du contexte.
Le poste se trouve surtout dans les équipes plateforme, qui outillent les développeurs, et dans les équipes qui livrent un logiciel à installer sur Kubernetes. Dans le premier cas, le développeur écrit des opérateurs qui provisionnent des environnements, des bases ou des certificats, et des CLI pour les autres équipes. Dans le second, l'opérateur fait partie du produit et doit gérer des montées de version sur des clusters que l'équipe ne voit jamais. Les candidats viennent du back-end Go ou du SRE. Les premiers manquent parfois de pratique de Kubernetes, les seconds de rigueur sur le code et les tests. La certification CKAD atteste l'usage de Kubernetes pour déployer une application. Elle ne couvre pas l'écriture de contrôleurs.
Six points à noter chez un développeur d'opérateurs
- Go concurrent et gestion des erreurs
- Modèle de l'API Kubernetes et client-go
- Réconciliation idempotente avec controller-runtime
- Conception et versions des CRD
- Webhooks, RBAC et sécurité de l'opérateur
- Tests envtest et exploitation
Ce que le candidat doit savoir répondre sur Reconcile, les conflits et les CRD
Chaque question vient avec ce qu'une bonne réponse contient et le signal qui doit vous alerter. Pas besoin d'être technique pour les poser : écoutez si le candidat raconte du vécu.
Question 1 · confirmé
La fonction Reconcile d'un collègue contient un switch sur le type d'événement : création, modification, suppression. Qu'en pensez-vous ?
Une bonne réponseC'est contraire au modèle de controller-runtime. Reconcile reçoit un nom et un namespace, pas un événement. Elle lit l'état désiré et l'état réel puis fait converger l'un vers l'autre, de façon idempotente. Des événements rapprochés sont fusionnés et, au redémarrage, tous les objets repassent : une logique par événement en rate. La suppression se traite avec deletionTimestamp et un finaliseur.
Signal d'alerteDéfendre le switch, ou garder en mémoire l'état vu à l'événement précédent pour calculer la différence.
Question 2 · confirmé
Deux processus modifient le même Deployment au même moment. Que renvoie l'API server au second, et comment votre code doit-il réagir ?
Une bonne réponseKubernetes applique une concurrence optimiste sur metadata.resourceVersion : la seconde mise à jour reçoit un 409 Conflict. Le code relit l'objet et réapplique sa modification (retry.RetryOnConflict), ou renvoie l'erreur pour une nouvelle réconciliation. Un profil solide préfère un patch ou le server-side apply avec son propre field manager : chaque acteur ne possède que ses champs, et un conflit sur un champ partagé devient explicite.
Signal d'alerteSupprimer la resourceVersion pour forcer l'écriture, ou une boucle de réessais qui renvoie le même objet sans le relire.
Question 3 · confirmé
Un objet de votre CRD reste en Terminating depuis deux jours. Que s'est-il passé, et comment l'évitez-vous ?
Une bonne réponseUn finaliseur n'a jamais été retiré : le nettoyage externe échoue en boucle, le contrôleur a été désinstallé avant ses objets, ou le retrait du finaliseur s'est fait sur un objet périmé et a échoué en conflit. Il regarde metadata.finalizers, les événements et les logs. En prévention, un nettoyage idempotent, un finaliseur retiré seulement après succès, une condition de statut qui affiche l'échec et un ordre de désinstallation documenté. Retirer le finaliseur à la main reste un dernier recours qui laisse des ressources orphelines.
Signal d'alerte« Je fais un kubectl patch pour vider les finalizers », présenté comme la procédure normale.
Question 4 · confirmé
Juste après le déploiement de votre webhook de validation, plus personne ne peut créer de pod dans le cluster. Que s'est-il produit ?
Une bonne réponseUn webhook en failurePolicy Fail que l'API server n'arrive pas à joindre : pod pas encore prêt, certificat expiré, CA bundle non injecté par cert-manager, NetworkPolicy qui bloque. Le sélecteur est souvent trop large et inclut kube-system, voire le namespace du webhook lui-même. Il restreint namespaceSelector et objectSelector, exclut son propre namespace, met plusieurs réplicas avec un PodDisruptionBudget, un timeoutSeconds court, et se demande si une ValidatingAdmissionPolicy en CEL ferait le travail sans service à opérer.
Signal d'alerteRedémarrer l'API server, ou ne pas faire le lien avec failurePolicy et le périmètre du webhook.
Question 5 · senior
Vous devez renommer un champ de votre CRD en v1alpha1 alors que des objets existent déjà en production. Comment procédez-vous ?
Une bonne réponseUne nouvelle version de l'API avec le nouveau nom, une seule version de stockage, et un webhook de conversion entre les deux (dans Kubebuilder, une version hub et des versions convertibles). L'ancienne version reste servie puis passe en deprecated. Avant de la retirer, il réécrit les objets stockés dans la nouvelle version et vérifie status.storedVersions de la CRD. Les champs sans équivalent sont conservés, souvent dans une annotation.
Signal d'alerteRenommer le champ dans la même version, ou supprimer puis recréer la CRD, ce qui supprime tous les objets existants.
Recevez la fiche d'entretien complète en PDF
La fiche pour mener l'entretien de bout en bout, prête à imprimer ou à partager avec le manager.
- 30 questions sur 6 axes, avec la bonne réponse, le signal d'alerte et la relance
- Le niveau visé pour chaque question
- Une mise en situation de 20 minutes et ce qu'on attend du candidat
- La grille d'évaluation de 1 à 4, axe par axe
Opérateurs Kubernetes en Go, les points qui reviennent au recrutement
Faut-il un administrateur Kubernetes ou un développeur Go pour écrire un opérateur ?
Un développeur Go qui comprend Kubernetes de l'intérieur. L'administrateur connaît les objets, kubectl et le dépannage d'un cluster, ce qui aide beaucoup, mais un opérateur reste un programme : concurrence, gestion des erreurs, tests, revue de code. Un profil SRE qui a déjà écrit un contrôleur en production convient. Un profil qui n'a écrit que des charts Helm demandera plusieurs mois de montée en compétence sur Go.
La CKA ou la CKAD garantissent-elles le niveau attendu ?
Elles montrent une bonne pratique de Kubernetes, côté cluster pour la CKA et côté application pour la CKAD. Aucune des deux ne porte sur client-go, controller-runtime ou la conception d'une CRD. Prenez-les comme un signe que les bases sont acquises. Le niveau de développement se vérifie avec du code : un opérateur publié sur GitHub, une contribution à un projet du CNCF ou un exercice en entretien.
Sur quel exercice juger un développeur d'opérateurs ?
Un test technique court en direct marche bien : une CRD simple déjà définie et un contrôleur à compléter pour qu'il crée un Deployment, mette à jour le statut et gère la suppression avec un finaliseur. Une heure suffit avec un projet Kubebuilder préparé et envtest déjà configuré. Demandez à la personne de commenter ses choix. L'idempotence et la gestion des erreurs se voient très vite.
Kubebuilder ou Operator SDK, faut-il l'écrire dans l'offre ?
Pour un opérateur en Go, les deux produisent un projet très proche, puisque Operator SDK s'appuie sur Kubebuilder. Un candidat formé sur l'un s'adapte à l'autre en quelques jours. Précisez plutôt ce qui change vraiment le poste : OLM et OpenShift si vous en dépendez, le nombre de CRD maintenues, la présence de webhooks, les ressources externes à piloter.
Pour structurer vos autres entretiens, consultez aussi nos pages sur les questions d'entretien de recrutement, la méthode de l'entretien structuré et la grille d'évaluation d'entretien.




