7.2. En utilisant des conteneurs Init pour effectuer des tâches avant le déploiement d’un pod


Le service OpenShift Red Hat sur AWS fournit des conteneurs init, qui sont des conteneurs spécialisés qui s’exécutent avant les conteneurs d’application et peuvent contenir des utilitaires ou des scripts de configuration qui ne sont pas présents dans une image de l’application.

7.2.1. Comprendre les conteneurs d’entrée

Il est possible d’utiliser une ressource Init Container pour effectuer des tâches avant que le reste d’un pod ne soit déployé.

La gousse peut avoir des conteneurs Init en plus des conteneurs d’application. Les conteneurs init vous permettent de réorganiser les scripts d’installation et le code de liaison.

Le conteneur Init peut:

  • Contenir et exécuter des utilitaires qui ne sont pas souhaitables d’inclure dans l’image Container de l’application pour des raisons de sécurité.
  • Contenir des utilitaires ou du code personnalisé pour la configuration qui n’est pas présent dans une image de l’application. À titre d’exemple, il n’est pas nécessaire de faire une image d’une autre image juste pour utiliser un outil comme sed, awk, python, ou creuser pendant la configuration.
  • Utilisez les espaces de noms Linux afin qu’ils aient des vues différentes du système de fichiers des conteneurs d’applications, tels que l’accès aux secrets auxquels les conteneurs d’applications ne sont pas en mesure d’accéder.

Chaque conteneur Init doit compléter avec succès avant le début du prochain. Ainsi, les conteneurs Init fournissent un moyen facile de bloquer ou de retarder le démarrage des conteneurs d’applications jusqu’à ce que certaines conditions préalables soient remplies.

À titre d’exemple, vous pouvez utiliser les conteneurs Init suivants:

  • Attendez qu’un service soit créé avec une commande shell comme:

    for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
    Copy to Clipboard Toggle word wrap
  • Enregistrez ce pod avec un serveur distant à partir de l’API descendante avec une commande comme:

    $ curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d ‘instance=$()&ip=$()
    Copy to Clipboard Toggle word wrap
  • Attendez un certain temps avant de démarrer l’application Container avec une commande comme Sleep 60.
  • Cloner un dépôt git dans un volume.
  • Placez les valeurs dans un fichier de configuration et exécutez un outil de modèle pour générer dynamiquement un fichier de configuration pour l’application principale Container. À titre d’exemple, placez la valeur POD_IP dans une configuration et générez le fichier de configuration de l’application principale à l’aide de Jinja.

Consultez la documentation de Kubernetes pour plus d’informations.

7.2.2. Créer des conteneurs Init

L’exemple suivant présente un simple pod qui a deux conteneurs Init. La première attend mon service et la seconde attend mydb. Après la fin des deux conteneurs, la gousse commence.

Procédure

  1. Créer le pod pour le conteneur Init:

    1. Créez un fichier YAML similaire à ce qui suit:

      apiVersion: v1
      kind: Pod
      metadata:
        name: myapp-pod
        labels:
          app: myapp
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
        - name: myapp-container
          image: registry.access.redhat.com/ubi9/ubi:latest
          command: ['sh', '-c', 'echo The app is running! && sleep 3600']
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
        initContainers:
        - name: init-myservice
          image: registry.access.redhat.com/ubi9/ubi:latest
          command: ['sh', '-c', 'until getent hosts myservice; do echo waiting for myservice; sleep 2; done;']
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
        - name: init-mydb
          image: registry.access.redhat.com/ubi9/ubi:latest
          command: ['sh', '-c', 'until getent hosts mydb; do echo waiting for mydb; sleep 2; done;']
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      Copy to Clipboard Toggle word wrap
    2. Créer le pod:

      $ oc create -f myapp.yaml
      Copy to Clipboard Toggle word wrap
    3. Afficher l’état du pod:

      $ oc get pods
      Copy to Clipboard Toggle word wrap

      Exemple de sortie

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     0/1       Init:0/2            0          5s
      Copy to Clipboard Toggle word wrap

      Le statut pod, Init:0/2, indique qu’il attend les deux services.

  2. Créez le service myservice.

    1. Créez un fichier YAML similaire à ce qui suit:

      kind: Service
      apiVersion: v1
      metadata:
        name: myservice
      spec:
        ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
      Copy to Clipboard Toggle word wrap
    2. Créer le pod:

      $ oc create -f myservice.yaml
      Copy to Clipboard Toggle word wrap
    3. Afficher l’état du pod:

      $ oc get pods
      Copy to Clipboard Toggle word wrap

      Exemple de sortie

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     0/1       Init:1/2            0          5s
      Copy to Clipboard Toggle word wrap

      Le statut pod, Init:1/2, indique qu’il attend un service, dans ce cas le service mydb.

  3. Créer le service mydb:

    1. Créez un fichier YAML similaire à ce qui suit:

      kind: Service
      apiVersion: v1
      metadata:
        name: mydb
      spec:
        ports:
        - protocol: TCP
          port: 80
          targetPort: 9377
      Copy to Clipboard Toggle word wrap
    2. Créer le pod:

      $ oc create -f mydb.yaml
      Copy to Clipboard Toggle word wrap
    3. Afficher l’état du pod:

      $ oc get pods
      Copy to Clipboard Toggle word wrap

      Exemple de sortie

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     1/1       Running             0          2m
      Copy to Clipboard Toggle word wrap

      Le statut de la gousse indique qu’il n’attend plus les services et qu’il est en cours d’exécution.

Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat