Amigos, estoy aprendiendo aquí y tratando de implementar un contenedor de inicio que verifique si MySQL está listo para las conexiones. Tengo un pod que ejecuta MySQL y otro pod con una aplicación que se conectará al pod de MySQL cuando esté listo.
Ningún éxito hasta ahora. El error que recibo es el siguiente: sh: mysql: not found . Así es como estoy intentando:
initContainers: - name: {{ .Values.initContainers.name }} image: {{ .Values.initContainers.image }} command: - "sh" - "-c" - "until mysql --host=mysql.default.svc.cluster.local --user={MYSQL_USER} --password={MYSQL_PASSWORD} --execute=\"SELECT 1;\"; do echo waiting for mysql; sleep 2; done;"¿Alguna idea de cómo podría hacer que esto funcione?
No hagas absolutamente nada; incluso elimine los initContainers: tiene ahora.
Digamos que su aplicación se inicia antes de que la base de datos esté lista. Intenta conectarse, falla y sale. Kubernetes se da cuenta de esto, por lo que intentará iniciar la aplicación nuevamente; si falla repetidamente, comenzará a esperar progresivamente más tiempo entre reintentos (verá el estado CrashLoopBackOff). Eventualmente, el clúster habrá esperado lo suficiente para que la base de datos esté lista y el próximo reintento será exitoso.
Tenga en cuenta que esto es probablemente lo mismo que sucederá si la base de datos se reinicia después de que la aplicación ya se está ejecutando; "en el momento del inicio" no necesita ser un caso especial.
Intenta usar esto.
contenedores de inicio:
- name: init-cont image: busybox:1.31 command: ['sh', '-c', 'echo -e "Checking for the availability of MySQL Server deployment"; while ! nc -z mysql 3306; do sleep 1; printf "-"; done; echo -e " >> MySQL DB Server has started";']A su initContainer le falta el binario del cliente mysql .
Hay algunas maneras de resolver esto:
Suponiendo que Alpine sea su imagen base, tendría un dockerfile como este:
FROM alpine:3.14 RUN apk add mysql-clientEntonces su comando initContainer sería:
command: - "/bin/ash" - "-c" - "until mysql --host=mysql.default.svc.cluster.local --user={MYSQL_USER} --password={MYSQL_PASSWORD} --execute=\"SELECT 1;\"; do echo waiting for mysql; sleep 2; done;"Mi recomendación, use la imagen oficial de mysql docker