Las redes de Kubernetes proporcionan la infraestructura de red para permitir la comunicación, la escalabilidad, la seguridad y el acceso externo para aplicaciones contenerizadas.
La red es compleja e implica la comunicación entre todos los componentes principales que existen en su interior, como pods, nodos, contenedores y servicios; y fuera como el tráfico externo de un clúster de Kubernetes.
Para comunicarse, estos componentes utilizan cuatro métodos de red distintos:
1. Redes de contenedor a contenedor.
2. Redes de pod a pod
3. Redes de pod a servicio.
4. Redes externas al servicio
El nombre Kubernetes proviene del griego y significa timonel o piloto. Basado en Borg, la plataforma de orquestación interna de contenedores de Google, Kubernetes se presentó al público como una herramienta de código abierto en 2014.
Ese mismo año, Google donó Kubernetes a la Cloud Native Computing Foundation, el centro de código abierto y neutral para proveedores de la computación nativa de la nube. Desde entonces, Kubernetes se ha convertido en la herramienta de orquestación de contenedores más utilizada para ejecutar cargas de trabajo basadas en contenedores en todo el mundo.
Kubernetes, también denominado "k8s" o "kube", se diseñó expresamente para automatizar la gestión de contenedores, la unidad estándar de software que empaqueta el código y todas sus dependencias. La herramienta de orquestación es muy valiosa para funcionar de forma rápida y fiable en cualquier entorno de infraestructura, ya sea on-premises, en la nube privada, en la nube pública o en la nube híbrida.
A diferencia de las máquinas virtuales (VM) que virtualizan el hardware físico, los contenedores virtualizan el sistema operativo, como Linux o Windows. Cada contenedor contiene únicamente las bibliotecas y dependencias de la aplicación. Dado que los contenedores comparten el mismo núcleo del sistema operativo que el host, se consideran ligeros, rápidos y portátiles.
Kubernetes y su ecosistema de servicios, soporte y herramientas se han convertido en la base de la infraestructura moderna en la nube y la modernización de aplicaciones. Todos los principales proveedores de servicios en la nube, incluidos Amazon Web Services (AWS), Google, Microsoft, IBM y Red Hat, integran Kubernetes en sus plataformas en la nube para mejorar las capacidades de Plataforma como servicio (PaaS) e Infraestructura como servicio (IaaS).
Los siguientes componentes fundamentales conforman la arquitectura de Kubernetes:
Un clúster de Kubernetes es un conjunto de máquinas físicas o virtuales (nodos) que funcionan juntas para ejecutar aplicaciones en contenedores. Los clústeres conforman la base de la arquitectura de Kubernetes.
Los nodos maestros representan un único host informático, ya sea una máquina virtual o física. Alojan los componentes del plano de control de Kubernetes y son responsables de programar y escalar aplicaciones.
Al gestionar todos los recursos informáticos, de red y de almacenamiento en un clúster de Kubernetes, el nodo maestro ayuda a garantizar que las aplicaciones y servicios en contenedores se implementen por igual en los nodos de trabajo del clúster.
Los nodos de trabajo son responsables de ejecutar los contenedores y de realizar cualquier trabajo asignado por el nodo maestro. También alojan contenedores de aplicaciones, que se agrupan en pods.
Los pods son grupos de uno o más contenedores, como Linux o Docker que comparten los mismos recursos informáticos y red. Son unidades de implementación de clústeres que también funcionan como unidades de escalabilidad.
Por ejemplo, si un contenedor de un pod experimenta un gran volumen de tráfico, Kubernetes puede replicar ese pod en otros nodos del clúster. Kubernetes también puede apagar pods si el volumen de tráfico disminuye.
Otros componentes de Kubernetes incluyen:
Implementación: la implementación en Kubernetes gestiona un conjunto de pods para ejecutar una carga de trabajo de la aplicación. Una implementación identifica cuántas réplicas de un pod deben ejecutarse en el clúster. Si un pod falla, la implementación crea uno nuevo.
Esta característica crítica ayuda a escalar el número de pods réplica, implementar actualizaciones de código y mantener la disponibilidad. Las implementaciones se realizan utilizando kubectl, la herramienta de línea de comandos específica de Kubernetes.
Servicio: el servicio de Kubernetes es una capa de abstracción que define un conjunto lógico de pods y cómo acceder a ellos. Un servicio expone una aplicación de red que se ejecuta en uno o más pods de un clúster. Proporciona una forma abstracta de equilibrar la carga de los pods.
Servidor de interfaz de programación de aplicaciones (API): el servidor API de Kubernetes expone la API de Kubernetes (la interfaz que se utiliza para gestionar, crear y configurar los clústeres de Kubernetes) y sirve de punto de entrada para todos los comandos y consultas.
Las redes informáticas básicas implican conectar dos o más dispositivos informáticos para compartir datos e intercambiar recursos, ya sea por cable o a través de una red wifi.
En las redes físicas, los servidores físicos se conectan a equipos de red físicos como conmutadores, enrutadores y cables Ethernet para conectarse a Internet.
En las redes virtuales, redes definidas por software (SDN), componentes como dispositivos Ethernet virtuales e interfaces virtuales se instalan en servidores bare metal o máquinas virtuales para conectarse a Internet. La implementación de Kubernetes se basa en SDN para configurar y administrar la comunicación de red entre clústeres.
Antes de profundizar en las redes de Kubernetes, vale la pena revisar los términos básicos de red:
Host de red: un host de red es cualquier ordenador conectado a una red que proporciona información, aplicación o servicios a otros hosts o nodos de la red.
Dirección de protocolo de Internet (IP): una dirección IP es un número único asignado a cada dispositivo conectado a una red que utiliza el protocolo de Internet para la comunicación. Identifica la red host del dispositivo y la ubicación del dispositivo en la red host.
Localhost: Localhost es un nombre de host predeterminado que actúa como una dirección IP privada, apuntando directamente a la computadora o dispositivo que utilizan.
Puerto: un puerto identifica una conexión específica entre dispositivos de red. Un número identifica cada puerto. Los ordenadores utilizan números de puerto para determinar qué aplicación, servicio o proceso debe recibir determinados mensajes.
Traducción de direcciones de red (NAT): NAT cambia las direcciones internas o privadas a direcciones IP públicas o enrutables globalmente, lo que permite un acceso seguro a Internet. NAT permite que una dirección IP única represente a todo un grupo de dispositivos informáticos.
Agentes de nodo: los agentes de nodo son agentes administrativos que supervisan los servidores de aplicaciones en un sistema host y enrutan las solicitudes administrativas a otros servidores.
Espacio de nombres de red: un espacio de nombres de red es una colección de interfaces de red e instrucciones de tabla de enrutamiento que proporciona aislamiento entre dispositivos de red.
Proxy o servidor proxy: un proxy proporciona una pasarela entre los usuarios e Internet.
Kubernetes se creó para ejecutar sistemas distribuidos con un plano de red distribuido en un clúster de máquinas. Además de proporcionar interconectividad entre componentes, las redes de clústeres de Kubernetes crean un entorno perfecto en el que los datos pueden moverse de forma libre y eficiente a través de redes definidas por software.
Otra característica distintiva de las redes de Kubernetes es su estructura de red plana, lo que significa que todos los componentes pueden conectarse sin depender de otro hardware. En Kubernetes, todos los pods de un clúster se pueden comunicar con todos los demás dispositivos, independientemente del nodo en el que se ejecute. La red plana ofrece un modo eficaz de compartir recursos y elimina la necesidad de asignar puertos de forma dinámica.
En general, las redes Kubernetes abstraen la complejidad, lo que permite a los desarrolladores y operadores centrarse en crear y mantener aplicaciones en lugar de ocuparse de intrincadas configuraciones de red.
Kubernetes proporciona un modelo de red para ayudar a abordar los retos de la orquestación de aplicaciones en contenedores a través de un entorno distribuido. El tiempo de ejecución del contenedor en cada nodo implementa el modelo de red y se adhiere a las siguientes reglas:
Cada pod tiene su propia dirección IP, que puede enrutarse dentro del clúster. Esta característica elimina la necesidad de crear vínculos entre pods y puertos de representación cartográfica.
Dado que cada pod tiene su propia dirección IP, no se requiere NAT. Todos los pods pueden comunicarse con todos los demás pods del clúster sin NAT.
Los agentes en un nodo, como el kubelet, el agente de nodo principal que se ejecuta en cada nodo, pueden comunicarse con todos los pods en ese nodo específico.
El modelo de red de Kubernetes se aplica a cuatro tipos básicos de comunicación de Kubernetes:
Los contenedores son la unidad más pequeña de una red Kubernetes. En las configuraciones de red básicas, los contenedores se comunican dentro de un único pod a través de localhost.
Esta comunicación es posible porque los contenedores de un mismo pod comparten el mismo espacio de nombres de red, que incluye recursos de red como almacenamiento, dirección IP y espacio de puertos.
La comunicación de pod a pod incluye la comunicación entre pods en el mismo nodo y la comunicación entre pods en diferentes nodos. Cada pod en un clúster de Kubernetes tiene su propia dirección IP única, lo que permite la comunicación directa entre pods independientemente del nodo en el que existan.
Además, cada clúster de Kubernetes proporciona automáticamente un servicio de sistema de nombres de dominio (servicio DNS) además de la dirección IP del pod. El servicio DNS donde se asignan nombres a pods y servicios crea nombres fáciles y legibles para los administradores, proporcionando un mecanismo ligero para la detección de servicios.
Un servicio en Kubernetes es una abstracción que define un conjunto lógico de pods y permite la exposición externa del tráfico, el equilibrio de carga y el descubrimiento de servicios a esos pods. Los servicios facilitan la comunicación entre pods y servicios y entre externos y servicios.
Según el modelo de red Kubernetes, las direcciones IP de pods son efímeras. Por lo tanto, si un pod falla o se elimina y se crea un nuevo pod en su lugar, lo más probable es que el nuevo pod reciba una nueva dirección IP.
En la comunicación pod-to-service, ClusterIP es un tipo de servicio que proporciona una dirección IP virtual estable a un conjunto de pods. Esta IP interna sólo es accesible dentro del clúster y se puede utilizar para comunicaciones internas entre pods y servicios.
El kube-proxy, instalado en cada nodo de un clúster, mantiene las reglas de red en el host y monitoriza los cambios en los servicios y pods. A medida que se crean o destruyen pods, el kube-proxy actualiza iptables (un programa de utilidad diseñado para crear reglas en el firewall del núcleo de Linux para enrutar el tráfico) para reflejar ese cambio, de modo que el tráfico enviado a la IP de servicio se enrute correctamente.
La red externa a servicios se refiere a exponer y acceder a servicios, como servicios externos o bases de datos, desde fuera del clúster de Kubernetes.
Kubernetes proporciona varios servicios para facilitar el tráfico externo a un clúster:
ClusterIP: aunque ClusterIP es el servicio predeterminado de Kubernetes para las comunicaciones internas, el tráfico externo puede acceder a él a través del kube-proxy. ClusterIP puede ser útil al acceder a un servicio en un ordenador portátil o al depurar un servicio.
NodePort: el NodePort expone el servicio en un puerto estático en la IP de cada nodo, lo que hace que el servicio sea accesible fuera del clúster. El NodePort es la forma más básica de realizar redes externas a servicios y, a menudo, se utiliza con fines de prueba, como probar el acceso público a una aplicación.
LoadBalancer: el estándar para redes de servicios externos, el LoadBalancer expone el servicio externamente mediante el equilibrador de carga de un proveedor de servicios en la nube y asigna al servicio una dirección IP pública. El tráfico procedente del equilibrador de carga externo se dirige entonces a los pods backend.
ExternalName: un servicio de nombre externo permite acceder a un servicio externo por nombre DNS sin exponerlo en el clúster DNS. Este tipo de servicio ayuda a proporcionar un nombre DNS estable para servicios externos, como los servicios de mensajería no alojados dentro del clúster.
Entrada: la entrada de Kubernetes es una colección de reglas de enrutamiento que rodean el acceso externo a los servicios dentro del clúster. El controlador de entrada es un equilibrador de carga que actúa como un puente de red entre los servicios de Kubernetes y los servicios externos.
Las políticas de red de Kubernetes son una construcción de aplicación que desempeña un papel vital en la red Kubernetes. Estas políticas permiten a los administradores y desarrolladores definir reglas que especifican cómo pueden comunicarse los pods entre sí y con otros endpoints de la red.
Las políticas de red se aplican utilizando la API de políticas de red de Kubernetes y constan de los siguientes componentes básicos:
Selector de pod: El selector de pod especifica a qué pod se aplica la política basándose en etiquetas y selectores.
Entrada: la entrada define las reglas para el tráfico entrante a los pod
Salida: la salida define las reglas para el tráfico saliente de los pod.
Las políticas de red de Kubernetes ayudan a definir y gestionar políticas de seguridad al definir reglas que controlan qué pods pueden comunicarse entre sí, evitando así el acceso no autorizado y los ataques maliciosos.
Las políticas de red también garantizan el aislamiento entre pods y servicios para que solo esos pods o servicios puedan comunicarse con un conjunto permitido de pares. Por ejemplo, el aislamiento es crítico para situaciones de múltiples arrendatarios cuando DevOps u otros equipos comparten el mismo clúster de Kubernetes pero trabajan en diferentes proyectos.
Para las empresas con requisitos de conformidad específicos, las políticas de red ayudan a especificar y aplicar los controles de acceso a la red. Esto ayuda a cumplir con los estándares regulatorios y ayuda a garantizar que el clúster cumpla con las políticas de la organización.
La interfaz de red de contenedores (CNI) es otra característica esencial vinculada a las redes de Kubernetes. Creado y mantenido por Cloud Native Computing Foundation y utilizado por Kubernetes y otros tiempos de ejecución de contenedores, incluidos RedHat OpenShift y Apache Mesos, CNI es una especificación estandarizada y un conjunto de API que definen cómo los complementos de red deben habilitar las redes de contenedores.
Los complementos de CNI pueden asignar direcciones IP, crear espacios de nombres de red, configurar rutas de red y así sucesivamente, para permitir la comunicación de pod a pod, tanto dentro del mismo nodo como entre nodos.
Si bien Kubernetes proporciona un CNI predeterminado, numerosos complementos CNI de terceros, incluidos Calico, Flannel y Weave, están diseñados para manejar la configuración y la seguridad en entornos de red basados en contenedores.
Aunque cada una podría tener diferentes características y enfoques de redes, como redes superpuestas o enrutamiento directo, todas cumplen con las especificaciones CNI que son compatibles con Kubernetes.
Si quieres empezar a trabajar con Kubernetes o quieres mejorar tus habilidades actuales con Kubernetes y las herramientas del ecosistema de Kubernetes, prueba uno de estos tutoriales.
IBM Cloud Pak for Network Automation es un Cloud Pak que permite automatizar y orquestar las operaciones de infraestructura de redes.
Las soluciones de redes en la nube de IBM proporcionan conectividad de alto rendimiento para potenciar sus aplicaciones y su negocio.
Consolide el soporte de los centros de datos con IBM Technology Lifecycle Services para redes en la nube y más.