Voltar ao blog

Como solucionar problemas e inspecionar a rede do Kubernetes

Como solucionar problemas e inspecionar a rede do Kubernetes

Kubernetes é uma ferramenta de código aberto crucial na orquestração de contêineres. O Kubernetes ajuda a orquestrar e gerenciar clusters em escala em vários ambientes de nuvem ou até mesmo em servidores locais (on-premise). Um cluster é um conjunto de hosts destinados a executar aplicativos e serviços em contêineres. Um cluster precisa de no mínimo dois nós para funcionar – um nó mestre (master) e um nó de trabalho (worker). Você pode dimensionar sua infraestrutura do Kubernetes adicionando mais nós de trabalho. Um nó mestre e seus nós de trabalho devem ser capazes de se comunicar por meio de uma rede para que a infraestrutura funcione. Para uma visão geral dos recursos mais importantes do Kubernetes, siga nosso tutorial sobre Conhecendo o Kubernetes.

Neste tutorial, mostraremos a você várias ferramentas e técnicas para ajudar na inspeção e solução de problemas de rede do Kubernetes.

Pré-requisitos

  • Você também deve ter kubectl instalado localmente. Dependendo do seu ambiente local, siga os documentos oficiais sobre instalação de ferramentas do Kubernetes. O kubectl deve estar configurado para se conectar ao seu cluster. Explicaremos isso mais detalhadamente na seção abaixo.

Executaremos vários comandos localmente e no nó do Kubernetes. Vamos começar!

Configurando o kubectl Local para se Conectar a um Cluster Kubernetes Remoto

Vamos começar instalando o kubectl. Nosso ambiente local está executando o Ubuntu, siga este link se estiver executando um ambiente local diferente. Para instalar as ferramentas do kubectl em um ambiente local Ubuntu/Debian com o gerenciador de pacotes apt, execute os seguintes comandos para atualizar o repositório apt e instalar os pacotes necessários:

Em seguida, execute o seguinte comando para baixar a chave de assinatura pública do Google Cloud:

Em seguida, adicione o repositório apt do Kubernetes:

Depois disso, atualize o índice apt e instale o kubectl com o seguinte comando:

Em seguida, verifique se o kubectl está instalado verificando a versão com o seguinte comando:

Aqui está a saída se você acabou de instalar o kubectl localmente:

kubectl version

Na captura de tela acima, o kubectl está tentando se conectar ao cluster Kubernetes local. No entanto, está falhando porque ainda não temos um cluster Kubernetes em execução em nossa máquina local.

Para se conectar ao cluster Kubernetes remoto, primeiro você baixará as credenciais do Kubernetes do cluster remoto. Aqui está um comando para copiar as credenciais do nó mestre:

Substitua as partes destacadas pelo seu nome de usuário ssh e o IP público do nó mestre. Assim que o download das credenciais for concluído, copie as credenciais para o seu diretório home:

Isso é tudo. Seu kubectl local deve ser capaz de se conectar e emitir comandos em seu cluster Kubernetes remoto. Para confirmar que seu kubectl local está conectado ao cluster remoto, verifique com o comando version novamente:

Aqui está a saída, mostrando uma conexão bem-sucedida:

kubectl version json

Opcionalmente, você pode executar o get nodes comando desta forma:

kubectl get nodes

Obtendo o IP de Cluster de um Pod

Você pode obter o IP de Cluster de um Pod executando o kubectl get pod comando em sua máquina local. Para listar mais informações, como o nó que hospeda o pod e o IP de cluster do pod, adicione a flag -o wide ao comando:

Aqui está uma saída do nosso cluster Kubernetes. No tutorial de pré-requisito, havíamos feito uma implantação do servidor web Nginx, como você pode ver:

kubectl get pod -o wide

A coluna IP mostra o endereço IP interno de pods individuais. Se o pod que você está procurando não aparecer na lista, você pode estar em um namespace diferente. Você pode emitir o seguinte comando para listar pods em todos os namespaces:

Obtendo o endereço IP de um Service

Você também pode obter o endereço IP de um Service em seu cluster. Ao adicionar a flag --all-namespaces , você obtém todos os serviços em execução no cluster:

A saída do comando acima é a seguinte. O IP do Service está na coluna cluster-ip :

kubectl get svc

Obtendo e Acessando Namespaces de Rede de Pods

Cada pod do Kubernetes tem um namespace de rede atribuído a ele. Namespaces de rede, também chamados de netns, são bibliotecas de rede nativas no Linux que fornecem isolamento entre dispositivos de rede.

Para verificar a resolução de DNS ou a conectividade de rede geral, você pode executar comandos dentro do namespace de rede de um pod. Para conseguir isso, você começa procurando o ID do processo de um dos containers em um pod. Você pode fazer isso facilmente no Docker usando comandos específicos do Docker. O primeiro comando lista os containers em execução em um nó. Faça login em um de seus nós de trabalho e execute o seguinte comando:

docker ps

Na saída, estamos interessados na coluna de ID do container ou Names. Observe o container Nginx que implantamos no tutorial de pré-requisito Como Instalar e Usar o Kubernetes no Ubuntu 20.04.

Em seguida, copie o ID ou Nome do container, pois o usaremos no próximo comando para encontrar o ID do processo:

Substitua a parte destacada pelo seu valor copiado do comando anterior. Abaixo está a saída que obtivemos, que é o ID do processo:

docker inspect

Agora que temos um ID de processo, podemos usá-lo para executar o comando nsenter dentro do namespace de rede do processo:

Substitua a parte destacada pelo ID do processo que você obteve no comando anterior. Então, no lugar de ip addr, você pode colocar qualquer comando que gostaria de executar dentro do namespace de rede do pod. Você também pode executá-lo com sudo caso receba um erro de permissão negada.

O comando nsenter permite que você execute uma gama mais ampla de comandos disponíveis em um nó, em oposição ao uso de docker exec que limita você apenas aos comandos instalados dentro do container.

Recuperando a Interface Ethernet Virtual de um Pod

Um namespace de rede em um pod se comunica com o netns raiz do nó por meio de um pipe ethernet virtual. Do lado do nó, esse pipe aparece como um dispositivo cujo nome começa com veth e termina em um identificador exclusivo, como veth742f721 ou veth90. Enquanto dentro do pod, o pipe se identifica como eth0.

Você pode querer saber qual dispositivo veth está emparelhado com qual pod. Você pode começar listando todos os dispositivos de rede no nó e, em seguida, listar todos os dispositivos na rede do pod. Para identificar qual dispositivo veth está emparelhado com um pod específico, você pode correlacionar os números dos dispositivos entre as duas listagens.

Use o comando nsenter para executar o comando ip addr no namespace de rede do pod. Você precisará saber um dos IDs de processo do container. Para isso, consulte a seção anterior sobre Obtendo e Acessando Namespaces de Rede de Pods.

Em seguida, execute o seguinte comando no terminal do seu nó de trabalho, substituindo a parte destacada adequadamente:

O comando exibe uma lista das interfaces do pod:

nsenter ip addr

Observe os if7 caracteres após o eth0@ no resultado acima. Isso significa que o eth0 do pod está emparelhado com a 7ª interface do nó. Em seguida, liste as interfaces dentro do namespace padrão do nó executando o ip addr comando:

O comando lista as interfaces conforme mostrado abaixo:

Kubernetes Networking ip addr

No resultado, a 7ª interface é veth254b50e6@if3  – o pipe ethernet virtual emparelhado com o pod que estamos testando.

Revisando as Regras do Iptables

Você pode executar o comando iptables-save para listar todas as iptables em um nó:

O resultado do comando pode ser longo, então você pode salvá-lo em um arquivo para inspeção posterior:

Você também pode usar less para paginar o resultado:

Como estamos interessados apenas nas regras NAT do Kubernetes, adicione a flag -L para especificar o alvo correto:

Aqui está o resultado:

Kubernetes Networking iptables

Inspecionando Detalhes do IPVS

O kube-proxy é um proxy de rede executado em cada nó do seu cluster Kubernetes. Ele pode ser usado para configurar o IPVS para lidar com a tradução de IPs de Serviços virtuais para IPs de pods. Para listar a tabela de tradução de IPs, você pode usar o comando ipvsadm . Primeiro, você precisa instalá-lo no seu nó:

Agora você pode executar o seguinte comando:

Para mostrar um único IP de Serviço, adicione a flag -t , especificando o endereço IP desejado:

Consultando o DNS do Cluster

Existem algumas maneiras que você pode seguir para depurar a resolução de DNS do seu cluster. A documentação oficial descreve uma maneira como implantar um container de depuração com todas as ferramentas necessárias e, em seguida, usar kubectl para executar nslookup.

Opcionalmente, você pode consultar o DNS usando os comandos dig e nsenter a partir do próprio nó. Primeiro, você terá que instalar o dig no seu nó master. Para o Ubuntu, instale com o apt comando:

Kubernetes Networking install dnsutils

Volte para o terminal na sua máquina local e execute o comando abaixo para encontrar o IP do cluster do kube-dns serviço:

O comando exibe:

get kube dns service

A coluna cluster-ip contém o valor que precisamos. Agora podemos usar o nsenter para executar o dig no namespace do container. No entanto, você precisará do ID do processo do container para acessar seu namespace. Veja a seção Getting and Accessing Pod Network Namespaces acima para orientação.

Assim que tiver o container-id, execute the following command on your master node:

O comando dig recebe o IP do serviço de DNS do cluster ( @10.96.0.10) e busca o nome de domínio completo do Serviço service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

Para obter informações sobre como encontrar nomes de serviços e namespaces, dê uma olhada na seção Getting the IP address of a Service.

Revisando o Rastreamento de Conexão Conntrack

Você pode usar o comando conntrack para visualizar todas as conexões que estão sendo rastreadas no momento:

Ele exibe algo semelhante à captura de tela:

Kubernetes Networking conntrac -l

Adicione a flag -E para monitorar continuamente as conexões de entrada:

Para visualizar as conexões rastreadas para um endereço de destino específico, adicione a flag -d e especifique o endereço de destino:

Às vezes, a tabela de rastreamento de conexões fica cheia, resultando no descarte de novas conexões. Isso causa problemas que impedem seus nós de estabelecer conexões confiáveis. Se isso acontecer, você verá mensagens como a seguinte nos logs do seu sistema, no local /var/log/syslog:

Existe uma configuração de sistema para o número máximo de conexões a serem rastreadas. Use o seguinte comando para listar seu valor atual:

A saída é:

conntrack max

Você pode modificar o valor usando a -w flag:

Você pode querer modificar seu /etc/sysctl.conf para tornar o valor permanente e garantir que ele persista após as reinicializações. Abra o arquivo com o nano:

Em seguida, modifique o valor se a linha existir ou adicione a linha no final do arquivo, especificando o novo valor:

Conclusão

Ao implantar vários serviços em contêineres, você se beneficiará muito do Kubernetes, pois ele oferece um ponto de gerenciamento central. Para garantir que haja conectividade entre os vários pods do Kubernetes, mostramos alguns comandos de inspeção de rede que você pode usar para solucionar quaisquer problemas em sua infraestrutura do Kubernetes.

Para saber mais sobre o Kubernetes, suas vantagens, configuração e implantação de aplicativos no Kubernetes, dê uma olhada em nossos diversos tutoriais de Kubernetes.

Boa computação!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev é um designer criativo na CloudSigma, focado na construção de uma identidade empresarial consistente por meio de canais de marketing tradicionais e inovadores. Ele é hábil em combinar a visão artística com o marketing estratégico para criar narrativas de marca impactantes.

Comentários

Nenhum comentário ainda. Seja o primeiro.