J'ai 2 services. Un contenant 2 répliques pod pour une application web qui dépend d'un autre service backend ayant pod (2 répliques) pour les conteneurs MySQL.
L'application Web utilise des variables d'environnement définies par le service de base de données backend. J'ai tous les json dans le même répertoire.
Existe-t-il un moyen d'exprimer les dépendances afin que kubectl crée (et exécute) toujours des pods et des services backend avant de démarrer le service d'application Web? J'ai utilisé kubedeam pour créer le cluster.
Je peux suggérer deux solutions:
Tout d'abord, pour attacher un conteneur d'initialisation aux serveurs Web qui attend que MySQL soit opérationnel. Le déploiement serait quelque chose comme ceci:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
selector:
matchLabels:
app: web
replicas: 2
template:
metadata:
labels:
app: web
spec:
initContainers:
- name: init-wait
image: Alpine
command: ["sh", "-c", "for i in $(seq 1 300); do nc -zvw1 mysql 3306 && exit 0 || sleep 3; done; exit 1"]
containers:
- name: web
image: web-server
ports:
- containerPort: 80
protocol: TCP
Il utilise netcat pour essayer de démarrer une connexion TCP au service mysql sur le port 3306 toutes les 3 secondes. Une fois qu'il parvient à se connecter, le conteneur init se termine et le serveur Web démarre normalement.
La deuxième option consiste à utiliser Mirantis AppController . Il vous permet de créer des objets de dépendance selon vos besoins entre les déploiements de serveur et de base de données. Consultez leur dépôt pour une documentation complète.
Utilisez une sonde de préparation ou un conteneur d'initialisation, reportez-vous à ici