Estamos tratando de crear un conjunto de los mismos servicios, que están conectados a diferentes MQTT Brokers y diferentes sistemas de terceros. Cada servicio debe tener su propio certificado para poder conectarse a su propio MQTT Broker.
Para hacerlo, estamos utilizando una canalización de Jenkins, que está enviando una imagen de Docker recién creada a múltiples proyectos de destino en OpenShift. Cada proyecto tiene su propio ConfigMap con detalles de conexión/configuración.
Ahora el problema es que nos gustaría hacer lo mismo con los Certificados PEM. La forma más fácil y funcional es mantener los certificados en el repositorio e importarlos en Dockerfile. Funciona bien, pero no se amplía cuando queremos agregar más POD en OpenShift con el mismo servicio, pero con configuraciones diferentes.
Para hacerlo dinámicamente pensamos en initContainers . Esto nos permitiría enviar el certificado de forma dinámica.
initContainers: - name: inject-pem-to-cacerts image: <imageName> env: - name: MQTT_CERT_PEM value: home/fromMount/cert.pem - name: CACERTS value: $JAVA_HOME/jre/lib/security/cacerts command: ['/bin/bash'] args: ['-c', "keytool -import -noprompt -keystore $CACERTS -file $MQTT_CERT_PEM -storepass changeit -alias service-$MQTT_CERT_PEM"]En ese caso, estamos recibiendo Permiso denegado en esa ruta específica. Sudo no es una opción aquí por lo que probamos. Tal vez sea una cuestión de contexto de seguridad en YAML, pero no sé qué se debe configurar.
Si hay otra manera de hacerlo mejor, me encantaría escuchar.
El problema al que te enfrentas se debe al hecho de que los Init-Containers no son la herramienta adecuada aquí. Los contenedores de inicio se inician antes que los contenedores de pod, por lo tanto, el almacén de confianza que configure aquí estará en el contenedor de inicio y no en el contenedor de la aplicación. Para lograr lo que está tratando de hacer, le recomiendo PostStart Container Lifecycle Handler :
containers: - name: my-container lifecycle: postStart: exec: ['-c', "keytool -import -noprompt -keystore $CACERTS -file $MQTT_CERT_PEM -storepass changeit -alias service-$MQTT_CERT_PEM"]Dando un paso atrás, me pregunto acerca de una solución alternativa. Si lo entendí correctamente, debe instalar los cacerts para los certificados de servidor de los distintos intermediarios de MQTT. Entonces, dado que los cacerts no son confidenciales , ¿por qué no trabajar con una imagen de Docker singular que tenga todos los cacerts instalados? Eso le quitaría mucha complejidad a los K8.