Prefacio
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Con la adopción generalizada de microservicios y contenedores en los últimos años, la forma en que diseñamos, desarrollamos y ejecutamos software ha cambiado radicalmente. Las aplicaciones actuales están optimizadas para la disponibilidad, la escalabilidad y la velocidad de comercialización. Impulsadas por estos nuevos requisitos, las aplicaciones modernas de hoy requieren un conjunto diferente de patrones y prácticas. Este libro pretende ayudar a los desarrolladores a descubrir y conocer los patrones más comunes para crear aplicaciones nativas de la nube con Kubernetes. En primer lugar, echemos un breve vistazo a los dos ingredientes principales de este libro: Kubernetes y los patrones de diseño.
Kubernetes
Kubernetes es una plataforma de orquestación de contenedores. El origen de Kubernetes se encuentra en algún lugar de los centros de datos de Google, donde nació la plataforma interna de orquestación de contenedores de Google, Borg. Google utilizó Borg durante muchos años para ejecutar sus aplicaciones. En 2014, Google decidió transferir su experiencia con Borg a un nuevo proyecto de código abierto llamado "Kubernetes" (que en griego significa "timonel" o "piloto"). En 2015, se convirtió en el primer proyecto donado a la recién fundada Cloud Native Computing Foundation (CNCF).
Desde el principio, Kubernetes se ganó a toda una comunidad de usuarios, y el número de colaboradores creció increíblemente rápido. Hoy en día, Kubernetes se considera uno de los proyectos más populares de GitHub. Es justo afirmar que Kubernetes es la plataforma de orquestación de contenedores más utilizada y con más funciones. Kubernetes también constituye la base de otras plataformas construidas sobre él. El más destacado de esos sistemas de Plataforma como Servicio es Red Hat OpenShift, que proporciona diversas capacidades adicionales a Kubernetes. Éstas son sólo algunas de las razones por las que elegimos Kubernetes como plataforma de referencia para los patrones nativos de la nube de este libro.
Este libro asume que tienes conocimientos básicos de Kubernetes. En el Capítulo 1, recapitulamos los conceptos básicos de Kubernetes y sentamos las bases de los siguientes patrones.
Patrones de diseño
El concepto de patrones de diseño se remonta a la década de 1970 y procede del campo de la arquitectura. Christopher Alexander, arquitecto y teórico de sistemas, y su equipo publicaron en 1977 el innovador A Pattern Language (Oxford University Press), que describe patrones arquitectónicos para crear ciudades, edificios y otros proyectos de construcción. Algún tiempo después, esta idea fue adoptada por la recién creada industria del software. El libro más famoso en este ámbito es Design Patterns-Elements of Reusable Object-Oriented Software, de Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides-the Gang of Four (Addison-Wesley). Cuando hablamos de los famosos patrones Singleton, Factories o Delegation, es gracias a esta obra definitoria. Desde entonces se han escrito muchos otros grandes libros de patrones para diversos campos con distintos niveles de granularidad, como Enterprise Integration Patterns de Gregor Hohpe y Bobby Woolf (Addison-Wesley) o Patterns of Enterprise Application Architecture de Martin Fowler (Addison-Wesley).
En pocas palabras, un patrón describe una solución repetible a un problema.1 Esta definición sirve para los patrones que describimos en este libro, salvo que probablemente no tengamos tanta variabilidad en nuestras soluciones. Un patrón es diferente de una receta porque, en lugar de dar instrucciones paso a paso para resolver un problema, proporciona un plano para resolver toda una clase de problemas similares. Por ejemplo, el patrón alejandrino Sala de Cerveza describe cómo deben construirse las salas públicas de bebidas en las que "extraños y amigos sean compañeros de bebida" y no "anclas de solitarios". Todas las salas construidas según este patrón tienen un aspecto diferente, pero comparten características comunes, como alcobas abiertas para grupos de cuatro a ocho personas y un lugar donde puedan reunirse cien personas para disfrutar de bebidas, música y otras actividades.
Sin embargo, un patrón hace algo más que proporcionar una solución. También se trata de formar un lenguaje. Los patrones de este libro forman un lenguaje denso, centrado en los sustantivos, en el que cada patrón lleva un nombre único. Cuando se establece este lenguaje, estos nombres evocan automáticamente representaciones mentales similares cuando la gente habla de estos patrones. Por ejemplo, cuando hablamos de una mesa, cualquiera que hable inglés asume que estamos hablando de un trozo de madera con cuatro patas y un tablero en el que se pueden poner cosas. Lo mismo ocurre en ingeniería de software cuando se habla de una "fábrica". En un contexto de lenguaje de programación orientado a objetos, asociamos inmediatamente con una "fábrica" un objeto que produce otros objetos. Como conocemos inmediatamente la solución que hay detrás del patrón, podemos pasar a abordar problemas aún sin resolver.
También hay otras características de un lenguaje de patrones. Por ejemplo, los patrones están interconectados y pueden solaparse de modo que cubran la mayor parte del espacio del problema. Además, como ya se expuso en el original A Pattern Language, los patrones tienen un nivel diferente de granularidad y alcance. Los patrones más generales cubren un amplio espacio de problemas y proporcionan una orientación aproximada sobre cómo resolver el problema. Los patrones granulares tienen una propuesta de solución muy concreta, pero son menos aplicables. Este libro contiene todo tipo de patrones, y muchos patrones hacen referencia a otros patrones o incluso pueden incluir otros patrones como parte de la solución.
Otra característica de los patrones es que siguen un formato rígido. Sin embargo, cada autor define un formato distinto; por desgracia, no existe una norma común sobre cómo deben presentarse los patrones. Martin Fowler ofrece una excelente visión general de los formatos utilizados para los lenguajes de patrones en "Writing Software Patterns".
Cómo está estructurado este libro
Hemos elegido un formato de patrón sencillo para este libro. No seguimos ningún lenguaje de descripción de patrones en particular. Para cada patrón, utilizamos la siguiente estructura:
- Nombre
-
Cada patrón lleva un nombre, que es también el título del capítulo. El nombre es el centro del lenguaje del patrón.
- Problema
-
Esta sección proporciona el contexto más amplio y describe detalladamente el espacio de patrones.
- Solución
-
Esta sección muestra cómo resuelve el patrón el problema de forma específica para Kubernetes. Esta sección también contiene referencias cruzadas a otros patrones relacionados o que forman parte del patrón dado.
- Debate
-
Esta sección incluye un debate sobre las ventajas e inconvenientes de la solución para el contexto dado.
- Más información
-
Esta sección final contiene fuentes de información adicionales relacionadas con el patrón.
Hemos organizado los patrones de este libro como sigue:
-
La Parte I, "Patrones Fundamentales", abarca los conceptos básicos de Kubernetes. Se trata de los principios y prácticas subyacentes para crear aplicaciones nativas de la nube basadas en contenedores.
-
La Parte II, "Patrones de comportamiento", describe patrones que se basan en los patrones fundacionales y añaden los conceptos del aspecto de tiempo de ejecución de la gestión de varios tipos de contenedores.
-
La Parte III, "Patrones Estructurales", contiene patrones relacionados con la organización de contenedores dentro de un Pod, que es el átomo de la plataforma Kubernetes.
-
La Parte IV, "Patrones de configuración", ofrece una visión de las distintas formas en que se puede gestionar la configuración de las aplicaciones en Kubernetes. Se trata de patrones granulares, que incluyen recetas concretas para conectar las aplicaciones a su configuración.
-
La Parte V, "Patrones de seguridad", aborda varios problemas de seguridad que surgen cuando una aplicación está en contenedores y se implementa en Kubernetes.
-
La Parte VI, "Patrones avanzados", es una recopilación de conceptos avanzados, como la forma de ampliar la propia plataforma o de crear imágenes de contenedores directamente dentro del clúster.
Según el contexto, un mismo patrón puede encajar en varias categorías. Cada capítulo de una pauta es independiente; puedes leer los capítulos de forma aislada y en cualquier orden.
A quién va dirigido este libro
Este libro está dirigido a desarrolladores que quieran diseñar y desarrollar aplicaciones nativas de la nube y utilizar Kubernetes como plataforma. Es más adecuado para lectores que tengan cierta familiaridad básica con los contenedores y los conceptos de Kubernetes y quieran pasar al siguiente nivel. Sin embargo, no es necesario conocer los detalles de bajo nivel de Kubernetes para comprender los casos de uso y los patrones. Los arquitectos, consultores y demás personal técnico también se beneficiarán de los patrones repetibles que aquí se describen.
El libro se basa en casos de uso y lecciones aprendidas de proyectos del mundo real. Es una acumulación de buenas prácticas y patrones tras años de trabajo en este espacio. Queremos ayudarte a entender la mentalidad Kubernetes-first y a crear mejores aplicaciones nativas de la nube, no a reinventar la rueda. Está escrito en un estilo relajado y se asemeja a una serie de ensayos que pueden leerse de forma independiente.
Veamos brevemente lo que no es este libro:
-
Este libro no es una introducción a Kubernetes, ni un manual de referencia. Tocamos muchas funciones de Kubernetes y las explicamos con cierto detalle, pero nos centramos en los conceptos que hay detrás de esas funciones. El Capítulo 1, "Introducción", ofrece un breve repaso de los conceptos básicos de Kubernetes. Si buscas un libro completo sobre Kubernetes, te recomendamos encarecidamente Kubernetes en Acción, de Marko Lukša (Manning Publications).
-
Este libro no es una guía paso a paso sobre cómo configurar un clúster de Kubernetes propiamente dicho. Cada ejemplo asume que tienes Kubernetes en funcionamiento. Tienes varias opciones para probar los ejemplos. Si te interesa aprender a configurar un clúster de Kubernetes, te recomendamos Kubernetes: Up and Running de Brendan Burns, Joe Beda, Kelsey Hightower y Lachlan Evenson (O'Reilly).
-
Este libro no trata del funcionamiento y gobierno de un clúster de Kubernetes para otros equipos. Hemos omitido deliberadamente los aspectos administrativos y operativos de Kubernetes y hemos adoptado una visión de Kubernetes desde el punto de vista del desarrollador. Este libro puede ayudar a los equipos de operaciones a comprender cómo utiliza Kubernetes un desarrollador, pero no es suficiente para administrar y automatizar un clúster de Kubernetes. Si te interesa aprender a manejar un clúster de Kubernetes, te recomendamos Kubernetes Best Practices, de Brendan Burns, Eddie Villalba, Dave Strebel y Lachlan Evenson (O'Reilly).
Lo que aprenderás
Hay mucho que descubrir en este libro. A primera vista, algunos patrones pueden parecer extractos de un manual de Kubernetes, pero si los miras más de cerca, verás que se presentan desde un ángulo conceptual que no se encuentra en otros libros sobre el tema. Otros patrones se explican con pasos detallados para resolver un problema concreto, como en la Parte IV, "Patrones de configuración". En algunos capítulos, explicamos características de Kubernetes que no encajan bien en la definición de un patrón. No te obsesiones con si se trata de un patrón o de una característica. En todos los capítulos, examinamos las fuerzas implicadas desde los primeros principios y nos centramos en los casos de uso, las lecciones aprendidas y las buenas prácticas. Esa es la parte valiosa.
Independientemente de la granularidad del patrón, aprenderás todo lo que Kubernetes ofrece para cada patrón concreto, con multitud de ejemplos para ilustrar los conceptos. Todos estos ejemplos han sido probados, y te indicamos cómo obtener el código fuente completo en "Uso de ejemplos de código".
Novedades de la segunda edición
El ecosistema de Kubernetes ha seguido creciendo desde que salió la primera edición hace cuatro años. Como resultado, ha habido muchas ediciones de Kubernetes, y más herramientas y patrones para utilizar Kubernetes se han convertido en estándares de facto.
Afortunadamente, la mayoría de los patrones descritos en nuestro libro han superado la prueba del tiempo y siguen siendo válidos. Por lo tanto, hemos actualizado estos patrones, añadido nuevas funciones hasta Kubernetes 1.26, y eliminado partes obsoletas y obsoletas. En su mayor parte, sólo fueron necesarios cambios menores, excepto en el Capítulo 29, "Escala elástica", y el Capítulo 30, "Constructor de imágenes", que sufrieron cambios significativos debido a nuevos desarrollos en estas áreas.
Además, hemos incluido cinco nuevos patrones e introducido una nueva categoría, la Parte V, "Patrones de seguridad", que aborda una laguna de la primera edición y proporciona importantes patrones relacionados con la seguridad para los desarrolladores.
Hemos actualizado y ampliado nuestros ejemplos de GitHub. Y, por último, hemos añadido un 50% más de contenido para disfrute de nuestros lectores.
Convenciones utilizadas en este libro
En este libro se utilizan las siguientes convenciones tipográficas:
- Cursiva
-
Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.
Constant width
-
Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.
Como ya se ha dicho, los patrones forman un lenguaje sencillo e interconectado. Para enfatizar esta red de patrones, cada patrón se escribe en mayúsculas y en cursiva, (por ejemplo, Sidecar). Cuando el nombre de un patrón es también un concepto central de Kubernetes (como Contenedor Init o Controlador), utilizamos este formato específico sólo cuando hacemos referencia directa al propio patrón. Cuando tiene sentido, también entrelazamos los capítulos de los patrones para facilitar la navegación.
También utilizamos las siguientes convenciones:
-
Todo lo que puedas escribir en un intérprete de comandos o editor se renderiza en
constant width font
. -
Los nombres de los recursos Kubernetes siempre se muestran en mayúsculas (por ejemplo, Pod). Si el recurso es un nombre combinado como ConfigMap, lo mantenemos así en favor del más natural "config map" por claridad y para dejar claro que se refiere a un concepto de Kubernetes.
-
A veces, el nombre de un recurso de Kubernetes es idéntico a un concepto común como "servicio" o "nodo". En estos casos, utilizamos el formato de nombre de recurso sólo cuando nos referimos al recurso en sí.
Consejo
Este elemento significa un consejo o sugerencia.
Nota
Este elemento significa una nota general.
Advertencia
Este elemento indica una advertencia o precaución.
Utilizar ejemplos de código
Cada patrón está respaldado por ejemplos totalmente ejecutables, que puedes encontrar en la página web que lo acompaña. Encontrarás el enlace al ejemplo de cada patrón en la sección "Más información" de cada capítulo.
La sección "Más información" también contiene enlaces a más información relacionada con el patrón. Mantenemos actualizadas estas listas en el repositorio de ejemplos.
El código fuente de todos los ejemplos de este libro está disponible en GitHub. El repositorio y el sitio web también tienen indicaciones e instrucciones sobre cómo conseguir un clúster Kubernetes para probar los ejemplos. Por favor, consulta los archivos de recursos proporcionados cuando repases los ejemplos. Contienen muchos comentarios valiosos que te ayudarán a comprender mejor el código de los ejemplos.
Muchos ejemplos utilizan un servicio REST llamado random-generator que devuelve números aleatorios cuando se le llama. Está especialmente diseñado para funcionar bien con los ejemplos de este libro. También puedes encontrar su código fuente en GitHub, y su imagen de contenedor k8spatterns/random-generator
está alojada en Docker Hub.
Utilizamos una notación de ruta JSON para describir los campos de los recursos (por ejemplo, .spec.replicas
apunta al campo replicas
de la sección spec
del recurso).
Si encuentras algún problema en el código de ejemplo o en la documentación, o tienes alguna pregunta, no dudes en abrir un ticket en el gestor de incidencias de GitHub. Monitoreamos estos problemas en GitHub y estaremos encantados de responder a cualquier pregunta.
Todo el código de ejemplo se distribuye bajo la licencia Creative Commons Reconocimiento 4.0 (CC BY 4.0). El código es de uso libre, y puedes compartirlo y adaptarlo para proyectos comerciales y no comerciales. Sin embargo, debes hacer referencia a este libro si copias o redistribuyes el código de ejemplo.
Esta atribución puede ser una referencia al libro, incluyendo título, autor, editorial e ISBN, como en "Kubernetes Patterns, 2ª Edición, de Bilgin Ibryam y Roland Huß (O'Reilly). Copyright 2023 Bilgin Ibryam y Roland Huß, 978-1-098-13168-5". Alternativamente, añade un enlace al sitio web adjunto junto con un aviso de copyright y un enlace a la licencia.
¡También nos encantan las aportaciones de código! Si crees que podemos mejorar nuestros ejemplos, estaremos encantados de escucharte. Sólo tienes que abrir una incidencia en GitHub o crear una solicitud de extracción, e iniciemos una conversación.
Aprendizaje en línea O'Reilly
Nota
Durante más de 40 años, O 'Reilly Media ha proporcionado formación tecnológica y empresarial, conocimientos y perspectivas para ayudar a las empresas a alcanzar el éxito.
Nuestra red única de expertos e innovadores comparten sus conocimientos y experiencia a través de libros, artículos y nuestra plataforma de aprendizaje online. La plataforma de aprendizaje en línea de O'Reilly te ofrece acceso bajo demanda a cursos de formación en directo, rutas de aprendizaje en profundidad, entornos de codificación interactivos y una amplia colección de textos y vídeos de O'Reilly y de más de 200 editoriales. Para más información, visita http://oreilly.com.
Cómo contactar con nosotros
Dirige tus comentarios y preguntas sobre este libro a la editorial:
- O'Reilly Media, Inc.
- 1005 Gravenstein Highway Norte
- Sebastopol, CA 95472
- 800-889-8969 (en Estados Unidos o Canadá)
- 707-829-7019 (internacional o local)
- 707-829-0104 (fax)
- support@oreilly.com
- https://www.oreilly.com/about/contact.html
Tenemos una página web para este libro en la que enumeramos erratas, ejemplos e información adicional. Puedes acceder a esta página en https://oreil.ly/kubernetes_patterns-2e.
Para obtener noticias e información sobre nuestros libros y cursos, visita https://oreilly.com.
Encuéntranos en LinkedIn: https://linkedin.com/company/oreilly-media
Síguenos en Twitter: https://twitter.com/oreillymedia
Míranos en YouTube: https://youtube.com/oreillymedia
Sigue a los autores en Twitter: https: //twitter.com/bibryam, https://twitter.com/ro14nd
Sigue a los autores en Mastodon: https://fosstodon.org/@bilgin, https://hachyderm.io/@ro14nd
Encuentra a los autores en GitHub: https://github.com/bibryam, https://github.com/rhuss
Sigue sus blogs: https: //www.ofbizian.com, https://ro14nd.de
Agradecimientos
Bilgin está eternamente agradecido a su maravillosa esposa, Ayshe, por su inagotable apoyo y paciencia mientras trabajaba en otro libro más. También está agradecido a sus adorables hijas, Selin y Esin, que siempre saben cómo sacarle una sonrisa. Significan mucho para él. Por último, Bilgin quiere dar las gracias a su fantástico coautor, Roland, por hacer realidad este proyecto.
Roland está profundamente agradecido a su esposa Tanja por su apoyo inquebrantable y su paciencia durante todo el proceso de escritura, y también agradece a su hijo Jakob sus ánimos. Además, Roland desea expresar un reconocimiento especial a Bilgin por su excepcional perspicacia y redacción, sin las cuales el libro no habría llegado a buen puerto.
Crear dos ediciones de este libro fue un largo viaje de varios años, y queremos dar las gracias a nuestros revisores que nos mantuvieron en el buen camino.
Para la primera edición, un reconocimiento especial a Paolo Antinori y Andrea Tarocchi por ayudarnos en el viaje. Muchas gracias también a Marko Lukša, Brandon Philips, Michael Hüttermann, Brian Gracely, Andrew Block, Jiri Kremser, Tobias Schneck y Rick Wagner, que nos apoyaron con su experiencia y sus consejos. Por último, pero no por ello menos importante, muchas gracias a nuestros editores Virginia Wilson, John Devins, Katherine Tozer, Christina Edwards, y a toda la increíble gente de O'Reilly por ayudarnos a llevar este libro hasta la línea de meta.
Completar la segunda edición no fue tarea fácil, y estamos agradecidos a todos los que nos ayudaron a terminarla. Extendemos nuestro agradecimiento a nuestros revisores técnicos, Ali Ok, Dávid Šimanský, Zbyněk Roubalík, Erkan Yanar, Christoph Stäbler, Andrew Block y Adam Kaplan, así como a nuestra editora de desarrollo, Rita Fernando, por su paciencia y ánimo durante todo el proceso. Muchas felicitaciones al equipo de producción de O'Reilly, especialmente a Beth Kelly, Kim Sandoval y Judith McConville, por su meticulosa atención en la finalización del libro.
Queremos expresar un agradecimiento especial a Abhishek Koserwal por sus incansables y dedicados esfuerzos en el Capítulo 26, "Control de acceso". Sus contribuciones llegaron en el momento en que más las necesitábamos y tuvieron un gran impacto.
1 Alexander y su equipo definieron el significado original en el contexto de la arquitectura de la siguiente manera: "Cada patrón describe un problema que se produce una y otra vez en nuestro entorno, y a continuación describe el núcleo de la solución a ese problema, de tal forma que puedas utilizar esta solución un millón de veces, sin hacerlo nunca dos veces de la misma manera".(Un lenguaje de patrones, Christopher Alexander y otros, 1977).
Get Patrones Kubernetes, 2ª Edición now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.