Pular para o conteúdo
Início » Rede Kubernetes: Importância e Funcionamento

Rede Kubernetes: Importância e Funcionamento

O entendimento da rede no Kubernetes é fundamental, pois é ela que possibilita que as aplicações rodando em um cluster do Kubernetes se comuniquem entre si e com serviços externos.

Dentro de um cluster Kubernetes, cada pod tem seu próprio endereço IP único, que é roteável dentro do cluster. Este endereço IP é normalmente atribuído pelo plugin de rede do Kubernetes, que é responsável pela configuração da rede do cluster. O plugin de rede é um componente-chave da arquitetura de rede do Kubernetes e existem várias opções disponíveis, como Calico, Flannel e Weave Net.

Além do plugin de rede, o Kubernetes inclui também uma série de outros componentes que estão envolvidos na rede, como o kube-proxy, que é responsável por balancear o tráfego de rede através de vários pods, e o objeto Service, que fornece um endereço IP estável e nome DNS para um conjunto de pods.

Entender como a rede funciona no Kubernetes é importante para qualquer pessoa que trabalhe com ele, pois pode ter um impacto significativo no desempenho e na confiabilidade das aplicações que rodam no cluster.

Ingress

No Kubernetes, um Ingress é um objeto API que proporciona uma maneira de configurar o acesso externo aos serviços em um cluster. Um recurso Ingress normalmente define um conjunto de regras que especificam como o tráfego de entrada deve ser roteado para o serviço apropriado, com base no host e caminho da solicitação de entrada. Ele expõe rotas HTTP e HTTPS de fora do cluster para serviços dentro do cluster.

Quando uma requisição chega ao cluster Kubernetes, ela atinge primeiro o controlador Ingress, responsável por gerenciar e rotear o tráfego de acordo com as regras definidas no recurso Ingress. O controlador Ingress usa um conjunto de regras definidas no recurso Ingress para determinar para onde o tráfego deve ser roteado. Para que o ingress funcione, você precisa usar um controlador Ingress, como Nginx, AWS.

O tráfego da internet entra no cluster do Kubernetes através do Ingress Controller, que pode ser uma implementação do NGINX ou de outro tipo.
O Ingress Controller, em seguida, roteia o tráfego para o Service A, Service B, ou Service C, dependendo do host e do caminho na solicitação HTTP.
Cada um dos serviços, por sua vez, encaminha o tráfego para o Pod correspondente. O Pod é onde seu aplicativo realmente está sendo executado.

Uma vez que o controlador Ingress determinou o serviço apropriado para rotear o tráfego, ele encaminha a solicitação para o ClusterIP do serviço, que é um endereço IP interno atribuído ao serviço pelo plugin de rede do Kubernetes. O serviço então usa suas próprias regras para determinar para qual(is) pod(s) encaminhar o tráfego.

O tráfego então chega ao pod alvo, onde é tratado pela aplicação rodando dentro do pod. A resposta da aplicação é então enviada de volta pelo mesmo caminho, através do serviço e do controlador Ingress, para o remetente original da solicitação.

É importante observar que o recurso Ingress é responsável apenas por rotear o tráfego para serviços dentro do cluster e não lida com qualquer autenticação ou segurança. Portanto, muitas vezes é usado em combinação com outras medidas de segurança, como a terminação de TLS ou Firewalls de Aplicação Web (WAFs), para fornecer um serviço seguro e confiável.

DNS no Kubernetes: Uma Peça Fundamental na Comunicação dos Pods

O Domain Name System (DNS) é utilizado para permitir que os serviços e pods se descubram e se comuniquem entre si. Ele é um serviço que é responsável por traduzir ou resolver um nome de serviço para seu endereço IP. Cada pod em um cluster Kubernetes recebe um nome de host único, que é derivado do nome do pod e do namespace no qual ele está sendo executado. Por padrão, cada hostname é resoluto dentro do namespace DNS do cluster.

Quando um serviço é criado no Kubernetes, ele recebe um nome DNS estável que é usado para acessar o serviço a partir de outros pods e serviços dentro do cluster.

O nome DNS geralmente tem o formato servicename.namespace.svc.cluster.local, onde servicename é o nome do serviço, namespace é o namespace do Kubernetes no qual o serviço está sendo executado e cluster.local é o domínio DNS padrão do cluster.

Quando um pod quer se comunicar com um serviço, ele pode simplesmente usar o nome DNS do serviço para se conectar a ele. O serviço DNS do Kubernetes resolverá o nome DNS para o ClusterIP correspondente atribuído ao serviço e roteará o tráfego para o pod apropriado.

Neste exemplo, temos dois pods, Pod A e Pod B, cada um com seu próprio IP. Se Pod A quiser se comunicar com Pod B, ele precisaria saber o IP do Pod B. No entanto, em um ambiente Kubernetes, os IPs dos pods podem mudar frequentemente, por isso é impraticável codificar os IPs dos pods diretamente no código do aplicativo.
Em vez disso, o Pod A pode usar o serviço kube-dns para resolver o nome do Pod B em seu IP. O kube-dns mantém um registro de todos os serviços e seus IPs correspondentes, e pode resolver esses nomes em IPs conforme necessário.
Por exemplo, se o Pod B tiver um serviço associado chamado “pod-b-service”, então o Pod A pode simplesmente se conectar a “pod-b-service.default.svc.cluster.local”, e o kube-dns resolverá esse nome no IP do serviço, que por sua vez encaminhará o tráfego para o Pod B.
Isso permite que os pods se comuniquem entre si usando nomes estáveis, mesmo que os IPs dos pods possam mudar ao longo do tempo.

Além de resolver nomes DNS para serviços, o Kubernetes também suporta configurações DNS personalizadas, que permitem especificar servidores DNS adicionais ou domínios de pesquisa que devem ser usados ao resolver consultas DNS. Isso pode ser útil se você precisar resolver nomes DNS fora do cluster Kubernetes, como para acessar serviços externos ou APIs.

Em suma, o DNS é um componente crítico da rede no Kubernetes, pois permite que os serviços e pods descubram e se comuniquem entre si, sendo uma parte essencial da infraestrutura para a implementação de aplicações confiáveis e escaláveis em um cluster Kubernetes.

CoreDNS

CoreDNS é uma implementação popular de servidor DNS usada no Kubernetes para descoberta de serviço e resolução DNS. Ele é o servidor DNS padrão para o Kubernetes e garante que os pods e serviços tenham um Nome de Domínio Totalmente Qualificado (FQDN – Fully Qualified Domain Name). CoreDNS é um servidor DNS flexível e extensível projetado para ser facilmente integrado em clusters Kubernetes e pode ser personalizado para suportar uma ampla gama de casos de uso. Sem CoreDNS, a comunicação do cluster cessaria de funcionar.

No Kubernetes, o CoreDNS é normalmente implantado como um pod no cluster e é responsável por resolver consultas DNS para serviços e pods. O CoreDNS usa a API do Kubernetes para obter informações sobre serviços e pods e gera automaticamente registros DNS para cada um deles.

Pod A e Pod B são os pods no cluster que precisam se comunicar entre si.
O CoreDNS é o servidor DNS que está sendo executado como um pod no cluster.
O Kubernetes API Server contém informações sobre todos os serviços e pods no cluster.

Um dos benefícios de usar o CoreDNS no Kubernetes é que ele é altamente configurável e pode ser estendido para suportar plugins personalizados e provedores de DNS. Por exemplo, você pode usar plugins do CoreDNS para adicionar suporte para zonas DNS personalizadas ou para integrar com provedores de DNS externos.

Outra vantagem do CoreDNS é que ele oferece melhor desempenho e escalabilidade do que o servidor DNS padrão anterior no Kubernetes, o kube-dns. CoreDNS é escrito em Go e foi projetado para ser leve e eficiente, o que o torna bem adaptado para lidar com grandes volumes de consultas DNS em ambientes Kubernetes de alto tráfego.

Para usar o CoreDNS em seu cluster Kubernetes, você pode implantá-lo como um pod usando um arquivo de manifesto Kubernetes ou um gráfico Helm. Uma vez implantado, você pode configurar o servidor CoreDNS para atender às suas necessidades específicas, como adicionar provedores de DNS personalizados, definir zonas DNS personalizadas ou integrar com outros componentes do Kubernetes como Ingress ou ExternalDNS.

Em resumo, o CoreDNS é uma implementação poderosa e flexível do servidor DNS, adequada para uso em clusters Kubernetes e fornece uma base sólida para a descoberta de serviço e resolução DNS em aplicações modernas nativas da nuvem.

Probes no Kubernetes: Monitorando a Saúde dos Seus Containers

No Kubernetes, as probes são usadas para determinar a saúde de um container que está rodando em um pod. As probes são uma parte crítica das capacidades de auto-cura e auto-escala do Kubernetes, pois fornecem uma maneira para o cluster detectar automaticamente e se recuperar de containers não saudáveis. As probes são usadas para detectar o estado de um container.

Existem três tipos de probes no Kubernetes:

O Pod Kubernetes é o contêiner no qual seus aplicativos estão sendo executados.
Liveness Probe é uma checagem que o Kubernetes faz para verificar se seu aplicativo ainda está funcionando corretamente. Se o Liveness Probe falhar, o Kubernetes irá reiniciar o seu Pod.
Readiness Probe é uma checagem que o Kubernetes faz para saber se seu aplicativo está pronto para aceitar tráfego. Se o Readiness Probe falhar, o Kubernetes não enviará tráfego para o seu Pod até que esteja pronto.
Startup Probe é uma checagem que o Kubernetes faz para saber se seu aplicativo foi iniciado corretamente. Se o Startup Probe falhar, o Kubernetes irá terminar o seu Pod.
Note que a exata configuração de Probes irá depender da necessidade do seu aplicativo.

Probe de Vida (Liveness Probe)

Este tipo de probe é usado para determinar se um container ainda está rodando e está saudável. A probe de vida envia solicitações periódicas ao container, e se o container não responder ou responder com um erro, a probe marcará o container como não saudável e acionará um reinício.

Probe de Prontidão (Readiness Probe)

Este tipo de probe é usado para determinar se um container está pronto para começar a receber tráfego. A probe de prontidão envia solicitações periódicas ao container, e se o container responder com um código de sucesso, ele será marcado como pronto para receber tráfego. Se o container não responder ou responder com um erro, ele será marcado como não pronto e não receberá nenhum tráfego até que esteja pronto novamente.

Probe de Inicialização (Startup Probe)

Este tipo de probe é usado para determinar se um container está no processo de inicialização. A probe de inicialização envia solicitações periódicas ao container, e se o container responder com um código de sucesso, ele será marcado como pronto para receber tráfego. Se o container não responder ou responder com um erro, a probe de inicialização continuará enviando solicitações até que o container esteja pronto, ou até que um tempo limite configurável seja atingido.

As probes no Kubernetes são definidas na seção spec do pod, usando configuração YAML. Cada probe é definida com um conjunto de parâmetros, como o tipo de probe, o endpoint a ser sondado, o tempo de espera da probe, o período da probe e os limiares de sucesso e falha.

Em resumo, as probes são um recurso poderoso no Kubernetes que permite que os containers sejam automaticamente monitorados e reiniciados no caso de falhas ou falta de resposta, o que ajuda a melhorar a confiabilidade e disponibilidade das aplicações rodando em clusters Kubernetes.

Netfilter no Kubernetes

No Kubernetes, o Netfilter é usado para implementar políticas de rede, que são usadas para controlar o fluxo de tráfego de rede entre os pods em um cluster. Políticas de rede são objetos do Kubernetes que definem regras de como o tráfego é permitido fluir entre os pods, e eles usam regras do Netfilter para aplicar essas políticas.

Quando uma política de rede é aplicada a um cluster Kubernetes, o servidor de API do Kubernetes se comunica com o plugin de rede, que é responsável por configurar as regras de rede na infraestrutura de rede subjacente. O plugin de rede, por sua vez, gera regras do Netfilter para impor a política de rede.

As regras do Netfilter geradas pelo plugin de rede são baseadas nos seletores especificados na política de rede. Os seletores são usados para identificar quais pods devem ser afetados pela política, e eles podem ser baseados em uma ampla gama de critérios, como os rótulos do pod, namespace ou endereço IP. O plugin de rede gera regras do Netfilter que correspondem aos seletores especificados e, em seguida, aplica a ação especificada na política aos pacotes correspondentes.

Em resumo, o Netfilter é um componente crítico da implementação da política de rede no Kubernetes, pois permite um controle granular sobre o fluxo de tráfego de rede entre os pods em um cluster e fornece um poderoso mecanismo para aplicar políticas de segurança e controle de acesso.

IPTables

IPTables é uma ferramenta de firewall baseada em Linux que permite aos usuários configurar e gerenciar regras de filtragem de rede. No Kubernetes, o IPTables é usado para implementar políticas de rede, que controlam o fluxo de tráfego entre pods e serviços.

Quando uma política de rede é criada no Kubernetes, o componente kube-proxy cria regras do IPTables para aplicar a política. Essas regras são aplicadas ao tráfego de rede à medida que ele passa pelo nó onde o pod ou serviço está localizado.

As regras do IPTables geradas pelo Kubernetes são baseadas nos seletores e regras da política de rede. Seletores identificam a quais pods a política se aplica, enquanto as regras definem que tráfego deve ser permitido ou negado. Por exemplo, uma política de rede pode ser criada que só permite tráfego para portas específicas em pods com um determinado rótulo.

As regras do IPTables geradas pelo Kubernetes são inseridas nas cadeias do IPTables do kernel, que determinam como o tráfego de rede é processado. Essas cadeias são avaliadas em uma ordem específica, com a primeira regra correspondente determinando a ação tomada no pacote.

O Kubernetes também usa o IPTables para implementar os Serviços do Kubernetes, que fornecem um endereço IP estável e um nome DNS para acessar um conjunto de pods. Quando um Serviço é criado no Kubernetes, o kube-proxy cria uma regra do IPTables para encaminhar o tráfego para o pod apropriado com base no seletor do Serviço.

Em geral, o IPTables é uma ferramenta importante para implementar políticas de rede e Serviços no Kubernetes, pois permite um controle fino sobre o fluxo de tráfego de rede e fornece um mecanismo confiável e escalável para balanceamento de carga e descoberta de serviço.

IPVS

IPVS (IP Virtual Server) é um módulo do kernel Linux que fornece capacidades de balanceamento de carga de rede. No Kubernetes, o IPVS é usado como uma alternativa ao kube-proxy e ao IPTables para implementar Serviços.

Quando um Serviço é criado no Kubernetes e o tipo de Serviço é definido como “LoadBalancer”, o IPVS é usado para criar um endereço IP virtual (VIP) para o Serviço. O VIP é usado como o endereço de destino para o tráfego do cliente e está associado a um conjunto de pods que fornecem o serviço real.

O IPVS funciona interceptando o tráfego de entrada para o VIP e distribuindo-o entre os pods disponíveis usando um algoritmo de balanceamento de carga. Existem vários algoritmos de balanceamento de carga disponíveis no IPVS, incluindo round-robin, least-connection e weighted least-connection.

O IPVS também fornece verificações de saúde para garantir que o tráfego só é enviado para pods saudáveis. Quando um pod falha em uma verificação de saúde, o IPVS o remove da lista de pods disponíveis e redistribui o tráfego entre os pods saudáveis restantes.

O IPVS tem várias vantagens sobre o kube-proxy e o IPTables, incluindo melhor escalabilidade e desempenho, e algoritmos de balanceamento de carga mais flexíveis. O IPVS pode lidar com um grande número de conexões e é otimizado para alto rendimento e baixa latência. Ele também suporta recursos de balanceamento de carga mais avançados, como persistência de sessão e drenagem de conexão.

No entanto, o IPVS requer configuração e configuração adicionais em comparação com o kube-proxy e o IPTables, e pode não ser compatível com todos os ambientes de rede. O IPVS também requer suporte de kernel e pode não estar disponível em todas as distribuições Linux.

Proxies

Um proxy é uma aplicação de servidor que atua como intermediária entre um cliente solicitando um recurso e o servidor fornecendo esse recurso.

Kubectl Proxy

O Kubectl Proxy é uma ferramenta de linha de comando que permite ao usuário criar um túnel seguro entre sua máquina local e um servidor de API do Kubernetes. Isso permite que o usuário acesse o servidor de API do Kubernetes sem a necessidade de acesso direto à rede ou configurações de autenticação complexas. Kubectl Proxy é usado para vários propósitos, como acessar o Painel do Kubernetes ou usar comandos kubectl contra um cluster remoto.

Kube-Proxy

Por outro lado, Kube-Proxy é um componente que é executado em cada nó em um cluster Kubernetes e é responsável por implementar os Serviços do Kubernetes. Kube-Proxy escuta por mudanças nos Serviços e, em seguida, atualiza as regras locais do IPTables ou IPVS de acordo. Isso garante que o tráfego seja corretamente direcionado para os pods apropriados no cluster.

Envoy

Além do Kube-Proxy, outro proxy popular usado no Kubernetes é o Envoy. O Envoy é um proxy de alto desempenho que fornece capacidades avançadas de gerenciamento de tráfego e balanceamento de carga. O Envoy pode ser usado como uma substituição para o Kube-Proxy para implementar Serviços Kubernetes ou pode ser usado como um componente independente para fornecer recursos avançados de gerenciamento de tráfego.

Interface de Rede de Contêiner (CNI)

A Interface de Rede de Contêiner (CNI) é uma especificação e um conjunto de ferramentas para configurar a rede em ambientes conteinerizados, como os fornecidos pelo Kubernetes. O objetivo do CNI é fornecer um padrão comum para plugins de rede para que os runtimes de contêiner e os sistemas de orquestração possam funcionar com qualquer solução de rede que suporte a API CNI.

No Kubernetes, o CNI é usado pelo kubelet para configurar as interfaces de rede dos pods. Quando um pod é criado, o kubelet invoca o plugin CNI para configurar a rede do pod. O plugin CNI então cria e configura as interfaces de rede para o pod, configura as regras de roteamento necessárias e adiciona o endereço IP do pod ao namespace de rede apropriado.