La app de dos pods y postgres se crearon correctamente y pueden comunicarse a través de los servicios de cada uno en un nodo. En el proceso actual, los dos pods se crean al mismo tiempo, pero eso se puede cambiar para que se creen o inicien en una secuencia.
Inicialmente, el contenedor de la base de datos en el pod de postgres está vacío y debe inicializarse. El proceso inicial pasa por el módulo de la app y, por lo tanto, también debe estar en funcionamiento. Una vez que se siembra postgres , la app aún no está al tanto de estos nuevos datos y debe reiniciarse. Esta es una falla en la app en sí, sobre la que tengo poco control.
En este momento, el proceso es:
kubectl create -f pods.yaml # creates `app` and `postgres` pods kubectl exec app -- bash -c "<seed command>" kubectl delete pod app sleep 45 # takes a while for `app` to terminate kubectl create -f pods.yaml # Ignore the "postgres pod and service already exist" error ¿Hay una mejor manera de coordinar automáticamente un reinicio de la app una vez que postgres alcanza un estado inicial?
Tal vez hay algún conjunto de aspectos/características de Kubernetes que me falta por completo y que ayuda con tal circunstancia...
Puede usar una "prueba de preparación" en el pod de postgresql que no informará que el contenedor está listo antes de que se importen los datos (por ejemplo, consultar la base de datos o la tabla que importa). El contenedor de su aplicación puede consultar el estado de preparación del módulo de base de datos para reiniciarse automáticamente una vez que informe que está listo. La sonda de preparación puede ser un script que realiza la importación. Aquí hay un ejemplo (debe reemplazar el comando "MOSTRAR BASES DE DATOS" con lo que corresponda en su caso):
spec: containers: - name: mysql image: mysql:latest ports: - containerPort: 3306 name: mysql readinessProbe: exec: command: - /path-in-container/readiness-probe.sh initialDelaySeconds: 15 timeoutSeconds: 5preparación-sonda.sh:
#!/bin/bash MYSQL_USER="readinessProbe" MYSQL_PASS="readinessProbe" MYSQL_HOST="127.0.0.1" mysql -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -e"SHOW DATABASES;" if [ $? -ne 0 ]; then exit 1 else exit 0 fiPara leer más sobre el tema, consulte los documentos de k8s:
Si la aplicación no necesita ejecutarse durante el proceso de inicialización y puede hacer que el proceso de inicialización sea idempotente, los contenedores init pueden ayudarlo.
El es un buen ejemplo disponible.