7 mejores prácticas de contenedores de Google

Nota perev. : El autor del artículo original es Théo Chamley, un arquitecto de Google Cloud. En esta publicación para el blog Google Cloud, presentó un breve extracto de la gestión más detallada de su compañía, llamada " Mejores prácticas para operar contenedores ". En él, los expertos de Google reunieron las mejores prácticas para operar contenedores en el contexto del uso de Google Kubernetes Engine y no solo tocando una amplia gama de temas: desde seguridad hasta monitoreo y registro en diario. Entonces, ¿qué prácticas de contenedor son más importantes para Google?



El motor de Kubernetes (servicio basado en Kubernetes para ejecutar aplicaciones en contenedores en Google Cloud - aprox. Transl. ) Es una de las mejores formas de ejecutar cargas de trabajo que necesitan escalarse. Kubernetes garantizará el buen funcionamiento de la mayoría de las aplicaciones si están en contenedores. Pero si desea que la aplicación sea fácil de administrar y desea aprovechar al máximo Kubernetes, debe seguir las mejores prácticas. Simplificarán el funcionamiento de la aplicación, su supervisión y depuración, y mejorarán la seguridad.

En este artículo, revisaremos una lista de lo que necesita saber y hacer para el funcionamiento eficiente de los contenedores en Kubernetes. Aquellos que deseen profundizar en los detalles deben leer el material de Mejores prácticas para operar contenedores , así como prestar atención a nuestra publicación anterior de ensamblaje de contenedores.

1. Utilice mecanismos de contenedor nativos para iniciar sesión


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 está utilizando. En el caso de utilizar el motor Kubernetes , el registro de Stackdriver es responsable de esto. ( Nota : si usa su propia instalación de Kubernetes, le recomendamos que eche un vistazo más de cerca a nuestra solución de código abierto - loghouse ) . No complique su vida y use los mecanismos nativos para registrar contenedores. Escriba los registros en stdout y stderr: se recibirán, guardarán e indexarán automáticamente.

Si lo desea, también puede escribir registros en formato JSON . Este enfoque facilita agregarles metadatos. Y con ellos en Stackdriver Logging podrá buscar en los registros utilizando estos metadatos.

2. Asegúrese de que los contenedores no tengan estado y sean inmutables


Para que los contenedores funcionen correctamente en un clúster de Kubernetes, deben ser apátridas e inmutables. Cuando se cumplan estas condiciones, Kubernetes podrá hacer su trabajo, creando y destruyendo entidades de aplicación cuando y donde sea necesario.

Sin estado significa que cualquier estado (datos persistentes de cualquier tipo) se almacena fuera del contenedor. Para esto, dependiendo de las necesidades, pueden involucrarse diferentes tipos de almacenamiento externo: almacenamiento en la nube , discos persistentes , Redis , Cloud SQL u otras bases de datos administradas. ( Nota : traduzca : Lea más sobre esto en nuestro artículo " Operadores para Kubernetes: Cómo ejecutar aplicaciones con estado ").

Inmutable significa que el contenedor no se modificará durante su vida útil: sin actualizaciones, parches, cambios de configuración. Si necesita actualizar el código de la aplicación o aplicar un parche, cree una nueva imagen e impleméntela. Se recomienda mover la configuración del contenedor (puerto para escuchar, opciones para el tiempo de ejecución, etc.) al exterior, en Secrets y ConfigMaps . Se pueden actualizar sin tener que crear una nueva imagen de contenedor. Puede usar Cloud Build para crear fácilmente tuberías con ensamblaje de imágenes. ( Nota : utilizamos la herramienta de código abierto dapp para este propósito).


Ejemplo de actualización de la configuración de implementación en Kubernetes utilizando ConfigMap montado en pods como configuración

3. Evitar contenedores privilegiados


No ejecutas aplicaciones como root en tus servidores, ¿verdad? Si un atacante irrumpe en la aplicación, obtendrá acceso de root. Las mismas consideraciones se aplican a no ejecutar contenedores privilegiados. Si desea cambiar la configuración en el host, puede darle al contenedor capacidades específicas utilizando la opción securityContext en Kubernetes. Si necesita modificar sysctls , Kubernetes tiene una anotación separada para esto. En general, trate de maximizar el uso de contenedores init y sidecar para realizar operaciones tan privilegiadas. No necesitan accesibilidad para tráfico interno o externo.

Si está administrando un clúster, puede usar la Política de seguridad de pod para restringir el uso de contenedores con privilegios.

4. Evita correr como root


Ya hemos dicho acerca de los contenedores privilegiados, pero será aún mejor si, además de esto, no ejecuta aplicaciones dentro del contenedor como root. Si un atacante encuentra una vulnerabilidad remota con la posibilidad de ejecución de código en una aplicación con privilegios de root, después de lo cual puede abandonar el contenedor a través de una vulnerabilidad aún desconocida, obtendrá root en el host.

La mejor manera de evitar esto es no ejecutar nada como root en primer lugar. Para hacer esto, puede usar la directiva USER en el Dockerfile o runAsUser en Kubernetes. El administrador del clúster también puede configurar la aplicación mediante la Política de seguridad de pod .

5. Haga que la aplicación sea fácil de monitorear.


Al igual que el registro, el monitoreo es una parte integral de la administración de la aplicación. Una solución de monitoreo popular en la comunidad de Kubernetes es Prometheus , un sistema que detecta automáticamente pods y servicios que requieren monitoreo. ( Nota : consulte también nuestro informe detallado sobre el monitoreo con Prometheus y Kubernetes). Stackdriver puede monitorear clústeres de Kubernetes e incluye su propia versión de Prometheus para monitorear aplicaciones.


Panel de Kubernetes en Stackdriver

Prometheus espera que la aplicación reenvíe métricas al punto final HTTP. Las bibliotecas de cliente de Prometheus están disponibles para esto. Otras herramientas como OpenCensus e Istio usan el mismo formato.

6. Ponga a disposición el estado de salud de la aplicación.


La administración de una aplicación en producción se ve ayudada por su capacidad de informar su estado a todo el sistema. ¿Se está ejecutando la aplicación? Esta bien? ¿Está listo para recibir tráfico? ¿Cómo se comporta él? La forma más común de resolver este problema es implementar controles de salud . Kubernetes tiene dos tipos: sondas de vitalidad y preparación .

Para una sonda de vida, la aplicación debe tener un punto final HTTP que devuelva una respuesta "200 OK" si está funcionando y sus principales dependencias están satisfechas. Para la sonda de preparación (verificar la disponibilidad para el servicio), la aplicación debe tener un punto final HTTP diferente, devolviendo la respuesta "200 OK" si la aplicación está en buen estado, los pasos de inicialización se completan y cualquier solicitud correcta no conduce a un error. Kubernetes solo dirigirá el tráfico al contenedor si la aplicación está lista de acuerdo con estas comprobaciones. Se pueden combinar dos puntos finales si no hay diferencia entre vitalidad y preparación.

Para obtener más información, consulte el artículo relacionado de Sandeep Dinesh, defensor del desarrollador de Google: " Mejores prácticas de Kubernetes: configuración de controles de salud con sondas de preparación y vitalidad ".

7. Elija 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 las Mejores prácticas para construir contenedores . Si la imagen utiliza un sistema que está cerca de las versiones semánticas , debe tener en cuenta los detalles específicos del etiquetado. Por ejemplo, la latest etiqueta a menudo puede moverse de una imagen a otra; no puede confiar en ella si necesita ensamblajes e instalaciones predecibles y reproducibles.

Puede usar la etiqueta XYZ (casi siempre no cambian), pero en este caso, realice un seguimiento de todos los parches y actualizaciones de la imagen. Si su imagen tiene una etiqueta XY , esta es una buena opción de término medio. Al elegirlo, automáticamente recibe parches y al mismo tiempo confía en una versión estable de la aplicación.

PD del traductor


Lea también en nuestro blog:

Source: https://habr.com/ru/post/es425085/


All Articles