Descubre cómo obtener observabilidad en Kubernetes leyendo la guía de monitoreo de Kubernetes.
¿Qué es Kubernetes?
Probablemente, ya has oído hablar de Kubernetes en el contexto de la contenerización, pero ¿qué es exactamente Kubernetes y qué implica para reducir el trabajo manual asociado a estos procesos? Kubernetes, desarrollado originalmente por Google, es una plataforma de orquestación de contenedores de código abierto, diseñada para automatizar el despliegue, la escalabilidad y la gestión de aplicaciones contenerizadas.
De hecho, Kubernetes se ha establecido como el referente indiscutible para la orquestación de contenedores y es el proyecto insignia de la Native Cloud Computing Foundation (CNCF), respaldado por actores clave como Google, Amazon Web Services (AWS)), Microsoft, IBM, Intel, Cisco y Red Hat.
Aunque suele asociarse con la nube, Kubernetes (también conocido como K8s) funciona en una variedad de entornos: desde entornos en la nube hasta servidores tradicionales e infraestructuras híbridas.
Las arquitecturas de microservicios basadas en contenedores han transformado profundamente la forma en que los equipos de desarrollo y operaciones prueban y despliegan software moderno. Los contenedores ayudan a las empresas a modernizarse, ya que facilitan la escalabilidad y el despliegue de aplicaciones. Sin embargo, también han introducido nuevos desafíos y una mayor complejidad, al dar lugar a un ecosistema de infraestructura completamente nuevo.
Hoy en día, tanto las grandes como las pequeñas empresas de software despliegan miles de instancias de contenedores cada día, lo que representa un nivel de complejidad a gran escala que deben saber gestionar. Entonces, ¿cómo lo hacen?
Kubernetes facilita el despliegue y operación de aplicaciones en una arquitectura de microservicios. Lo logra creando una capa de abstracción sobre un conjunto de hosts, de modo que los equipos de desarrollo puedan desplegar sus aplicaciones y dejar que Kubernetes se encargue de las siguientes tareas:
- Controlar el consumo de recursos por aplicación o equipo
- Distribuir uniformemente la carga de una aplicación en toda la infraestructura de hosts
- Equilibrar automáticamente la carga entre las distintas instancias de una aplicación
- Monitorear el consumo de recursos y los límites definidos para detener automáticamente las aplicaciones que superan esos límites y luego reiniciarlas
- Mover una instancia de aplicación de un host a otro si hay escasez de recursos en un host o si el host deja de funcionar
- Utilizar automáticamente los recursos adicionales disponibles cuando se agrega un nuevo host al clúster
- Realizar fácilmente despliegues canary y reversiones
En este artículo, exploraremos en profundidad el universo de Kubernetes: qué es, por qué las organizaciones lo utilizan y cuáles son las mejores prácticas para aprovechar al máximo esta innovadora tecnología que ahorra tiempo.
¿Para qué se utiliza Kubernetes? ¿Por qué utilizarlo?
Desde luego, ya sabes qué es Kubernetes, pero ¿sabes qué hace Kubernetes específicamente? Kubernetes automatiza diversos aspectos de las aplicaciones contenerizadas, lo que brinda a los desarrolladores una forma escalable y simplificada de gestionar una red de aplicaciones complejas en servidores agrupados en clústeres.
Kubernetes agiliza las operaciones con contenedores, distribuyendo el tráfico para lograr una mayor disponibilidad. Según la cantidad de tráfico que reciba tu sitio o servidor, Kubernetes permite que las aplicaciones se adapten automáticamente a los cambios, asignando la cantidad adecuada de recursos de carga de trabajo según sea necesario. Esto ayuda a reducir el tiempo de inactividad del sitio ante picos de tráfico o interrupciones de red.
Kubernetes también facilita el descubrimiento de servicios, lo que permite que las aplicaciones en clústeres se comuniquen entre sí sin necesidad de conocer previamente direcciones IP ni configuraciones de extremos. Además, Kubernetes monitorea constantemente la salud de tus contenedores, detecta automáticamente los que fallan y los reemplaza, o reinicia aquellos que se han detenido, a fin de mantener las operaciones en funcionamiento de manera fluida.
Entonces, ¿por qué utilizar Kubernetes?
Con la creciente adopción de arquitecturas de microservicios y soluciones diseñadas para la nube basadas en contenedores, las organizaciones buscan plataformas confiables y consolidadas. Los especialistas utilizan Kubernetes por cuatro razones principales:
1. Kubernetes te ayuda a avanzar más rápido. Kubernetes te permite ofrecer una plataforma como servicio (PaaS) de autoservicio, que crea una capa de abstracción del hardware para los equipos de desarrollo. Tus equipos de desarrollo pueden solicitar rápida y eficientemente los recursos que necesitan. Si necesitan más recursos para gestionar una carga adicional, pueden obtenerlos con la misma rapidez, ya que todos los recursos provienen de una infraestructura compartida entre todos tus equipos.
¡Ya no es necesario rellenar formularios para solicitar nuevas máquinas que ejecuten tu aplicación! Solo tienes que aprovisionar y listo, y aprovecha las herramientas desarrolladas en torno a Kubernetes para automatizar el empaquetado, el despliegue y las pruebas. (Hablaremos más sobre Helm en una próxima sección).
2. Kubernetes es rentable. Kubernetes y los contenedores permiten una utilización mucho más eficiente de los recursos que los hipervisores o las máquinas virtuales (VMs). Dado que los contenedores son tan ligeros, requieren menos recursos de CPU y memoria para ejecutarse.
3. Kubernetes es independiente de la nube. Kubernetes se ejecuta en Amazon Web Services (AWS), Microsoft Azure y Google Cloud Platform (GCP), y también puedes usarlo en instalaciones locales. Puedes mover tus cargas de trabajo sin rediseñar tus aplicaciones ni replantear toda tu infraestructura, lo que te permite unificar tu infraestructura en torno a una plataforma y evitar la dependencia de un único proveedor.
De hecho, compañías como Kublr, Cloud Foundry y Rancher proporcionan herramientas para ayudarte a desplegar y gestionar tu clúster de Kubernetes, ya sea a nivel local o con cualquier proveedor de nube que prefieras.
4. Los proveedores de nube gestionarán Kubernetes por ti. Como se señaló anteriormente, Kubernetes es actualmente la referencia principal para las herramientas de orquestación de contenedores. No es de extrañar que los principales proveedores de nube estén ofreciendo una gran variedad de soluciones de Kubernetes como servicio. Amazon EKS, Google Cloud Kubernetes Engine, Azure Kubernetes Service (AKS), Red Hat OpenShift e IBM Cloud Kubernetes Service ofrecen una gestión completa de la plataforma Kubernetes, lo que te permite enfocarte en lo esencial: desarrollar aplicaciones que deleiten a tus usuarios.
Entonces, ¿cómo funciona Kubernetes?
Dentro de la estructura de Kubernetes, existen clústeres, nodos y pods. Estos componentes trabajan juntos para soportar aplicaciones contenerizadas. Un clúster está compuesto de varios nodos responsables de ejecutar aplicaciones. Cada nodo representa una máquina física (en instalaciones locales) o virtual (en la nube) que ayuda a que las aplicaciones funcionen. Cada nodo ejecuta uno o más pods, que son las unidades más pequeñas que se pueden desplegar en Kubernetes. Cada pod contiene uno o más contenedores. Puedes pensar en los pods como “contenedores para contenedores” que proporcionan los recursos necesarios para que los contenedores se ejecuten correctamente, incluyendo información relacionada con redes, almacenamiento y planificación de tareas.
Esta es una breve explicación de cómo funciona Kubernetes. Desde una perspectiva más profunda, el componente central de Kubernetes es el clúster. Un clúster está formado por varias máquinas físicas o virtuales, cada una con una función específica: pueden actuar como nodo o como nodo maestro. Cada nodo aloja uno o más contenedores (donde se ejecutan tus aplicaciones), y el nodo maestro se encarga de comunicarse con los nodos para indicar cuándo deben crearse o eliminarse los contenedores. Al mismo tiempo, indica a los nodos cómo redirigir el tráfico según las nuevas asignaciones de contenedores.
El siguiente diagrama presenta una visión general de un clúster de Kubernetes:

El nodo maestro de Kubernetes
El nodo maestro de Kubernetes es el punto de acceso (o plano de control) desde donde los administradores y otros usuarios interactúan con el clúster para gestionar la planificación y el despliegue de contenedores. Un clúster siempre tendrá al menos un nodo maestro, pero puede tener más dependiendo del patrón de replicación del clúster.
El nodo maestro almacena los datos del estado y de la configuración de todo el clúster en etcd, un almacén de datos persistente y distribuido basado en pares clave/valor. Cada nodo tiene acceso a etcd y, a través de él, aprende cómo mantener las configuraciones de los contenedores que está ejecutando. Puedes ejecutar etcd en el nodo maestro de Kubernetes o en configuraciones independientes.
Los nodos maestros se comunican con el resto del clúster a través del kube-apiserver, el principal punto de acceso al plano de control. Por ejemplo, el kube-apiserver se encarga de garantizar que las configuraciones almacenadas en etcd coincidan con las configuraciones de los contenedores desplegados en el clúster.
El kube-controller-manager se encarga de los bucles de control que gestionan el estado del clúster a través del API server de Kubernetes. Este servicio administra los controles de los despliegues, réplicas y nodos. Por ejemplo, el controlador de nodos es responsable de registrar un nodo y monitorear su salud a lo largo de su ciclo de vida.
Las cargas de trabajo de los nodos en el clúster son rastreadas y gestionadas por el kube-scheduler. Este servicio realiza un seguimiento de la capacidad y los recursos de los nodos, y asigna tareas a los nodos en función de su disponibilidad.
Cloud-controller-manager es un servicio que se ejecuta en Kubernetes y que contribuye a mantenerlo independiente de la nube. Este componente actúa como una capa de abstracción entre las API y herramientas de un proveedor de nube (por ejemplo, volúmenes de almacenamiento o balanceadores de carga) y sus equivalentes representativos dentro de Kubernetes.
Nodos
Todos los nodos de un clúster de Kubernetes deben estar configurados con un tiempo de ejecución de contenedores, que suele ser Docker. El tiempo de ejecución de contenedores se encarga de iniciar y gestionar los contenedores conforme Kubernetes los va desplegando en los nodos del clúster. Tus aplicaciones (servidores web, bases de datos, servidores de API, etc.) se ejecutan dentro de los contenedores.
Cada nodo de Kubernetes ejecuta un proceso agente llamado kubelet, responsable de gestionar el estado del nodo: iniciar, detener y mantener los contenedores de las aplicaciones según las instrucciones del plano de control. El kubelet recopila información sobre el rendimiento y la salud del nodo, los pods y los contenedores que ejecuta. Asimismo, comparte esa información con el plano de control para ayudar en la toma de decisiones de planificación.
El kube-proxy es un proxy de red que se ejecuta en los nodos del clúster. También funciona como un balanceador de carga para los servicios que se ejecutan en un nodo.
La unidad básica de planificación es el pod, que consiste en uno o más contenedores que se ejecutan juntos en la misma máquina host y pueden compartir recursos. A cada pod se le asigna una dirección IP única dentro del clúster, lo que permite que la aplicación use puertos sin conflictos.
Describes el estado deseado de los contenedores en un pod mediante un objeto YAML o JSON llamado Pod Spec. Estos objetos se envían al kubelet a través del servidor de API.
Un pod puede definir uno o más volúmenes, como un disco local o un disco de red, y exponerlos a los contenedores dentro del pod, lo que permite que distintos contenedores compartan espacio de almacenamiento. Por ejemplo, los volúmenes pueden utilizarse cuando un contenedor descarga contenido y otro lo sube a otro destino. Dado que los contenedores dentro de los pods suelen ser efímeros, Kubernetes ofrece un tipo de balanceador de carga llamado servicio, que simplifica el envío de solicitudes a un grupo de pods. Un servicio se vincula a un conjunto lógico de pods, seleccionados en función de etiquetas (explicado a continuación). De forma predeterminada, los servicios solo pueden accederse desde dentro del clúster, pero puedes habilitar el acceso público si deseas que reciban solicitudes desde fuera del clúster.
Despliegue y réplicas
Un despliegue es un objeto YAML que define los pods y la cantidad de instancias de contenedores —llamadas réplicas— para cada pod. Tú defines cuántas réplicas deseas tener en ejecución en el clúster mediante un ReplicaSet, que forma parte del objeto de despliegue. Así, por ejemplo, si un nodo que ejecuta un pod falla, el ReplicaSet se encarga de programar otro pod en un nodo disponible.
Un DaemonSet despliega y ejecuta un daemon específico (dentro de un pod) en los nodos que determines. Los DaemonSets se utilizan principalmente para proporcionar servicios o realizar tareas de mantenimiento en los pods. Por ejemplo, un DaemonSet es el mecanismo que utiliza New Relic Infrastructurepara desplegar el agente de infraestructura en todos los nodos de un clúster.
Namespaces
Los namespaces permiten crear clústeres virtuales sobre un clúster físico. Están diseñados para entornos con muchos usuarios distribuidos entre varios equipos o proyectos. Asignan cuotas de recursos y separan lógicamente los recursos del clúster.
Etiquetas
Las etiquetas son pares de clave/valor que puedes asignar a pods y a otros objetos en Kubernetes. Las etiquetas permiten a los operadores de Kubernetes organizar y seleccionar un subconjunto de objetos. Por ejemplo, al monitorear objetos de Kubernetes, las etiquetas te permiten filtrar rápidamente la información que más te interesa.
Statefulsets y volúmenes persistentes de almacenamiento
Los StatefulSets te permiten asignar IDs únicas a los pods en caso de que necesites trasladarlos a otros nodos, mantener la conexión de red entre ellos o conservar datos entre ejecuciones. De forma similar, los volúmenes persistentes de almacenamiento ofrecen recursos de almacenamiento a los que los pods pueden acceder durante el despliegue en el clúster.
Otros componentes útiles
Los siguientes componentes de Kubernetes son útiles, pero no son necesarios para el funcionamiento habitual del sistema.
DNS de Kubernetes
Kubernetes ofrece este mecanismo para el descubrimiento de servicios basado en DNS entre pods. Este servidor DNS funciona de forma complementaria a cualquier otro servidor DNS que puedas estar utilizando en tu infraestructura.
Logs del clúster
Si cuentas con una herramienta de logging, puedes integrarla con Kubernetes para extraer y almacenar logs de aplicaciones y del sistema generados dentro de un clúster, escritos en la salida estándar y en el error estándar. Si deseas utilizar los logs del clúster, es importante tener en cuenta que Kubernetes no proporciona almacenamiento nativo de logs: debes contar con tu propia solución de almacenamiento.
Helm: gestión de aplicaciones en Kubernetes
Helmes un gestor de paquetes de aplicaciones para Kubernetes, mantenido por la CNCF. Los gráficos de Helm son recursos de aplicaciones preconfigurados que puedes descargar y desplegar en tu entorno de Kubernetes. Según una encuesta realizada por la CNCF en 2020, el 63 % de los encuestados señaló que Helm era la herramienta de gestión de paquetes preferida para aplicaciones en Kubernetes. Los gráficos de Helm pueden ayudar a los equipos de DevOps a adoptar más rápidamente la gestión de aplicaciones en Kubernetes, ya que les permite utilizar gráficos existentes que pueden compartir, versionar y desplegar tanto en entornos de desarrollo como de producción.
Kubernetes e Istio: una combinación popular
En una arquitectura de microservicios como las que se ejecutan en Kubernetes, una malla de servicios es una capa de infraestructura que permite que las instancias de servicio se comuniquen entre sí. Además, la malla de servicios te permite configurar cómo deben ejecutar las instancias de servicio determinadas acciones clave, como el descubrimiento de servicios, el balanceo de carga, el cifrado de datos y la autenticación y autorización. Istio es una de estas mallas de servicios, y las tendencias actuales entre líderes tecnológicos —como Google e IBM— indican que se están volviendo cada vez más inseparables.
El equipo de IBM Cloud, por ejemplo, utiliza Istio para enfrentar los desafíos de control, visibilidad y seguridad que ha encontrado al desplegar Kubernetes a gran escala. Más específicamente, Istio ayuda a IBM a:
- Conectar los servicios entre sí y controlar el flujo del tráfico
- Proteger las interacciones entre microservicios mediante políticas flexibles de autenticación y autorización
- Proporcionar un punto de control que le permita a IBM gestionar los servicios en producción
- Observar lo que ocurre en sus servicios a través de un adaptador que envía datos de Istio a New Relic, lo que le permite monitorear el rendimiento de los microservicios en Kubernetes, junto con los datos de aplicación que ya recopila
Desafíos para la adopción de Kubernetes
La plataforma Kubernetes ha evolucionado notablemente desde su lanzamiento inicial. Sin embargo, ese tipo de crecimiento acelerado también conlleva ciertos desafíos asociados al crecimiento. A continuación, se presentan algunos de los desafíos asociados con la adopción de Kubernetes:
1. El panorama tecnológico de Kubernetes puede ser confuso. Una de las cosas que más valoran los desarrolladores de las tecnologías de código abierto como Kubernetes es su potencial para innovar rápidamente. Pero, a veces, un ritmo de innovación demasiado acelerado puede generar confusión, especialmente cuando el núcleo de código de Kubernetes avanza más rápido de lo que los usuarios pueden asimilar. Si a eso le sumamos la gran cantidad de plataformas y proveedores de servicios gestionados, el panorama puede resultar difícil de entender para quienes están adoptando Kubernetes por primera vez.
2. Los equipos de desarrollo e IT con visión de futuro no siempre se alinean con las prioridades del negocio. Cuando los presupuestos se asignan únicamente para mantener el status quo, puede resultar difícil conseguir financiación para iniciativas de adopción de Kubernetes, ya que estos experimentos suelen requerir una cantidad significativa de tiempo y recursos de los equipos. Además, los equipos de IT de entornos empresariales suelen ser reacios al riesgo y lentos para adoptar cambios.
3. Los equipos aún están adquiriendo las habilidades necesarias para aprovechar Kubernetes. Hace solo unos años, los desarrolladores y los equipos de operaciones de IT tuvieron que reajustar sus prácticas para adoptar los contenedores; y ahora, también deben incorporar la orquestación de contenedores. Las empresas que desean adoptar Kubernetes necesitan contratar profesionales que no solo sepan programar, sino que también comprendan la gestión de operaciones, la arquitectura de aplicaciones, el almacenamiento y los flujos de datos.
4. Kubernetes puede ser difícil de gestionar. De hecho, puedes leer todo tipo de historias de terror sobre Kubernetes —desde interrupciones de DNS hasta “fallas en cascada de sistemas distribuidos”— en el repositorio de GitHub Kubernetes Failure Stories.
Mejores prácticas para Kubernetes
Optimiza tu infraestructura de Kubernetes en términos de rendimiento, confiabilidad, seguridad y escalabilidad siguiendo estas buenas prácticas:
- Solicitudes y límites de recursos: define solicitudes y límites de recursos para los contenedores. Las solicitudes especifican los recursos mínimos necesarios, mientras que los límites evitan que los contenedores usen recursos en exceso. Esto garantiza una asignación equitativa de recursos y evita la contención entre ellos.
- Liveness y readiness probes: implementa liveness y readiness probes en tus contenedores. Las liveness probes determinan si un contenedor está en ejecución, mientras que las readiness probes indican cuándo está listo para recibir tráfico. Una configuración adecuada de estas probes mejora la confiabilidad de la aplicación.
- Gestión de Secrets: utiliza los Secrets de Kubernetes para almacenar información sensible, como contraseñas o claves de API. Evita incrustar Secrets directamente en archivos de configuración o imágenes de Docker, a fin de fortalecer la seguridad.
- Políticas de red: implementa políticas de red para controlar la comunicación entre pods. Estas políticas ayudan a definir reglas para el tráfico de entrada y salida, mejorando así la seguridad del clúster.
- RBAC (control de acceso basado en roles): implementa RBAC para restringir el acceso al clúster. Define roles y asignaciones de roles para otorgar únicamente los privilegios mínimos necesarios a usuarios y servicios, a fin de fortalecer la seguridad.
- Infraestructura inmutable: considera tu infraestructura como inmutable. Evita hacer cambios directamente sobre contenedores en ejecución. En su lugar, vuelve a desplegar con las modificaciones necesarias. La infraestructura inmutable simplifica la gestión y reduce el riesgo de desviaciones de configuración.
- Copia de seguridad y recuperación ante desastres: realiza copias de seguridad periódicas de las configuraciones y datos esenciales. Implementa planes de recuperación ante desastres para restaurar tu clúster en caso de fallos.
- Escalado automático de pods horizontal (HPA): utiliza escalado automático de pods horizontal para escalar automáticamente la cantidad de pods en un despliegue según el uso de CPU o métricas personalizadas. El HPA garantiza un uso óptimo de recursos y un buen rendimiento de las aplicaciones.
- Monitoreo y logging: configura soluciones de monitoreo y logging para obtener visibilidad sobre la salud del clúster y el comportamiento de las aplicaciones.
New Relic puede acompañarte en tu recorrido con Kubernetes
Necesitas comprender a fondo el rendimiento de tus clústeres y cargas de trabajo y, además, poder hacerlo de forma rápida y sencilla. Con New Relic, puedes resolver problemas más rápido analizando todos tus clústeres desde una misma interfaz de usuario —sin necesidad de actualizar código, volver a desplegar tus aplicaciones ni pasar por largos procesos de estandarización dentro de tus equipos. La telemetría automática con Pixie te ofrece visibilidad instantánea de tus clústeres y cargas de trabajo en Kubernetes en cuestión de minutos.
El explorador de clústeres de Kubernetes te ofrece un único lugar donde puedes analizar todas tus entidades de Kubernetes: nodos, namespaces, despliegues, ReplicaSets, pods, contenedores y cargas de trabajo. Cada porción del “gráfico circular” representa un nodo, y cada hexágono representa un pod. Selecciona un pod para analizar el rendimiento de tus aplicaciones, incluyendo el acceso a los archivos de logs relacionados.
Analizar el rendimiento de los pod y de la aplicación
Podrás analizar el rastreo distribuido de cada aplicación. Al hacer clic en un span individual, verás los atributos de Kubernetes relacionados (por ejemplo: pods, clústeres y despliegues asociados).
Y también podrás obtener datos de rastreo distribuido desde las aplicaciones que se ejecutan en tus clústeres.
Próximos pasos
Comienza hoy mismo con el despliegue de Auto-telemetry con Pixie (enlace para la UE).
Este artículo se actualizó a partir de una versión anterior publicada en julio de 2018.
Las opiniones expresadas en este blog son las del autor y no reflejan necesariamente las opiniones de New Relic. Todas las soluciones ofrecidas por el autor son específicas del entorno y no forman parte de las soluciones comerciales o el soporte ofrecido por New Relic. Únase a nosotros exclusivamente en Explorers Hub ( discus.newrelic.com ) para preguntas y asistencia relacionada con esta publicación de blog. Este blog puede contener enlaces a contenido de sitios de terceros. Al proporcionar dichos enlaces, New Relic no adopta, garantiza, aprueba ni respalda la información, las vistas o los productos disponibles en dichos sitios.