Nota de traducción.: Autor del artículo original — Théo Chamley, arquitecto de soluciones en la nube de Google. En esta publicación del blog de Google Cloud, presentó un breve resumen de una guía más detallada de su empresa, llamada “”. En ella, los especialistas de Google recopilaron las mejores prácticas para la explotación de contenedores en el contexto del uso de Google Kubernetes Engine y más, abarcando una amplia gama de temas: desde la seguridad hasta la monitorización y el registro. Entonces, ¿cuáles son las prácticas más importantes para el trabajo con contenedores según Google?

(servicio basado en Kubernetes para ejecutar aplicaciones containerizadas en Google Cloud — nota del traductor.) — es una de las mejores maneras de ejecutar cargas de trabajo que requieren escalabilidad. Garantizará el funcionamiento sin problemas de la mayoría de las aplicaciones, siempre que estén containerizadas. Pero si desea que la aplicación sea fácil de gestionar y aprovechar todas las ventajas de Kubernetes, es necesario seguir las mejores prácticas. Estas simplificarán la explotación de la aplicación, su monitoreo y depuración, así como aumentarán la seguridad.
En este artículo, revisaremos una lista de lo que debe saber y hacer para el funcionamiento efectivo de los contenedores en Kubernetes. Quienes deseen profundizar en los detalles deberían leer el material , así como prestar atención a nuestro sobre la construcción de contenedores.
1. Utilice los mecanismos nativos de los contenedores para el registro
Si la aplicación se ejecuta en un clúster de Kubernetes, no se necesita mucho para los registros. Un sistema de registro centralizado probablemente ya está integrado en el clúster que se está utilizando. En el caso de usar Kubernetes Engine, esto es responsabilidad de . (Nota de traducción.: Y si utiliza su propia instalación de Kubernetes, le recomendamos que considere nuestra solución de código abierto — .) No se complica la vida y utilice los mecanismos nativos de registro de los contenedores. Escriba registros en stdout y stderr: serán capturados, almacenados e indexados automáticamente.
Si lo desea, también puede escribir registros en . Este enfoque permitirá agregar fácilmente metadatos a ellos. Junto con estos, surgirá la posibilidad de búsqueda en los registros en Stackdriver Logging utilizando esos metadatos.
2. Asegúrese de que los contenedores sean stateless e inmutables
Para que los contenedores funcionen correctamente en un clúster de Kubernetes, deben ser stateless e immutable. Cuando se cumplen estas condiciones, Kubernetes puede realizar su trabajo creando y destruyendo entidades de la aplicación cuando y donde sea necesario.
Stateless significa que cualquier estado (datos permanentes de cualquier tipo) se almacena fuera del contenedor. Para ello, dependiendo de las necesidades, se pueden utilizar diferentes tipos de almacenamiento externo: , , , o otras bases de datos gestionadas. (Nota de traducción.: Para más información, consulte también nuestro artículo "».)
Immutable significa que el contenedor no se modificará durante su vida útil: no habrá actualizaciones, parches ni cambios en la configuración. Si necesita actualizar el código de la aplicación o aplicar un parche, cree una nueva imagen y despliegue esta. Se recomienda extraer la configuración del contenedor (puerto de escucha, opciones del entorno de ejecución, etc.) hacia y . Se pueden actualizar sin necesidad de construir una nueva imagen de contenedor. Para crear pipelines de construcción de imágenes de manera sencilla, se puede utilizar . (Nota de traducción.: Para estos fines, utilizamos la herramienta de código abierto .)

Ejemplo de actualización de la configuración de Deployment en Kubernetes utilizando ConfigMap, montado en los pods como configuración
3. Evite contenedores privilegiados
No ejecuta aplicaciones como root en sus servidores, ¿verdad? Si un atacante consigue ingresar a la aplicación, tendrá acceso con permisos de root. Las mismas consideraciones se aplican a no ejecutar contenedores privilegiados. Si es necesario cambiar la configuración en el host, se pueden otorgar al contenedor permisos específicos capabilities mediante la opción en Kubernetes. Si es necesario modificar sysctls, Kubernetes tiene para ello. En general, trate de utilizar al máximo y contenedores sidecar para realizar estas operaciones privilegiadas. No necesitan estar disponibles para el tráfico interno o externo.
Si usted es el administrador del clúster, puede utilizar para restricciones en la aplicación de contenedores privilegiados.
4. Evite ejecutar como root
Ya se ha hablado sobre contenedores privilegiados, pero será aún mejor si, además de eso, no ejecuta aplicaciones dentro del contenedor como root. Si un atacante encuentra una vulnerabilidad remota con posibilidad de ejecución de código en una aplicación con privilegios de root y puede salir de los límites del contenedor a través de una vulnerabilidad aún desconocida, obtendrá privilegios de root en el host.
La mejor manera de evitar esto es, en primer lugar, no ejecutar nada como root. Para ello, puede utilizar la directiva USER en Dockerfile o runAsUser en Kubernetes. El administrador del clúster también puede configurar un comportamiento forzado usando .
5. Haga que la aplicación sea fácil de monitorear
Al igual que el registro, el monitoreo es una parte integral de la gestión de aplicaciones. Una solución popular para el monitoreo en la comunidad de Kubernetes es — un sistema que detecta automáticamente los pods y servicios que requieren monitoreo. (Nota de traducción.: Consulte también nuestro sobre monitoreo con Prometheus y Kubernetes.) puede monitorear clústeres de Kubernetes e incluye su propia versión de Prometheus para el monitoreo de aplicaciones.

El panel de monitoreo de Kubernetes en Stackdriver
Prometheus espera que la aplicación exponga métricas en un endpoint HTTP. Para esto, están disponibles . El mismo formato es utilizado por otras herramientas como y .
6. Haga accesible el estado de salud de la aplicación
La gestión de aplicaciones en producción se ve ayudada por su capacidad para informar sobre su estado a todo el sistema. ¿Está la aplicación en ejecución? ¿Está en buen estado? ¿Está lista para recibir tráfico? ¿Cómo se comporta? La forma más común de abordar este problema es implementar verificaciones de salud (health checks). Kubernetes tiene dos tipos de ellas: .
Para liveness probe (verificación de viabilidad) la aplicación debe tener un endpoint HTTP que devuelva una respuesta “200 OK” si está funcionando y sus principales dependencias están satisfechas. Para readiness probe (verificación de preparación para el servicio) La aplicación debe tener un endpoint HTTP diferente que devuelva una respuesta «200 OK» si la aplicación está en un estado saludable, se han completado los pasos de inicialización y cualquier solicitud válida no provoca un error. Kubernetes dirigirá el tráfico al contenedor solo si la aplicación está lista de acuerdo a estas verificaciones. Los dos endpoints pueden ser combinados si no hay diferencia entre los estados de viabilidad (liveness) y de preparación (readiness).
Puedes leer más al respecto en el artículo correspondiente de Sandeep Dinesh, Defensor de Desarrolladores en Google: «».
7. Elige cuidadosamente la versión de la imagen
La mayoría de las imágenes públicas y privadas utilizan un sistema de etiquetado similar al descrito en . Si la imagen aplica un sistema cercano a , es necesario considerar las particularidades del etiquetado. Por ejemplo, la etiqueta latest puede moverse con frecuencia de una imagen a otra — no se puede confiar en ella si necesitas construcciones e instalaciones predecibles y reproducibles.
Puedes utilizar la etiqueta X.Y.Z (casi siempre son invariables), sin embargo, en ese caso, debes rastrear todos los parches y actualizaciones de la imagen. Si la imagen que utilizas tiene la etiqueta X.Y, es una buena opción intermedia. Al elegirla, obtienes automáticamente los parches y al mismo tiempo te basas en una versión estable de la aplicación.
P.D. del traductor
También puedes leer en nuestro blog:
- «»;
- «»;
- «»;
- «» (resumen y video de la presentación);
- «» (resumen y video de la presentación);
- «» (resumen y video de la presentación);
- «» (resumen y video de la presentación);
- «».
Fuente: habr.com
