Descoberta de serviço

Este documento é uma visão geral da descoberta de serviços baseada no DNS do Kubernetes e como ela pode ser usado com o Kf.

Quando usar a descoberta de serviços do Kubernetes com o Kf

A descoberta de serviços do Kubernetes pode ser usada por aplicativos que precisam localizar serviços de backup de forma consistente, independentemente de onde o aplicativo esteja implantado. Por exemplo, uma equipe pode querer usar um URI comum na configuração que sempre aponta para o gateway SMTP local para separar o código do ambiente em que foi executado.

A descoberta de serviços ajuda as equipes de aplicativos ao:

  • Reduzir a quantidade de configuração por ambiente.
  • Desassociando aplicativos de cliente e servidor.
  • Permitir que os aplicativos sejam portáteis a novos ambientes.

Use a descoberta de serviços do Kubernetes quando:

  • Os aplicativos usarem as configurações de DNS do contêiner para resolver hosts.
  • Os aplicativos forem implantados com seus serviços de apoio no mesmo cluster ou namespace do Kubernetes.
  • Os serviços de apoio tiverem um serviço do Kubernetes associado. O Kafka cria esses itens para cada aplicativo.
  • As NetworkPolicies do Kubernetes permitem o tráfego entre um aplicativo e o serviço do Kubernetes com que ele precisa se comunicar. O Kafka cria essas políticas em cada espaço do Kf.

Não use a descoberta de serviços do Kubernetes se:

  • Os aplicativos precisam realizar o failover entre vários clusters.
  • Você substitui o resolvedor de DNS usado pelo seu aplicativo.
  • Os aplicativos precisam de tipos específicos de balanceamento de carga.

Como funciona a descoberta de serviços do Kubernetes

A descoberta de serviços do Kubernetes funciona modificando a configuração de DNS dos contêineres em execução em um nó do Kubernetes. Quando um aplicativo procura um nome de domínio não qualificado, o resolvedor de DNS local tenta primeiro resolver o nome no cluster local.

Os domínios sem várias partes serão resolvidos com relação aos nomes dos serviços do Kubernetes no namespace do contêiner. Cada aplicativo do Kf cria um serviço do Kubernetes com o mesmo nome. Se dois aplicativos do Kf ping e pong foram implantados no mesmo espaço do Kf, ping poderia usar o URL http://pong para enviar tráfego para o outro serviço.

Os domínios com um único ponto serão resolvidos nos serviços do Kubernetes no namespace do Kubernetes com o mesmo nome do rótulo após o ponto. Por exemplo, se houvesse um banco de dados PostgreSQL com um serviço customers no namespace database, um aplicativo em outro namespace poderia resolver a situação usando postgres://customers.database.

Como usar a descoberta de serviços com o Kf

A descoberta de serviços baseada no DNS do Kubernetes pode ser usada em qualquer aplicativo Kf. Cada aplicativo Kf cria um serviço do Kubernetes com o mesmo nome, e cada espaço Kf cria um namespace do Kubernetes com o mesmo nome.

  • Consulte um app Kf no espaço atual usando protocol://app-name.
  • Consulte um app Kf em um espaço diferente usando protocol://app-name.space-name.
  • Consulte um app Kf no espaço atual que detecta uma porta personalizada usando protocol://app-name:port.
  • Consulte um app Kf em um espaço diferente que detecta uma porta personalizada usando protocol://app-name.space-name:port.

Práticas recomendadas

Os aplicativos que serão o alvo da descoberta de serviços baseada em DNS precisam ter verificações de integridade frequentes para garantir que sejam rapidamente adicionados e removidos do pool de hosts que aceitam conexões.

Os aplicativos que usam a descoberta de serviços baseada em DNS não podem armazenar em cache os endereços IP dos serviços resolvidos porque eles não têm garantia de serem estáveis.

Se houver serviços específicos do ambiente fora do cluster, eles poderão ser resolvidos usando o DNS do Kubernetes se você configurar os serviços ExternalName Kubernetes. Esses serviços do Kubernetes oferecem os mesmos recursos de resolução, mas retornam um registro CNAME para redirecionar as solicitações para uma autoridade externa.

Comparação com o Eureka

Eureka é um balanceador de carga de cliente de código aberto criado pela Netflix. Ele é comumente usado como parte do agente de serviços do Spring Cloud Services. O Eureka foi criado para ser um balanceador de carga regional e um mecanismo de descoberta de serviços para serviços executados em um ambiente que causou interrupções frequentes para cargas de trabalho, levando a endereços IP instáveis.

O Eureka foi projetado como modelo de cliente/servidor. Os clientes se cadastram com o servidor indicando com quais nomes querem ser associados e enviam periodicamente os sinais de funcionamento do servidor. O servidor permite que todos os clientes conectados resolvam nomes.

Em geral, use o DNS do Kubernetes em vez do Eureka no Kubernetes pelos seguintes motivos:

  • O DNS funciona com todas as linguagens de programação e aplicativos, sem a necessidade de bibliotecas.
  • A verificação de integridade atual do seu aplicativo será reutilizada, reduzindo as combinações de erros.
  • O Kubernetes gerencia o servidor DNS, o que permite confiar em menos dependências.
  • O DNS do Kubernetes respeita as mesmas restrições de política e RBAC, assim como o restante do Kubernetes.

Há alguns momentos em que a implantação de um servidor Eureka seria vantajosa:

  • Quando precisar da descoberta de serviços no Kubernetes e em aplicativos baseados em VM.
  • Quando precisar de balanceamento de carga baseado em cliente.
  • Quando precisar de verificações de integridade independentes.

A seguir