Esta es una pregunta un poco difícil de formular, así que ten paciencia un poco. Intentaré ser breve si puedo.
Declaración de problema
Estoy buscando una mejor práctica moderna para administrar e implementar la lista de certificados de CA de confianza de los contenedores de Docker. Sé que puedo hornear los certificados en cada contenedor a través de un Dockerfile. Sin embargo, esa es una nueva imagen acoplable para cada contenedor cada vez que necesitamos hacer un certificado o un cambio de CRL. Idealmente en el espíritu de "nativo de la nube" (ver 12 aplicaciones de factores) nuestros contenedores no tendrían certificados y listas CRL incorporadas en ellos y todo esto provendría del medio ambiente de alguna manera.
Para dar un poco más de contexto. Estoy ejecutando estos contenedores en Kubernetes, pero podrían ejecutarse en cualquier plataforma de contenedores como OpenShift, AWS, etc. e idealmente, mi objetivo aquí es encontrar una solución única que permita una verdadera portabilidad de contenedores.
Soluciones potenciales
Algunas ideas con las que he jugado:
1) cree otro contenedor que tenga todos los certificados y CRL y monte en volumen para cada contenedor. - Este es un enfoque común, pero requiere que el contenedor se guarde en una nueva imagen cada vez que se actualice un nuevo certificado o CRL. No es horrible, pero no se siente muy "nativo de la nube".
2) Use Spring Config Server y cree un pequeño sidecar de Spring Boot que instale todos los certificados al inicio. - La configuración centralizada externa se siente nativa de la nube. - Puede requerir una modificación importante de la orden de inicio de los servicios en el contenedor que pueda requerir esos certificados. - Se siente demasiado complicado para un contenedor.
3) Use un proxy donde se gestionen todos los certificados. - Se siente como un hack para forzar todo el tráfico a través del proxy. - Posibles problemas de rendimiento y contención cuando hay una gran carga en los recursos HTTPS. - Puede que no sea posible enrutar todo a través de HTTP directo.
4) Use variables de entorno y tenga un script de inicio que los instale - Enfoque simple y generalizado para cualquier tipo de contenedor desplegado en cualquier lugar. No estoy seguro de si es apropiado hacerlo de esta manera. Esos serían muchos valores de variables de entorno grandes. ¿Te imaginas cómo será un "printenv"?
5) Utilice los secretos de Kubernetes (no estoy seguro de que esto pueda funcionar todavía) - Es una solución exclusiva para kubernetes, que es una decepción para escribir una sola vez, usar en cualquier lugar.
Sé que esto es un poco largo sinuoso. Me disculpo por eso. No sabía cómo comprimirlo más. Espero con interés la discusión sobre esto.