Puntos clave: Los servicios Kubernetes son esenciales para exponer aplicaciones y gestionar el balanceo de carga dentro de clústeres, proporcionando puntos finales estables a pesar de los cambios dinámicos de IP en pods. Admiten varios tipos de servicios, incluyendo ClusterIP, NodePort, LoadBalander y ExternalName.
- Los servicios pueden crearse con o sin selectores para una gestión flexible de pods.
- Simplifican el descubrimiento de servicios, eliminando la necesidad de mecanismos separados.
Un servicio Kubernetes están una colección lógica de pods en un clúster Kubernetes. Podemos Define un servicio K8s como una forma abstracta de balancear la carga entre los pods y exponer una aplicación desplegada en un conjunto de pods. Además, usar el mecanismo de servicio incorporado en Kubernetes elimina la necesidad de implementar un mecanismo separado de descubrimiento de servicios.
En este artículo, hablaremos sobre la estructura de un servicio Kubernetes y cómo utilizarlo.
¿Qué son los servicios de Kubernetes?
Un servicio Kubernetes puede usarse para exponer fácilmente una aplicación desplegada en un conjunto de pods usando un único punto final. Un servicio están tanto un objeto REST como una abstracción que define:
- Un conjunto de cápsulas
- Una política para acceder a ellos
Los pods en un despliegue de Kubernetes son creados y destruidos regularmente, lo que provoca que sus direcciones IP cambien constantemente. Esto Crea problemas de descubrimiento para el desplegado, lo que dificulta que el frontend de la aplicación identifique qué pods conectar.
Aquí están donde entran en juego las fortalezas de los servicios Kubernetes: los servicios llevan un registro de los cambios en las direcciones IP y los nombres DNS de los pods y los exponen al usuario final como una única IP o DNS.
Los servicios de Kubernetes utilizan selectores para dirigir un conjunto de pods:
- Para aplicaciones nativas de Kubernetes (que utilizan APIs de Kubernetes para el descubrimiento de servicios), la API de endpoint se actualizará siempre que son cambios en los pods del servicio.
- Las aplicaciones no nativas pueden utilizar métodos de implementación de puentes o balanceadores de carga basados en IP virtuales ofrecidos por Kubernetes para dirigir el tráfico a los pods del backend.
Atributos de un servicio Kubernetes
Aquí son los atributos generales de un servicio:
- A un servicio se le está asignada una dirección IP ("IP de clúster"), que utilizan los proxies del servicio.
- Un servicio puede asignar un puerto entrante a cualquier puerto destino. (Por defecto, el puerto destino se está asignado al mismo valor del campo puerto, y puede definirse como una cadena.)
- El número de puerto asignado a cada nombre puede variar en cada pod backend. (Por ejemplo, te puede cambiar el número de puerto que exponen los pods en la siguiente versión de tu software backend sin romper a los clientes.)
- Los servicios soportan TCP (por defecto), UDP y SCTP para protocolos.
- Los servicios pueden definirse con o sin un selector.
- Los servicios soportan una variedad de definiciones de puertos
Ahora vamos a Ve cómo funcionan los servicios.
Definición de un servicio Kubernetes
Como se mencionó antes, podemos Define servicios Kubernetes con o sin selectores—¡hagamos ambas cosas!
Definición de un servicio con un selector
En el siguiente ejemplo, hemos definido un servicio sencillo que expone el puerto 80 del servicio mientras se dirige al puerto 8080 en los Pods con la etiqueta selectora "app=webserver-nginx".
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: webserver-nginx
ports:
- protocol: TCP
port: 80
targetPort: 8080
Kubernetes asignará automáticamente una dirección IP ("IP del clúster") que será utilizada por los proxies de servicio para enrutar el tráfico. El controlador del selector supervisa consistentemente si los Pods coinciden con la etiqueta definida.
Algunas aplicaciones requerirán que se expongan múltiples puertos a través del servicio. Kubernetes facilita esto utilizando servicios multipuerto donde un usuario puede Define múltiples puertos en un solo objeto de servicio. Al definir un servicio multipuerto, el requisito principal están proporcionar nombres para cada puerto expuesto para que son inequívocos. Estos nombres de puertos pueden:
- Solo contienen caracteres alfanuméricos y el símbolo de guion
- Debería Comienza y terminar con un carácter alfanumérico.
En este ejemplo, hemos expuesto tanto los puertos 80 como 443 a los puertos objetivo 8080 y 8090 para enrutar tráfico HTTP y HTTPS a pods subyacentes usando el selector "app=webserver-nginx-multiport"
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: webserver-nginx-multiport
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: https
protocol: TCP
port: 443
targetPort: 8090
Definición de un servicio sin selector
Al definir un servicio sin selector, te necesario asignar manualmente el servicio a la dirección IP y puerto correspondientes añadiendo un objeto endpoints. La razón están que los objetos endpoint no se crean automáticamente como son con un selector, ya que Kubernetes no sabe a qué pods debe estar conectado el servicio. Servicio:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
ports:
- protocol: TCP
port: 80
targetPort: 8080
Punto final:
apiVersion: v1
kind: Endpoints
metadata:
name: nginx-service
subsets:
- addresses:
- ip: 192.10.0.1
ports:
- port: 8080
Al definir un servicio y el punto final, la consideración principal están que tanto el nombre del servicio como el del punto final deben coincidir exactamente.
Algunos casos de utiliza para servicios sin selectores incluyen:
- Conectarse a un servicio diferente en otro Namespace o en otro clúster
- Comunicación con servicios externos, migración de datos, servicios de prueba, despliegues, etc.
Creación de un servicio Kubernetes
Ahora que conocemos la estructura básica de un servicio Kubernetes, utilizemos un ejemplo práctico para entender mejor cómo Crea un servicio. Primero, Crea un pequeño despliegue con cuatro réplicas de un servidor web Apache.
apache-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-deployment
labels:
app: webserver
spec:
replicas: 4
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
containers:
- name: apache
image: bitnami/apache:latest
ports:
- containerPort: 80
Crea el despliegue.
kubectl apply -f apache-deployment.yaml
Resultado:
Comprueba el estado del despliegue.
kubectl get deployment apache-deployment
Resultado:
Ahora hemos desplegado la aplicación en el servidor Apache.
A continuación, Crea un servicio para acceder a nuestra aplicación desplegada. Ambos son métodos para hacerlo:
- Crea un manifiesto YAML para un servicio
- Utiliza el comando "kubectl expose"
El comando expose permite a los usuarios Crea el servicio directamente desde la línea de comandos.
Podemos utilizar el siguiente comando para exponer el "apache-deployment" con el tipo de servicio ClusterIP. Apuntaremos el servicio al puerto 8080 ya que la imagen "bitnami/apache" usa el puerto 8080 como puerto HTTP.
kubectl expose deployment apache-deployment --name=apache-http-service --type=ClusterIP --port=8080 --target-port=8080
Resultado:
Comprueba si el servicio está creado correctamente.
kubectl get service apache-http-service
Resultado:
Ahora necesitamos reenviar el tráfico al servicio que creamos, y podemos utilizar el comando "kubectl port-forward" para eso. Dirigiremos el tráfico desde el puerto host 8090 al puerto de servicio 8080.
kubectl port-forward service/apache-http-service 8090:8080
Resultado:
Cuando naveguemos a la "http://localhost:8090", nos dirigirán a una página de aterrizaje de Nginx como la siguiente.
También podríamos haber definido un servicio usando un archivo YAML para el escenario anterior, como se muestra a continuación. Allí hemos configurado el selector como "app=webserver."
apiVersion: v1
kind: Service
metadata:
name: apache-http-service
spec:
selector:
app: webserver
ports:
- protocol: TCP
port: 8080
targetPort: 8080
Tipos de servicios Kubernetes
Son cuatro tipos de servicios Kubernetes:
Este es el tipo predeterminado que expone el servicio en una IP interna del clúster. Estos servicios solo son accesibles dentro del clúster. Por tanto, los usuarios deben implementar reenvío de puertos o un proxy para exponer un ClusterIP a una entrada más amplia de tráfico.
Un servicio NodePort expone el servicio en la IP de cada nodo en un puerto estático. Se está creado automáticamente un servicio ClusterIP para enrutar el tráfico al servicio NordPort. Los usuarios pueden comunicarse con el servicio desde fuera solicitando:
Esta es la solución preferida para exponer el clúster a internet más amplio. El tipo de servicio LoadBalancer Crea un balanceador de carga (el tipo de balanceador depende del proveedor de la nube) y expondrá el servicio externamente.
También Crea automáticamente los servicios ClusterIP y NodePort y enrutará el tráfico en consecuencia.
Este tipo de servicio mapea el servicio al contenido del campo externalName (Ex: app.test.com). Esto lo hace devolviendo un valor para el registro CNAME.
Implementaciones de proxy de servicio
El proceso kube-proxy implementa una forma de IPs virtuales para todos los tipos de servicio, excluyendo el tipo ExternalName. El uso de proxy para servicios permite a los usuarios mitigar algunos problemas de resolución DNS.
Por ejemplo, si un registro DNS está caducado, puede haber casos en los que consultas DNS anteriores son aún almacenadas en caché con el registro caducado, lo que puede causar problemas de resolución. De manera similar, que los registros DNS no se propaguen correctamente también puede provocar problemas de resolución.
Los siguientes tres métodos pueden ser utilizados por el proxy kube para enrutar el tráfico:
- Modo proxy: espacio de usuario
- Modo proxy: iptables
- Modo proxy: ipvs
Modo proxy: espacio de usuario
En este modo, kube-proxy monitoriza el maestro Kubernetes y, cada vez que se crea o elimina un servicio o un punto final, asigna o desasigna un puerto aleatorio en el nodo local.
Todas las conexiones a este "puerto proxy" son proxiadas al servicio y a los endpoints necesarios.
Modo proxy: iptables
Este modo también monitoriza el maestro Kubernetes para servicios y endpoints. Sin embargo, también instala reglas iptable para capturar el tráfico al ClusterIP del servicio y el puerto y luego redirigir el tráfico.
Además, instala reglas iptable para que los objetos del endpoint seleccionen el Pod del backend, mientras que el comportamiento por defecto están seleccionar un backend aleatorio. (Pod)
En este modo, el kube-proxy vigila los servicios y endpoints y luego llama a la interfaz Netlink para Crea las reglas IPvs (IP Virtual Server) apropiadas. Este modo sincronizará periódicamente las reglas ipvs con los servicios y el endpoint para mantener todo actualizado.
Descubriendo los servicios de Kubernetes
te puede utiliza dos métodos para descubrir un servicio: DNS o Variable de Entorno.
Este es el método preferido para el descubrimiento de servicios. Aquí, el servidor DNS se está añadido al clúster Kubernetes que vigila la API de Kubernetes y crea registros DNS para cada nuevo servicio. Cuando el DNS está habilitado, a nivel de clúster todos los Pods podrán realizar la resolución de nombres de servicios.
Variables ambientales
En este método, kubelet añade variables de entorno a los Pods para cada servicio activo. Al usar este método, debe crearse el servicio deseado antes de crear los Pods que utilizarán ese servicio. De lo contrario, los Pods no Obtén las variables de entorno necesarias para el servicio deseado.
Cuando no se son necesarios el balanceo de carga ni la IP de un solo servicio, los usuarios pueden Crea un servicio headless especificando explícitamente "none" para el campo IP del clúster (.spec.clusterIP). Estos servicios headless no tienen IPs de Clúster asociadas, y la plataforma no les está proporcionado balanceo de carga ni proxy. El proxy de Kube también ignora estos servicios.
La configuración DNS de estos servicios depende de los selectores definidos en los servicios.
- Servicio headless con selectores. El controlador del endpoint Crea los registros del endpoint en la API, modificando el registro DNS para devolver un registro A que apunta a los Pods necesarios.
- Servicio headless sin selectores. El controlador del endpoint no Crea ningún registro endpoint sin tener los selectores configurados.
Resumen de los servicios K8s
Con esto, hemos cubierto todos los conceptos básicos de los servicios de Kubernetes. Ahora conocemos los servicios, incluyendo los diferentes tipos, el descubrimiento de servicios y los usos de proxy de servicio. Los servicios son una parte integral de Kubernetes y proporcionan medios para facilitar la comunicación entre pods, servicios externos y usuarios.
Guía Kubernetes
- ¿Qué es Kubernetes (K8s)? Un tutorial básico de Kubernetes
- Mejores prácticas de Kubernetes para mejorar la eficiencia del clúster
- Mejores Prácticas: Cómo Diseñar Aplicaciones para Kubernetes
- Kubernetes Pods: Una introducción
- Kubernetes ReplicaSets: Una breve introducción
- Despliegues de Kubernetes completamente explicados
- Cómo utilizar y gestionar los DaemonSets de Kubernetes
- Cómo funcionan los servicios de Kubernetes
- Uso de Kubernetes Port, TargetPort y NodePort
- Creación y uso de ConfigMaps en Kubernetes
- Introducción a Kubernetes Secrets
- Fundamentos de las redes de Kubernetes
- Explicación de Kubernetes Ingress
- Introducción a las Listas de Helm de Kubernetes
- ¿Qué están el patrón de operador Kubernetes?
- Despliegue de PostgreSQL como un StatefulSet en Kubernetes
- Definición de Recursos Personalizados (CRDs) de Kubernetes Explicada
- 3 Patrones Kubernetes para aplicaciones nativas en la nube
- Explicación de los recursos de cómputo de Kubernetes
- Kubernetes Security for DevOps Pipelines
- Uso de spinnaker con Kubernetes para entrega continua
- Multi-Clústeres Kubernetes: Cómo y por qué utilizarlos
- Monitorización de Kubernetes: Una guía completa
- Kubernetes vs Docker: Una comparación rápida
- Kubernetes vs Docker Swarm: Comparando herramientas de orquestación de contenedores
- Kubernetes vs OpenShift: ¿Cuál es la diferencia?
- Certificaciones Kubernetes: Cómo y por qué Obtén la certificación
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.