E-NO
Kubernetes 7 min de lecture

Conteneurs d'initialisation Kubernetes : architecture, cycle de vie et mise en œuvre pratique

calendar_today Publié : 2026-11-04
update Dernière mise à jour : 2026-11-04
analytics Efficacité SEO : 100%
Illustration du guide technique pour « Conteneurs d'initialisation Kubernetes : architecture, cycle de vie et mise en œuvre pratique ».

Introduction

Les conteneurs d'initialisation Kubernetes répondent à un défi courant : garantir que certains prérequis sont en place avant le démarrage du conteneur applicatif principal. Ce sont des conteneurs spécialisés qui s'exécutent jusqu'à leur achèvement avant qu'un conteneur d'application d'un pod ne démarre. Alors que le conteneur principal est responsable des fonctionnalités de base de l'application, les conteneurs d'initialisation gèrent les tâches de configuration telles que l'attente des dépendances, la récupération de la configuration, l'exécution de migrations de base de données ou la définition des autorisations de fichiers.

Cette séparation des préoccupations améliore la fiabilité et rend la séquence de démarrage explicite et vérifiable. Au lieu d'intégrer une logique de démarrage complexe dans l'image de l'application, vous pouvez la conserver isolée dans des conteneurs dédiés qui s'exécutent une fois et se terminent avec succès.

Ce guide fournit une explication approfondie des conteneurs d'initialisation, de leur architecture, de leur cycle de vie et de leur utilisation pratique. Nous couvrons les prérequis de version, la configuration sécurisée, la vérification, les modes de défaillance, la reprise, une liste de contrôle opérationnelle et les pièges courants. Le contenu est basé sur le comportement de Kubernetes v1.18+, mais les concepts s'appliquent à toutes les versions prises en charge. À la fin, vous serez en mesure de concevoir et de gérer des conteneurs d'initialisation en toute confiance dans vos propres clusters.

Inventaire des versions et de l'environnement

Avant de mettre en œuvre des conteneurs d'initialisation, vérifiez la version de votre cluster Kubernetes et vos outils. Les conteneurs d'initialisation font partie de Kubernetes depuis la version 1.6, mais plusieurs comportements et pratiques recommandées ont évolué. L'utilisation d'une version récente (v1.18 ou ultérieure) garantit une sémantique stable et l'accès à des améliorations telles que de meilleures métriques de latence de démarrage des pods et une comptabilisation des ressources.

Prérequis

  • Un cluster Kubernetes en cours d'exécution (v1.18+ recommandé).
  • L'outil en ligne de commande kubectl configuré pour accéder au cluster.
  • Une compréhension de base des pods, des conteneurs et des manifestes YAML.
  • L'autorisation de créer des pods et de lire les journaux dans votre espace de noms cible.

Vérifier la version du cluster

Exécutez la commande suivante pour vérifier la version du serveur :

kubectl version --short

Résultat attendu (vos versions peuvent différer) :

Client Version: v1.24.0
Server Version: v1.24.0

Assurez-vous que la version de votre serveur est au moins v1.6. Pour la production, utilisez une version actuellement prise en charge.

Exemple de topologie

Pour ce guide, considérons une topologie simple :

  • Un cluster à nœud unique (minikube ou kind) pour les tests locaux.
  • Un espace de noms appelé demo.
  • Un pod avec deux conteneurs d'initialisation et un conteneur d'application principal.

Créez l'espace de noms si nécessaire :

kubectl create namespace demo

Résultat attendu :

namespace/demo created

Exigences d'accès

Vous avez besoin d'autorisations RBAC pour créer des pods dans l'espace de noms. Si vous utilisez un cluster cloud, assurez-vous que votre kubeconfig est défini. Testez avec :

kubectl auth can-i create pods -n demo

Résultat attendu :

yes

Question rapide 1 sur 2

Selon les passages de référence, en quoi les init containers diffèrent-ils des conteneurs classiques ?

Le passage indique que les init containers sont exactement comme les conteneurs classiques, sauf qu'ils s'exécutent toujours jusqu'à leur terme et que chacun doit se terminer avec succès avant que le suivant ne démarre.

Chemin de configuration sûr

Les conteneurs d'initialisation sont définis dans le champ spec.initContainers d'un pod. Chaque conteneur d'initialisation doit avoir un nom, une image et une commande. Les conteneurs d'initialisation s'exécutent dans l'ordre où ils apparaissent dans la liste, et chacun doit se terminer avec succès avant que le suivant ne démarre. Ils partagent l'espace de noms réseau, les volumes et l'environnement du pod, mais ont leur propre système de fichiers et espace de processus. Cela signifie qu'un conteneur d'initialisation peut accéder aux services via localhost et partager des données avec d'autres conteneurs via des volumes, mais il ne peut pas voir le système de fichiers ou les processus du conteneur d'application.

Options de configuration clés

Lors de la configuration des conteneurs d'initialisation, tenez compte de ces choix limités :

  • Sélection de l'image : Utilisez une image minimale comme base pour les conteneurs d'initialisation afin de réduire la surface d'attaque et le temps de démarrage. Les choix courants incluent busybox, alpine ou une image dédiée avec uniquement les outils nécessaires.
  • Limites de ressources : Définissez resources.requests et resources.limits pour les conteneurs d'initialisation afin d'éviter les conflits de ressources. Notez que l'utilisation des ressources des conteneurs d'initialisation est comptabilisée séparément de celle des conteneurs d'application, et les demandes de ressources effectives du pod sont le maximum des demandes des conteneurs d'initialisation et d'application.
  • Montage de volumes : Partagez des volumes entre les conteneurs d'initialisation et d'application pour transmettre des données (par exemple, des fichiers de configuration). Le conteneur d'initialisation peut écrire dans un volume, et le conteneur d'application peut le lire.
  • Contexte de sécurité : Exécutez les conteneurs d'initialisation avec un utilisateur non root lorsque cela est possible. Certaines tâches d'initialisation peuvent nécessiter des privilèges élevés (par exemple, pour modifier la propriété des fichiers), mais minimisez cela. Utilisez allowPrivilegeEscalation: false et un système de fichiers racine en lecture seule lorsque cela est faisable.
  • Politique de redémarrage : Les conteneurs d'initialisation sont redémarrés par le kubelet en cas d'échec. Vous pouvez définir restartPolicy sur le pod (par exemple, Never pour éviter les redémarrages, mais la valeur par défaut est Always). Notez que si restartPolicy est Never, le pod échoue si un conteneur d'initialisation échoue.

Exemple de configuration

Voici un manifeste de pod avec deux conteneurs d'initialisation : l'un pour attendre un service de base de données, un autre pour récupérer un fichier de configuration, et un conteneur d'application principal.

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
  namespace: demo
spec:
  restartPolicy: Always
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done']
  - name: init-config
    image: busybox:1.28
    command: ['sh', '-c', 'wget -O /config/config.txt http://config-server/config && echo Config fetched']
    volumeMounts:
    - name: config-volume
      mountPath: /config
  containers:
  - name: app
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: config-volume
      mountPath: /config
  volumes:
  - name: config-volume
    emptyDir: {}

Dans cet exemple :

  • Le premier conteneur d'initialisation boucle jusqu'à ce que myservice soit résolu via DNS. Il utilise nslookup de manière répétée jusqu'à succès.
  • Le deuxième conteneur d'initialisation télécharge un fichier de configuration dans un volume partagé à l'aide de wget.
  • Le conteneur d'application monte le même volume pour accéder à la configuration.

Application du manifeste

Enregistrez le manifeste dans init-demo.yaml et appliquez-le :

kubectl apply -f init-demo.yaml

Résultat attendu :

pod/init-demo created

Vérifiez l'état du pod :

kubectl get pod init-demo -n demo

Pendant que les conteneurs d'initialisation s'exécutent, l'état du pod affichera Init:0/2 (s'il y a deux conteneurs d'initialisation), puis Init:1/2, puis PodInitializing, puis Running.

Choix de mise en œuvre limités

Pour un déploiement sûr, commencez par un pilote restreint. Choisissez un seul pod ou déploiement dans un environnement non critique. Testez les conteneurs d'initialisation pour une tâche spécifique (par exemple, attendre une dépendance). Mesurez le temps de démarrage et la fiabilité avant de l'étendre à d'autres charges de travail. Cela réduit les risques et vous permet de valider le modèle dans votre environnement.

Vérification et diagnostic

Après le déploiement, vérifiez que les conteneurs d'initialisation s'exécutent correctement et inspectez leurs journaux et leur état.

Vérifier les journaux des conteneurs d'initialisation

Utilisez kubectl logs avec l'option -c pour spécifier un conteneur d'initialisation :

kubectl logs init-demo -n demo -c init-myservice

Résultat attendu (exemple) :

Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name: myservice.demo.svc.cluster.local
Address 1: 10.96.0.11 myservice.demo.svc.cluster.local

Si le conteneur d'initialisation est toujours en cours d'exécution et en attente, vous verrez des messages répétés waiting for myservice.

Décrire le pod pour l'état d'initialisation

kubectl describe pod affiche les états détaillés des conteneurs d'initialisation :

kubectl describe pod init-demo -n demo

Recherchez la section Init Containers. Extrait d'exemple :

Init Containers:
  init-myservice:
    Container ID: containerd://...
    Image: busybox:1.28
    State: Terminated
      Reason: Completed
      Exit Code: 0
    Ready: True
    Restart Count: 0

Vérifier le flux de données

Si votre conteneur d'initialisation écrit dans un volume partagé, vérifiez que le conteneur d'application peut voir les données. Exécutez une commande dans le conteneur d'application :

kubectl exec -it init-demo -n demo -- ls /config

Résultat attendu :

config.txt

Vérifier les événements du pod

Utilisez kubectl get events pour voir les événements du cycle de vie :

kubectl get events -n demo --field-selector involvedObject.name=init-demo

Les événements attendus incluent Started container init-myservice, Started container init-config, Started container app.

Valider le succès du conteneur d'initialisation

Un pod n'est marqué Running que lorsque tous les conteneurs d'initialisation se sont terminés avec le code 0 et que le conteneur d'application a démarré. Vous pouvez vérifier avec :

kubectl get pod init-demo -n demo -o jsonpath='{.status.phase}'

Résultat attendu :

Running

Si la phase reste Pending avec Init:0/2, quelque chose ne va pas.

Modes de défaillance et reprise

Les conteneurs d'initialisation peuvent échouer pour diverses raisons : commandes incorrectes, dépendances manquantes, ressources insuffisantes ou problèmes réseau. Comprendre ces défaillances vous aide à récupérer rapidement.

Modes de défaillance courants

  • Erreur de commande du conteneur d'initialisation : La commande se termine avec un statut non nul. Le kubelet redémarre le conteneur d'initialisation selon restartPolicy (par défaut Always). Le pod reste à l'état Pending.
  • Échec de récupération de l'image : Si l'image spécifiée pour le conteneur d'initialisation ne peut pas être récupérée (par exemple, mauvais nom, registre indisponible), le pod affichera ErrImagePull ou ImagePullBackOff.
  • Limites de ressources trop basses : Si le conteneur d'initialisation demande plus de CPU/mémoire que disponible, il peut être OOMKilled ou ne pas être planifié.
  • Dépendance non prête : Si un conteneur d'initialisation attend un service qui ne devient jamais disponible, il bouclera indéfiniment, empêchant le démarrage de l'application.
  • Problèmes de montage de volume : Si un volume référencé n'existe pas ou si les autorisations sont incorrectes, le conteneur d'initialisation peut échouer lors de l'accès.

Diagnostiquer les défaillances

Utilisez kubectl describe pod pour voir l'état du conteneur d'initialisation et les événements. Exemple de sortie d'échec :

Init Containers:
  init-myservice:
    State: Waiting
      Reason: CrashLoopBackOff
    Last State: Terminated
      Reason: Error
      Exit Code: 1

Vérifiez les journaux du conteneur d'initialisation en échec :

kubectl logs init-demo -n demo -c init-myservice --previous

Cela affiche les journaux de la tentative échouée précédente.

Étapes de reprise

  • Corrigez le problème sous-jacent (par exemple, corrigez la commande, assurez-vous que le service existe, augmentez les ressources).
  • Si le conteneur d'initialisation est bloqué dans une boucle, vous devrez peut-être supprimer le pod et le recréer après avoir corrigé les dépendances.
  • Pour arrêter un pod bloqué sur des conteneurs d'initialisation, supprimez-le :
kubectl delete pod init-demo -n demo

Appliquez ensuite le manifeste corrigé.

Considérations de restauration

Si vous avez mis en œuvre des conteneurs d'initialisation dans un déploiement, vérifiez l'historique des déploiements :

kubectl rollout history deployment/myapp -n demo

Pour revenir à une révision précédente sans conteneurs d'initialisation :

kubectl rollout undo deployment/myapp -n demo

Ayez toujours un plan de restauration : conservez une copie du manifeste précédent et sachez comment revenir en arrière.

Vérification de la reprise

Après correction, vérifiez que le pod atteint l'état Running et que l'application fonctionne comme prévu. Surveillez pendant quelques minutes pour garantir la stabilité.

Question rapide 2 sur 2

Quels champs ne sont PAS pris en charge par les init containers classiques, d'après le passage sur les différences avec les conteneurs sidecar ?

Le passage indique que les init containers ne prennent pas en charge lifecycle, livenessProbe, readinessProbe ou startupProbe, tandis que les conteneurs sidecar prennent en charge toutes ces sondes.

Pièges courants et comment les éviter

Même les utilisateurs expérimentés de Kubernetes peuvent tomber dans des pièges lors de l'utilisation de conteneurs d'initialisation. Cette section décrit les erreurs fréquentes, pourquoi elles se produisent et les stratégies de prévention et de reprise.

1. Utiliser des conteneurs d'initialisation comme side-cars

Les conteneurs d'initialisation ne sont pas destinés à s'exécuter indéfiniment. Certains utilisateurs configurent à tort un conteneur d'initialisation avec un processus de longue durée, s'attendant à ce qu'il se comporte comme un side-car. Cela bloque indéfiniment le démarrage de l'application.

Pourquoi cela arrive : Mauvaise compréhension du cycle de vie des conteneurs d'initialisation. Un conteneur d'initialisation doit se terminer avec succès pour que le conteneur suivant démarre.

Comment éviter et récupérer : Assurez-vous que les conteneurs d'initialisation ont une condition de sortie claire. Si vous avez besoin d'un processus d'assistance persistant, utilisez un conteneur standard ou un modèle de side-car. Si bloqué, supprimez le pod et corrigez la commande du conteneur d'initialisation pour qu'il se termine après avoir terminé sa tâche.

2. Absence de délais d'attente sur les dépendances

Les conteneurs d'initialisation attendent souvent qu'un service soit prêt (par exemple, en utilisant une boucle avec sleep). Sans délai d'attente, le conteneur d'initialisation boucle indéfiniment si la dépendance n'apparaît jamais, ce qui conduit à un pod bloqué en Pending indéfiniment.

Pourquoi cela arrive : Hypothèse trop optimiste selon laquelle les dépendances démarreront toujours dans un délai raisonnable.

Comment éviter : Incluez un délai d'attente dans la logique d'attente. Par exemple, utilisez une boucle avec un compteur ou un outil comme wait-for-it.sh avec un paramètre de délai. Dans le manifeste, vous pourriez utiliser :

command: ['sh', '-c', 'timeout 60 sh -c "until nslookup myservice; do sleep 2; done"']

Si le délai expire, le conteneur d'initialisation échoue, rendant le problème visible. Combinez avec restartPolicy: Never sur le pod si vous voulez signaler l'échec immédiatement.

3. Ne pas épingler les versions d'image

L'utilisation d'une étiquette flottante comme latest pour les images de conteneurs d'initialisation peut entraîner un comportement imprévisible lorsque l'image change en amont.

Pourquoi cela arrive : Commodité ou méconnaissance de la mutabilité des images.

Comment éviter : Spécifiez toujours une étiquette ou un condensé d'image spécifique (par exemple, busybox:1.28). Envisagez d'utiliser un condensé d'image pour des références immuables.

4. Négliger les demandes de ressources

Les conteneurs d'initialisation peuvent consommer beaucoup de CPU ou de mémoire. Si vous ne définissez pas de limites de ressources, le conteneur d'initialisation pourrait affamer d'autres conteneurs ou provoquer une pression sur le nœud.

Pourquoi cela arrive : Hypothèse selon laquelle les conteneurs d'initialisation sont de courte durée et n'ont donc pas besoin de limites. Mais l'utilisation des ressources au démarrage peut être substantielle, en particulier pour des tâches comme les migrations de base de données.

Comment éviter : Définissez des resources.requests et resources.limits appropriés pour chaque conteneur d'initialisation. Surveillez l'utilisation avec kubectl top pod (si le serveur de métriques est installé) pendant le démarrage.

5. Ignorer le contexte de sécurité

Exécuter des conteneurs d'initialisation en tant que root lorsque ce n'est pas nécessaire élargit la surface d'attaque.

Pourquoi cela arrive : Les images par défaut s'exécutent souvent en tant que root, et les développeurs peuvent ne pas ajuster le contexte de sécurité.

Comment éviter : Spécifiez runAsNonRoot: true et un utilisateur non root dans le contexte de sécurité. N'élevez les privilèges que pour des tâches spécifiques (par exemple, chown) et envisagez d'utiliser fsGroup pour gérer la propriété des fichiers au niveau du pod à la place.

6. Supposer que les conteneurs d'initialisation partagent tout avec les conteneurs d'application

Bien que les conteneurs d'initialisation partagent le réseau et les volumes, ils ne partagent pas le système de fichiers ni l'espace de noms de processus. Certains utilisateurs s'attendent à ce que les fichiers écrits dans le système de fichiers local du conteneur soient visibles par les conteneurs d'application, ce qui est faux.

Pourquoi cela arrive : Confusion sur les frontières d'isolation.

Comment éviter : Utilisez des volumes partagés pour toutes les données qui doivent persister entre les conteneurs d'initialisation et d'application. Évitez de compter sur les modifications du système de fichiers local du conteneur.

7. Ne pas surveiller la durée des conteneurs d'initialisation

Si un conteneur d'initialisation prend plus de temps que prévu, cela retarde le démarrage du pod, mais cela peut passer inaperçu jusqu'à ce que les utilisateurs se plaignent d'une mise à l'échelle lente.

Pourquoi cela arrive : Manque de visibilité sur les métriques de démarrage par conteneur.

Comment éviter : Surveillez la durée des conteneurs d'initialisation en vérifiant les événements et les journaux du pod. Utilisez des outils comme Prometheus et kube-state-metrics pour suivre les métriques kube_pod_init_container_status_... ou les métriques de latence de démarrage des pods.

Liste de contrôle opérationnelle

Utilisez cette liste de contrôle pour les opérations de routine et l'examen des conteneurs d'initialisation dans votre cluster. Attribuez un propriétaire unique pour chaque activité majeure et définissez une cadence d'examen.

Liste de contrôle de mise en œuvre

ÉtapeActionVérificationPropriétaireFréquence d'examen
1Définir des conteneurs d'initialisation avec des noms et des objectifs clairsAnalyse YAML réussieIngénieur DevOps (par ex., Priya Shah)À chaque changement
2Définir des demandes et limites de ressources pour chacunkubectl describe pod montre les limitesIngénieur plateforme (par ex., Carlos Mendes)Mensuel
3Utiliser des images de base minimalesVérifier la taille de l'image et les vulnérabilitésResponsable sécurité (par ex., Amy Chen)Trimestriel
4Monter des volumes partagés pour le passage de donnéesLe conteneur d'application peut accéder aux fichiersDéveloppeur d'application (par ex., John Doe)À chaque changement
5Tester d'abord dans un espace de noms non productifLe pod s'exécute comme prévu en préproductionResponsable QA (par ex., Maria Garcia)À chaque changement

Liste de contrôle de surveillance

MétriqueComment vérifierAttenduPropriétaireSeuil d'alerte
Durée du conteneur d'initialisationkubectl logs --timestamps ou métriquesTemps raisonnable, pas de longues bouclesIngénieur DevOps> 5 minutes pour les pods critiques
Nombre de redémarrageskubectl get pod -o wide0 pour les conteneurs d'initialisation après succèsIngénieur plateforme> 0 redémarrages déclenche une enquête
Latence de démarrage du podComparer avec/sans initialisationAugmentation acceptableDéveloppeur d'application> 30 secondes de délai supplémentaire
Taux d'échecÉvénements et journauxPas d'erreurs récurrentesResponsable QA> 1 échec pour 100 démarrages

Liste de contrôle d'examen

  • Les conteneurs d'initialisation sont-ils utilisés uniquement pour les tâches de configuration nécessaires, pas comme side-cars ? (Propriétaire : Ingénieur plateforme, trimestriel)
  • Existe-t-il un délai d'attente ou une condition d'échec pour les conteneurs d'initialisation qui attendent des dépendances ? (Propriétaire : Ingénieur DevOps, à chaque changement)
  • Les images des conteneurs d'initialisation sont-elles épinglées à des étiquettes spécifiques pour éviter des changements inattendus ? (Propriétaire : Responsable sécurité, mensuel)
  • Les conteneurs d'initialisation respectent-ils les politiques de sécurité (non-root, système de fichiers racine en lecture seule si possible) ? (Propriétaire : Responsable sécurité, mensuel)
  • Existe-t-il une documentation sur ce que fait chaque conteneur d'initialisation et pourquoi ? (Propriétaire : Développeur d'application, lors de l'introduction)

Examinez régulièrement l'utilisation des conteneurs d'initialisation pour vous assurer qu'ils ne sont pas utilisés de manière abusive. Par exemple, n'utilisez pas de conteneurs d'initialisation pour exécuter l'application principale ou des processus de longue durée.

Conclusion

Les conteneurs d'initialisation sont une fonctionnalité puissante de Kubernetes pour gérer les dépendances de démarrage et les tâches de configuration. En comprenant leur architecture et leur cycle de vie, vous pouvez concevoir des pods fiables qui s'initialisent correctement avant de servir le trafic.

Dans ce guide, nous avons couvert :

  • Configuration de la version et de l'environnement (Kubernetes v1.18+ recommandé).
  • Configuration sûre avec une approche pilote restreinte.
  • Vérification à l'aide des journaux, de la description et de l'exécution de commandes.
  • Modes de défaillance et étapes de reprise.
  • Pièges courants et comment les éviter.
  • Une liste de contrôle opérationnelle pour la gestion continue.

Comme prochaine étape, mettez en œuvre des conteneurs d'initialisation dans l'un de vos déploiements de préproduction. Commencez par un simple conteneur d'initialisation d'attente de service, puis étendez à des configurations plus complexes. Surveillez le démarrage du pod et assurez-vous que les procédures de restauration sont en place.

Pour en savoir plus, explorez la documentation Kubernetes sur les conteneurs d'initialisation, le cycle de vie des pods et les meilleures pratiques pour les images de conteneurs.

Les exemples de commandes et de sorties dans cet article sont illustratifs ; adaptez-les à votre environnement.

Recherches connexes

Score de qualité de l’article

Utilité pour le lecteur 100%
  • check_circle Guide prêt à lire
  • check_circle Exemples pratiques inclus
  • check_circle URL d’article optimisée pour le SEO