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 Copier lienLien copié sur presse-papiers!
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
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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=$()’
$ curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d ‘instance=$()&ip=$()’
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 Copier lienLien copié sur presse-papiers!
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
Créer le pod pour le conteneur Init:
Créez un fichier YAML similaire à ce qui suit:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le pod:
oc create -f myapp.yaml
$ oc create -f myapp.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Afficher l’état du pod:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 5s
NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le statut pod, Init:0/2, indique qu’il attend les deux services.
Créez le service myservice.
Créez un fichier YAML similaire à ce qui suit:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le pod:
oc create -f myservice.yaml
$ oc create -f myservice.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Afficher l’état du pod:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:1/2 0 5s
NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:1/2 0 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le statut pod, Init:1/2, indique qu’il attend un service, dans ce cas le service mydb.
Créer le service mydb:
Créez un fichier YAML similaire à ce qui suit:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le pod:
oc create -f mydb.yaml
$ oc create -f mydb.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Afficher l’état du pod:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 2m
NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 2m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le statut de la gousse indique qu’il n’attend plus les services et qu’il est en cours d’exécution.