Partilhar via


Solucionar problemas de conexão com um aplicativo hospedado em um cluster do AKS

Nos ambientes de nuvem dinâmicos atuais, garantir a conectividade perfeita com aplicativos hospedados em clusters do AKS (Serviço de Kubernetes do Azure) é crucial para manter o desempenho e a experiência do usuário ideais. Este artigo aborda como solucionar problemas de conectividade causados por vários fatores, incluindo problemas do lado do aplicativo, políticas de rede, regras de NSG (grupo de segurança de rede) ou outros.

Observação

Para solucionar problemas comuns ao tentar se conectar ao servidor de API do AKS, consulte Solução de problemas básicos de problemas de conexão de cluster com o servidor de API.

Pré-requisitos

Fatores a considerar

Esta seção aborda as etapas de solução de problemas a serem seguidas se você estiver tendo problemas ao tentar se conectar ao aplicativo hospedado em um cluster do AKS.

Em qualquer cenário de rede, os administradores devem considerar os seguintes fatores importantes ao solucionar problemas:

  • Qual é a origem e o destino de uma solicitação?

  • Quais são os saltos entre a origem e o destino?

  • Qual é o fluxo de solicitação-resposta?

  • Quais saltos têm camadas de segurança extras na parte superior, como os seguintes itens:

    • Firewall
    • NSG (grupo de segurança de rede)
    • Política de rede

Ao verificar cada componente, obtenha e analise os códigos de resposta HTTP. Esses códigos são úteis para identificar a natureza do problema e são especialmente úteis em cenários em que o aplicativo responde a solicitações HTTP.

Se outras etapas de solução de problemas não fornecerem nenhum resultado conclusivo, faça capturas de pacotes do cliente e do servidor. As capturas de pacotes também são úteis quando o tráfego não HTTP está envolvido entre o cliente e o servidor. Para obter mais informações sobre como coletar capturas de pacotes para o ambiente do AKS, consulte os seguintes artigos no guia de coleta de dados:

Saber como obter os códigos de resposta HTTP e fazer capturas de pacotes facilita a solução de problemas de conectividade de rede.

Fluxo de rede básico para aplicativos no AKS

Em geral, quando os aplicativos são expostos usando o tipo de serviço Azure Load Balancer, o fluxo de solicitação para acessá-los é o seguinte:

Nome >> DNS do cliente>>, endereço IP do balanceador de carga do AKS, >> nós >> do AKS, pods

Existem outras situações possíveis em que componentes extras podem estar envolvidos. Por exemplo:

  • A entrada NGINX gerenciada com o recurso complementar de roteamento de aplicativos está habilitada.
  • O gateway de aplicativo é usado por meio do AGIC (Controlador de Entrada do Gateway de Aplicativo ) em vez do Azure Load Balancer.
  • O Azure Front Door e o Gerenciamento de API podem ser usados sobre o balanceador de carga.
  • O processo usa um balanceador de carga interno.
  • A conexão pode não terminar no pod e na URL solicitada. Isso pode depender se o pod pode se conectar a outra entidade, como um banco de dados ou qualquer outro serviço no mesmo cluster.

É importante entender o fluxo de solicitação do aplicativo.

Um fluxo de solicitação básico para aplicativos em um cluster do AKS seria semelhante ao fluxo mostrado no diagrama a seguir.

Diagrama de um fluxo de solicitação básico para aplicativos em um cluster do Serviço de Kubernetes do Azure (A K S).

Solução de problemas de dentro para fora

A solução de problemas de conectividade pode envolver muitas verificações, mas a abordagem de dentro para fora pode ajudar a encontrar a origem do problema e identificar o gargalo. Nessa abordagem, você começa no próprio pod, verificando se o aplicativo está respondendo no endereço IP do pod. Em seguida, verifique cada componente por sua vez até o cliente final.

Etapa 1: verificar se o pod está em execução e se o aplicativo ou contêiner dentro do pod está respondendo corretamente

Para determinar se o pod está em execução, execute um dos seguintes comandos kubectl get :

# List pods in the specified namespace.
kubectl get pods -n <namespace-name>

# List pods in all namespaces.
kubectl get pods -A

E se o pod não estiver em execução? Nesse caso, verifique os eventos do pod usando o comando kubectl describe :

kubectl describe pod <pod-name> -n <namespace-name>

Se o pod não estiver no estado ou Ready Running tiver sido reiniciado várias vezes, verifique a kubectl describe saída. Os eventos revelarão quaisquer problemas que impeçam você de iniciar o pod. Ou, se o pod tiver sido iniciado, o aplicativo dentro do pod poderá ter falhado, fazendo com que o pod seja reiniciado. Solucione problemas do pod adequadamente para garantir que ele esteja em um estado adequado.

Se o pod estiver em execução, também pode ser útil verificar os logs dos contêineres que estão dentro do pod. Execute a seguinte série de comandos kubectl logs :

kubectl logs <pod-name> -n <namespace-name>

# Check logs for an individual container in a multicontainer pod.
kubectl logs <pod-name> -n <namespace-name> -c <container-name>

# Dump pod logs (stdout) for a previous container instance.
kubectl logs <pod-name> --previous                      

# Dump pod container logs (stdout, multicontainer case) for a previous container instance.
kubectl logs <pod-name> -c <container-name> --previous      

O pod está em execução? Nesse caso, teste a conectividade iniciando um pod de teste no cluster. No pod de teste, você pode acessar diretamente o endereço IP do pod do aplicativo e verificar se o aplicativo está respondendo corretamente. Execute os comandos kubectl run, apt-get, e da cURL seguinte maneira:

# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable

# After the test pod is running, you will gain access to the pod.
# Then you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y && apt-get install netcat-traditional -y

# After the packages are installed, test the connectivity to the application pod:
curl -Iv http://<pod-ip-address>:<port>

Para aplicativos que escutam em outros protocolos, você pode instalar ferramentas relevantes dentro do pod de teste, como a ferramenta netcat, e verificar a conectividade com o pod do aplicativo executando o seguinte comando:

# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>

Para obter mais comandos para solucionar problemas de pods, consulte Depurar pods em execução.

Etapa 2: verificar se o aplicativo pode ser acessado a partir do serviço

Para cenários em que o aplicativo dentro do pod está em execução, você pode se concentrar principalmente na solução de problemas de como o pod é exposto.

O pod é exposto como um serviço? Nesse caso, verifique os eventos de serviço. Além disso, verifique se o endereço IP do pod e a porta do aplicativo estão disponíveis como um endpoint na descrição do serviço:

# Check the service details.
kubectl get svc -n <namespace-name>

# Describe the service.
kubectl describe svc <service-name> -n <namespace-name>

Verifique se o endereço IP do pod está presente como um endpoint no serviço, como no exemplo a seguir:

$ kubectl get pods -o wide  # Check the pod's IP address.
NAME            READY   STATUS        RESTARTS   AGE   IP            NODE                                
my-pod          1/1     Running       0          12m   10.244.0.15   aks-agentpool-000000-vmss000000  

$ kubectl describe service my-cluster-ip-service  # Check the endpoints in the service.
Name:              my-cluster-ip-service
Namespace:         default
Selector:          app=my-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.0.174.133
IPs:               10.0.174.133
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.15:80     # <--- Here

$ kubectl get endpoints  # Check the endpoints directly for verification.
NAME                      ENDPOINTS           AGE
my-cluster-ip-service     10.244.0.15:80      14m

Se os pontos de extremidade não estiverem apontando para o endereço IP do pod correto, verifique o Labels e Selectors do pod e do serviço.

Os pontos de extremidade no serviço estão corretos? Em caso afirmativo, acesse o serviço e verifique se o aplicativo está acessível.

Acessar o serviço ClusterIP

Para o ClusterIP serviço, você pode iniciar um pod de teste no cluster e acessar o endereço IP do serviço:

Diagrama do uso de um pod de teste em um cluster do Serviço de Kubernetes do Azure (A K S) para acessar o endereço IP do cluster.

# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable
  
# After the test pod is running, you will gain access to the pod.
# Then, you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y && apt-get install netcat-traditional -y
  
# After the packages are installed, test the connectivity to the service:
curl -Iv http://<service-ip-address>:<port>

Para aplicativos que escutam em outros protocolos, você pode instalar ferramentas relevantes dentro do pod de teste, como a ferramenta netcat, e verificar a conectividade com o pod do aplicativo executando o seguinte comando:

# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>

Se o comando anterior não retornar uma resposta apropriada, verifique se há erros nos eventos de serviço.

Acessar o serviço LoadBalancer

Para o LoadBalancer serviço, você pode acessar o endereço IP do balanceador de carga de fora do cluster.

Diagrama de um usuário de teste acessando o endereço I P do balanceador de carga de fora de um cluster do Serviço de Kubernetes do Azure (A K S).

curl -Iv http://<service-ip-address>:<port>

Para aplicativos que escutam em outros protocolos, você pode instalar ferramentas relevantes dentro do pod de teste, como a ferramenta netcat, e verificar a conectividade com o pod do aplicativo executando o seguinte comando:

nc -z -v <pod-ip-address> <port>

O endereço IP do LoadBalancer serviço retorna uma resposta correta? Caso contrário, siga estas etapas:

  1. Verifique os eventos do serviço.

  2. Verifique se os NSGs (grupos de segurança de rede) associados aos nós do AKS e à sub-rede do AKS permitem o tráfego de entrada na porta de serviço.

Para obter mais comandos para solucionar problemas de serviços, consulte Depurar serviços.

Cenários que usam uma entrada em vez de um serviço

Para cenários em que o aplicativo é exposto usando um Ingress recurso, o fluxo de tráfego é semelhante à seguinte progressão:

Nome >> DNS do cliente >> Balanceador de carga ou endereço >> IP do gateway de aplicativo Pods do controlador de entrada dentro do serviço de cluster >> ou pods

Diagrama do fluxo de tráfego de rede quando um aplicativo dentro de um cluster do Serviço de Kubernetes do Azure (A K S) é exposto usando um recurso de entrada.

Você também pode aplicar a abordagem de solução de problemas de dentro para fora aqui. Você também pode verificar o recurso do Kubernetes de entrada e os detalhes do controlador de entrada para obter mais informações:

$ kubectl get ing -n <namespace-of-ingress>  # Checking the ingress details and events.
NAME                         CLASS    HOSTS                ADDRESS       PORTS     AGE
hello-world-ingress          <none>   myapp.com            20.84.x.x     80, 443   7d22h

$ kubectl describe ing -n <namespace-of-ingress> hello-world-ingress
Name:             hello-world-ingress
Namespace:        <namespace-of-ingress>
Address:          20.84.x.x
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
  tls-secret terminates myapp.com
Rules:
  Host                Path  Backends
  ----                ----  --------
  myapp.com
                      /blog   blog-service:80 (10.244.0.35:80)
                      /store  store-service:80 (10.244.0.33:80)

Annotations:          cert-manager.io/cluster-issuer: letsencrypt
                      kubernetes.io/ingress.class: nginx
                      nginx.ingress.kubernetes.io/rewrite-target: /$1
                      nginx.ingress.kubernetes.io/use-regex: true
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  Sync    5m41s  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    5m41s  nginx-ingress-controller  Scheduled for sync

Este exemplo contém um Ingress recurso que:

  • Ouve no anfitrião myapp.com .
  • Tem duas Path cadeias de caracteres configuradas.
  • Rotas para dois Services no back-end.

Verifique se os serviços de back-end estão em execução e responda à porta mencionada na descrição de entrada:

$ kubectl get svc -n <namespace-of-ingress>
NAMESPACE       NAME                                     TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      
ingress-basic   blog-service                             ClusterIP      10.0.155.154   <none>        80/TCP                       
ingress-basic   store-service                            ClusterIP      10.0.61.185    <none>        80/TCP             
ingress-basic   nginx-ingress-ingress-nginx-controller   LoadBalancer   10.0.122.148   20.84.x.x     80:30217/TCP,443:32464/TCP   

Verifique os logs dos pods do controlador de entrada se houver um erro:

$ kubectl get pods -n <namespace-of-ingress>  # Get the ingress controller pods.
NAME                                                     READY   STATUS    RESTARTS   AGE
aks-helloworld-one-56c7b8d79d-6zktl                      1/1     Running   0          31h
aks-helloworld-two-58bbb47f58-rrcv7                      1/1     Running   0          31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q   1/1     Running   0          31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-grzdr   1/1     Running   0          31h

$ # Check logs from the pods.
$ kubectl logs -n ingress-basic nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q

E se o cliente estiver fazendo solicitações para o nome do host de entrada ou endereço IP, mas nenhuma entrada for vista nos logs do pod do controlador de entrada? Nesse caso, as solicitações podem não estar chegando ao cluster e o usuário pode estar recebendo uma mensagem de Connection Timed Out erro.

Outra possibilidade é que os componentes na parte superior dos pods de entrada, como o Balanceador de Carga ou o Gateway de Aplicativo, não estejam roteando as solicitações para o cluster corretamente. Se isso for verdadeiro, você poderá verificar a configuração de back-end desses recursos.

Se você receber uma mensagem de Connection Timed Out erro, verifique o grupo de segurança de rede associado aos nós do AKS. Além disso, verifique a sub-rede do AKS. Pode estar bloqueando o tráfego do balanceador de carga ou do gateway de aplicativo para os nós do AKS.

Para obter mais informações sobre como solucionar problemas de entrada (como a entrada do Nginx), consulte solução de problemas do ingress-nginx.

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.

Aviso de isenção de responsabilidade para contatos de terceiros

A Microsoft fornece informações de contato de terceiros para ajudá-lo a encontrar informações adicionais sobre esse tópico. Essas informações de contato podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão das informações de contato de terceiros.