Este documento contiene una descripción general del descubrimiento de servicios basado en DNS de Kubernetes y cómo se puede usar con Kf.
Cuándo usar el descubrimiento de servicios de Kubernetes con Kf
Las aplicaciones que necesitan ubicar servicios de copia de seguridad de manera coherente pueden usar el descubrimiento de servicios de Kubernetes de forma coherente, sin importar dónde se implemente la aplicación. Por ejemplo, un equipo podría querer usar un URI común en su configuración, que siempre apunta a la puerta de enlace SMTP local para separar el código del entorno en el que se ejecutó.
El descubrimiento de servicios ayuda a los equipos de aplicaciones con las siguientes acciones:
- Reduce la cantidad de configuraciones por entorno.
- Separa las aplicaciones cliente y las de servidores.
- Permite que las aplicaciones puedan portarse a entornos nuevos.
Puedes usar el descubrimiento de servicios de Kubernetes en las siguientes situaciones:
- Las aplicaciones usan las configuraciones de DNS de su contenedor para resolver hosts.
- Las aplicaciones se implementan con sus servicios de copia de seguridad en el mismo clúster o espacio de nombres de Kubernetes.
- Los servicios de copia de seguridad tienen un servicio de Kubernetes asociado. Kf los crea para cada app.
- Las NetworkPolicies de Kubernetes permiten el tráfico entre una aplicación y el servicio de Kubernetes con el que debe comunicarse. Kf crea estas políticas en cada espacio de Kf.
No debes usar el descubrimiento de servicios de Kubernetes si ocurre lo siguiente:
- Las aplicaciones necesitan realizar una conmutación por error entre varios clústeres.
- Anulas el agente de resolución de DNS que usa la aplicación.
- Las aplicaciones necesitan tipos específicos de balanceo de cargas.
Cómo funciona el descubrimiento de servicios de Kubernetes
El descubrimiento de servicios de Kubernetes funciona mediante la modificación de la configuración de DNS de contenedores que se ejecutan en un nodo de Kubernetes. Cuando una aplicación busca un nombre de dominio no calificado, el agente de resolución de DNS local primero intentará resolver el nombre en el clúster local.
Los dominios que no tienen varias partes se resolverán de acuerdo con los nombres de los servicios de Kubernetes en el espacio de nombres del contenedor. Cada app de Kf crea un servicio de Kubernetes con el mismo nombre. Si dos apps de Kf, ping
y pong
, se implementaron en el mismo espacio de Kf, ping
podría usar la URL http://pong
para enviar tráfico al otro servicio.
Los dominios con un solo punto se resolverán según los servicios de Kubernetes del espacio de nombres de Kubernetes con el mismo nombre que la etiqueta después del punto. Por ejemplo, si hubiera una base de datos de PostgreSQL con un servicio customers
en el espacio de nombres database
, una aplicación de otro espacio de nombres podría resolverlo con postgres://customers.database
.
Cómo usar el descubrimiento de servicios con Kf
El descubrimiento de servicios basados en DNS de Kubernetes se puede usar en cualquier aplicación de Kf. Cada aplicación de Kf crea un servicio de Kubernetes con el mismo nombre y cada espacio de Kf crea un espacio de nombres de Kubernetes con el mismo nombre.
- Haz referencia a una app de Kf en el espacio actual con
protocol://app-name
. - Haz referencia a una app de Kf en un espacio diferente con
protocol://app-name.space-name
. - Haz referencia a una app de Kf en el espacio actual que escucha en un puerto personalizado con
protocol://app-name:port
. - Haz referencia a una app de Kf en un espacio diferente que escucha un puerto personalizado con
protocol://app-name.space-name:port
.
Recomendaciones
Las aplicaciones que serán el objetivo del descubrimiento de servicios basados en DNS deben tener verificaciones de estado frecuentes para garantizar que se agreguen y quiten con rapidez del grupo de hosts que aceptan conexiones.
Las aplicaciones que usan el descubrimiento de servicios basados en DNS no deberían almacenar en caché las direcciones IP de los servicios resueltos porque no se garantiza que sean estables.
Si existen servicios específicos del entorno fuera del clúster, se pueden resolver con DNS de Kubernetes si configuras servicios de Kubernetes de ExternalName. Estos servicios de Kubernetes proporcionan las mismas capacidades de resolución, pero muestran un registro CNAME para redireccionar las solicitudes a una autoridad externa.
Comparación con Eureka
Eureka es un balanceador de cargas de código abierto del cliente creado por Netflix. Por lo general, se usa como parte del agente del servicio de Spring Cloud Services. Eureka se creó para ser un balanceador de cargas regional y un mecanismo de descubrimiento de servicios para los servicios que se ejecutan en un entorno que provocó interrupciones frecuentes en las cargas de trabajo, lo que genera direcciones IP inestables.
Eureka está diseñada como un modelo de cliente/servidor. Los clientes se registran en el servidor para indicar con qué nombres quieren que se les asocie y enviar periódicamente señales de monitoreo al servidor. El servidor permite que todos los clientes conectados resuelvan los nombres.
En general, debes usar el DNS de Kubernetes en lugar de Eureka en Kubernetes por las siguientes razones:
- DNS funciona con todos los lenguajes de programación y todas las aplicaciones sin necesidad de bibliotecas.
- La verificación de estado existente de tu aplicación se reutilizará, lo que reducirá las combinaciones de errores.
- Kubernetes administra el servidor DNS, lo que te permite depender de menos dependencias.
- El DNS de Kubernetes respeta la misma política y las mismas restricciones de RBAC que el resto de Kubernetes.
A continuación, se detallan las ventajas de implementar un servidor de Eureka:
- Necesitas el descubrimiento de servicios en Kubernetes y aplicaciones basadas en VM.
- Necesitas balanceo de cargas basado en el cliente.
- Necesitas verificaciones de estado independientes.
¿Qué sigue?
- Obtén más información sobre el descubrimiento de servicios en GKE.
- Obtén más información sobre el Directorio de servicios, una oferta administrada similar a Eureka.