No Kubernetes, um Service é uma abstração que expõe uma aplicação em execução em um conjunto de pods como um serviço de rede. Ele fornece um nome DNS estável e balanceamento de carga para os pods. Este tópico explica o funcionamento dos Services do Kubernetes, destaca considerações importantes e oferece recomendações para escolher o tipo de Service adequado.
Conceitos principais
Tipos de Service
Se a versão do Cloud Controller Manager for v2.5.0 ou posterior, o uso de uma instância CLB para criar um Service no console torna-se um recurso restrito à lista de permissões, compatível apenas com pagamento conforme o uso. Para criar um Service do tipo CLB no console, envie uma solicitação na página Quota Center.
Nome | Descrição | Casos de uso | Faturamento |
Tipo padrão de Service. Um Service ClusterIP recebe um endereço IP virtual acessível apenas internamente no cluster. | Ideal para serviços que precisam se comunicar apenas dentro do mesmo cluster. Por exemplo, se um pod de aplicação frontend precisar acessar um banco de dados backend no mesmo cluster, exponha o banco de dados como um Service ClusterIP. | Gratuito. | |
Um Service NodePort abre uma porta específica em todos os nós do cluster. Acesse o Service fora do cluster via | Adequado para expor um serviço à internet durante desenvolvimento, testes ou para outras aplicações de baixo tráfego. Por exemplo, use um Service NodePort para implantar e depurar uma aplicação web em ambiente de teste. Diferentemente de um Service LoadBalancer, ele não fornece balanceamento de carga entre nós. O tráfego é enviado para apenas um nó, o que pode facilmente se tornar um gargalo de recursos. | Gratuito. Para habilitar o acesso à internet pública, associe um EIP ao nó. Para mais informações sobre faturamento de EIP, consulte Visão geral do faturamento. | |
Um Service LoadBalancer estende o tipo NodePort provisionando um balanceador de carga externo que distribui o tráfego entre os pods do cluster. O Service fornece automaticamente um endereço IP externo para acesso dos clientes. Suporta gerenciamento de tráfego tanto na Camada 4 (tcp/udp) quanto na Camada 7 (HTTP/https). | Indicado para aplicações em nuvem pública que exigem um ponto de entrada externo estável e fácil de gerenciar. Por exemplo, serviços públicos em ambiente de produção que precisam ser acessados pela internet e devem lidar com grandes volumes de tráfego externo com alta disponibilidade, como aplicações web ou serviços de API. Importante Para comunicação intracluster, utilize sempre um Service Em contrapartida, acessar um Service do tipo
Portanto, acessar um IP de LoadBalancer de dentro do cluster pode variar significativamente ou até falhar em diferentes ambientes e versões do Kubernetes. Cenário de exemplo: Flannel + IPVS + externalTrafficPolicy=Local | Para informações sobre taxas de instâncias de balanceamento de carga, consulte | |
Headless Service | Um Headless Service não possui endereço IP virtual. Uma consulta DNS pelo nome do serviço retorna uma lista de endereços IP dos pods em vez de um único IP de serviço. Isso permite descobrir e conectar-se diretamente a pods específicos. | Recomendado para aplicações que precisam se comunicar diretamente com pods de backend específicos, sem passar por um proxy ou balanceador de carga. Por exemplo, ao implantar uma aplicação com estado, como um serviço de banco de dados ClickHouse, utilize um Headless Service. Isso permite que os pods da aplicação acessem diretamente cada pod do ClickHouse, equilibrando leituras de dados ou realizando gravações direcionadas para melhorar a eficiência do processamento de dados. | Gratuito. |
ExternalName | Um Service ExternalName mapeia um nome de serviço interno para um nome de domínio externo. Isso permite que os pods dentro do cluster acessem o domínio externo usando o nome do serviço interno. | Mais indicado quando um cluster precisa acessar um serviço exposto sob um nome de domínio público. Por exemplo, se seus pods de aplicação precisarem acessar um domínio de banco de dados externo, use um Service ExternalName para mapear o domínio a um nome de serviço interno, permitindo acesso direto de dentro do cluster. | Gratuito. |
Funcionamento
ClusterIP
-
Criação e alocação
Ao criar um Service ClusterIP em um cluster ACK, o plano de controle atribui a ele um endereço IP virtual (ClusterIP) acessível apenas internamente no cluster.
-
Encaminhamento de tráfego
Ao acessar o ClusterIP, o kube-proxy intercepta o tráfego e o encaminha para um pod de backend usando um algoritmo de agendamento round-robin.
-
Descoberta de serviço
Quando um Service ClusterIP é criado, o CoreDNS registra um registro DNS para ele, permitindo que o serviço seja resolvido e acessado pelo nome. O formato é
service-name.namespace.svc.cluster.local:port, por exemplo,nginx.default.svc.cluster.local:80. -
Rótulos de pod e rastreamento de endpoints
Um Service usa um seletor de rótulos para identificar seus pods de backend.
O plano de controle monitora continuamente as alterações nos pods. Quando pods correspondentes ao seletor de rótulos do Service são adicionados, atualizados ou removidos, o plano de controle atualiza o endpoint.
NodePort
-
Criação e alocação
Ao criar um Service NodePort, o cluster abre uma porta (a NodePort) em seus nós para permitir acesso externo.
-
Encaminhamento de tráfego
O kube-proxy escuta na NodePort, escolhida automaticamente de um intervalo padrão de 30000-32767. Ele roteia solicitações externas para o ClusterIP, que então as encaminha para os pods de backend.
-
Acesso externo
Acesse o Service externamente usando o endereço IP do nó e a porta estática (NodePort) no formato
<NodeIP>:<NodePort>.
LoadBalancer
-
Criação e alocação
Ao criar um Service LoadBalancer, o plano de controle interage automaticamente com o serviço de balanceamento de carga para criar uma instância de balanceador de carga destinada a lidar com o tráfego. Para mais informações, consulte Usar uma instância existente do Server Load Balancer para expor uma aplicação e Expor uma aplicação com um Service LoadBalancer provisionado automaticamente.
-
Encaminhamento de tráfego
Quando o tráfego externo atinge o IP externo da instância do balanceador de carga, ele é roteado para a porta nos nós. Em seguida, o kube-proxy encaminha o tráfego para os pods de backend.
-
Configuração de rota e verificação de integridade
O balanceador de carga configura automaticamente portas de listener e realiza verificações de integridade para garantir que o tráfego seja roteado apenas para pods íntegros.
Política de tráfego externo
Os Services LoadBalancer e NodePort possuem uma configuração externalTrafficPolicy que controla como o tráfego externo é roteado. O comportamento dessa configuração difere entre clusters que usam os plugins de rede Terway-Eniip e Flannel.
Faça login no ACK console. Na página Clusters, clique em no nome do seu cluster. Na aba Basic Information, visualize o plugin de rede CNI que seu cluster utiliza.
Plugin de rede Flannel
|
Item |
Local |
Cluster |
|
Anexação de servidor backend |
Apenas nós que hospedam pods de backend são adicionados como servidores backend ao balanceador de carga. |
Todos os nós do cluster são adicionados como servidores backend ao balanceador de carga. |
|
Cota de balanceador de carga |
Consome menos recursos de cota do balanceador de carga. Para mais informações, consulte Limites de cota. |
Consome uma grande quantidade de recursos de cota do balanceador de carga, pois todos os nós do cluster são anexados como backends. Para mais informações, consulte Limites de cota. |
|
Acesso intracluster ao Service |
Apenas nós que hospedam pods de backend para o Service podem acessá-lo. |
Qualquer nó no cluster pode acessar o Service. |
|
Balanceamento de carga de pods |
O balanceamento de carga entre pods é desativado por padrão. Para ativar o balanceamento de carga, defina o agendador como WRR adicionando a anotação |
O balanceamento de carga entre pods é ativado por padrão. |
|
Preservação de IP de origem |
Suportado. |
Não suportado. |
|
Persistência de sessão |
Suportado. |
Não suportado. |
|
Casos de uso |
Aplicações que precisam preservar o endereço IP original do cliente, como para logs baseados no IP de origem. |
Quando alta disponibilidade de serviço é necessária e a preservação do IP de origem não é uma preocupação, como em grandes clusters de aplicações web. |
Plugin de rede Terway-Eniip
Item | Local | Cluster |
Anexação de servidor backend | Os pods são adicionados diretamente ao balanceador de carga como servidores backend. | |
Cota de balanceador de carga | Consome menos recursos de cota do balanceador de carga porque apenas os pods da aplicação são anexados. Para mais informações, consulte Limites de cota. | |
Acesso intracluster ao Service | Ao acessar o Service de dentro do cluster, o tráfego passa pelo kube-proxy no nó e está sujeito ao | Qualquer nó no cluster pode acessar o Service. |
Balanceamento de carga de pods | O balanceamento de carga entre pods é ativado por padrão. | |
Preservação de IP de origem | Suportado. | |
Persistência de sessão | Suportado. | |
Notas de uso
Antes de usar o recurso de balanceamento de carga do Service, revise as considerações relevantes. Para mais informações, consulte Considerações para configurar o balanceamento de carga do Service.