Um grupo de segurança de rede personalizado bloqueia o tráfego
Ao acessar um aplicativo hospedado em um cluster do AKS (Serviço de Kubernetes do Azure), você recebe uma mensagem de erro "Tempo limite". Esse erro pode ocorrer mesmo se o aplicativo estiver em execução e o restante da configuração parecer estar correto.
Pré-requisitos
A ferramenta kubectl do Kubernetes, ou uma ferramenta semelhante, para se conectar ao cluster. Para instalar o kubectl usando a CLI do Azure, execute o comando az aks install-cli .
A ferramenta URL do cliente (cURL) ou uma ferramenta de linha de comando semelhante.
A ferramenta de linha de comando apt-get para lidar com pacotes.
Sintomas
Se você executar os seguintes comandos kubectl get e cURL, ocorrerá erros de "Tempo limite" semelhantes à seguinte saída do console:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-deployment-66648877fc-v78jm 1/1 Running 0 5m53s
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-loadbalancer-service LoadBalancer 10.0.107.79 10.81.x.x 80:31048/TCP 4m14s
$ curl -Iv http://10.81.124.39 # Use an IP address that fits the "EXTERNAL-IP" pattern.
* Trying 10.81.x.x:80...
* connect to 10.81.x.x port 80 failed: Timed out
* Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out
* Closing connection 0
curl: (28) Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out
Motivo
Se você tiver o mesmo erro "Tempo esgotado" todas as vezes, isso geralmente sugere que um componente de rede está bloqueando o tráfego.
Para solucionar esse problema, você pode começar verificando o acesso ao pod e, em seguida, passar para o cliente de dentro para fora .
Para verificar o pod, execute os seguintes kubectl get
comandos e kubectl describe :
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
my-deployment-66648877fc-v78jm 1/1 Running 0 53s 172.25.0.93 aks-agentpool-42617579-vmss000000
$ kubectl describe pod my-deployment-66648877fc-v78jm # Specify the pod name from the previous command.
...
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 117s default-scheduler Successfully assigned default/my-deployment-66648877fc-v78jm to aks-agentpool-42617579-vmss000000
Normal Pulling 116s kubelet Pulling image "httpd"
Normal Pulled 116s kubelet Successfully pulled image "httpd" in 183.532816ms
Normal Created 116s kubelet Created container webserver
Normal Started 116s kubelet Started container webserver
Com base nessa saída, o pod parece estar funcionando corretamente, sem nenhuma reinicialização.
Abra um pod de teste para verificar o acesso ao pod do aplicativo. Execute os seguintes kubectl get
comandos , kubectl runapt-get
e cURL:
$ kubectl get pods -o wide # Get the pod IP address.
NAME READY STATUS RESTARTS AGE IP NODE
my-deployment-66648877fc-v78jm 1/1 Running 0 7m45s 172.25.0.93 aks-agentpool-42617579-vmss000000
$ kubectl run -it --rm aks-ssh --image=debian:stable # Launch the test pod.
If you don't see a command prompt, try pressing enter.
$ root@aks-ssh:
$ # Install packages inside the test pod.
$ root@aks-ssh: apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
...
...
Running hooks in /etc/ca-certificates/update.d...
done.
$ # Try to check access to the pod using the pod IP address from the "kubectl get" output.
$ curl -Iv http://172.25.0.93
* Trying 172.25.0.93:80...
* Connected to 172.25.0.93 (172.25.0.93) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 172.25.0.93 left intact
O pod pode ser acessado diretamente. Portanto, o aplicativo está em execução.
O serviço definido é um LoadBalancer
tipo. Isso significa que o fluxo de solicitação do cliente final para o pod será o seguinte:
Nó do AKS do balanceador >> de carga do cliente >> Pod do >> aplicativo
Neste fluxo de requisição, podemos bloquear o tráfego através dos seguintes componentes:
- Políticas de rede no cluster
- O NSG (grupo de segurança de rede) para a sub-rede do AKS e o nó do AKS
Para verificar a política de rede, execute o seguinte kubectl get
comando:
$ kubectl get networkpolicy --all-namespaces
NAMESPACE NAME POD-SELECTOR AGE
kube-system konnectivity-agent app=konnectivity-agent 3h8m
Existe apenas a política padrão do AKS. Portanto, a política de rede não parece estar bloqueando o tráfego.
Para verificar os NSGs e suas regras associadas usando o AKS, siga estas etapas:
No portal do Azure, pesquise e selecione Conjuntos de dimensionamento de máquinas virtuais.
Na lista de instâncias do conjunto de dimensionamento, selecione aquela que você está usando.
No painel de menu da instância do conjunto de dimensionamento, selecione
Networking
.
A página Rede da instância do conjunto de dimensionamento é exibida. Na guia Regras de porta de entrada, são exibidos dois conjuntos de regras baseados nos dois NSGs que atuam na instância do conjunto de dimensionamento:
O primeiro conjunto é composto por regras NSG no nível da sub-rede. Essas regras são exibidas sob o seguinte título de nota:
Grupo de segurança de rede my-aks-nsg> (anexado à sub-rede: <my-aks-subnet>)<
Essa organização será comum se uma rede virtual personalizada e uma sub-rede personalizada para o cluster do AKS forem usadas. O conjunto de regras no nível da sub-rede pode ser semelhante à tabela a seguir.
Priority Nome Porta Protocolo Origem Destino Ação 65000 AllowVnetInBound Qualquer Qualquer VirtualNetwork VirtualNetwork Allow 65001 AllowAzureLoadBalancerInBound Qualquer Qualquer AzureLoadBalancer Qualquer Allow 65500 DenyAllInBound Qualquer Qualquer Qualquer Qualquer Negar O segundo conjunto é composto por regras NSG no nível do adaptador de rede. Essas regras são exibidas sob o seguinte título de nota:
Grupo de segurança de rede aks-agentpool-agentpool-number-nsg<> (anexado ao adaptador de rede: aks-agentpool-vm-scale-set-number-vmss)<>
Esse NSG é aplicado pelo cluster do AKS e é gerenciado pelo AKS. O conjunto de regras correspondente pode ser semelhante à tabela a seguir.
Priority Nome Porta Protocolo Origem Destino Ação 500 <guid-TCP-80-Internet> 80 TCP Internet 10.81.x.x Permitir 65000 AllowVnetInBound Qualquer Qualquer VirtualNetwork VirtualNetwork Allow 65001 AllowAzureLoadBalancerInBound Qualquer Qualquer AzureLoadBalancer Qualquer Allow 65500 DenyAllInBound Qualquer Qualquer Qualquer Qualquer Negar
No nível do adaptador de rede, há uma regra de entrada NSG para TCP no endereço IP 10.81.x.x na porta 80 (destacado na tabela). No entanto, uma regra equivalente está ausente das regras para o NSG no nível da sub-rede.
Por que o AKS não aplicou a regra ao NSG personalizado? Porque o AKS não aplica NSGs à sua sub-rede e não modificará nenhum dos NSGs associados a essa sub-rede. O AKS modificará os NSGs somente no nível do adaptador de rede. Para obter mais informações, consulte Posso configurar NSGs com o AKS?.
Solução
Se o aplicativo estiver habilitado para acesso em uma determinada porta, você deverá certificar-se de que o NSG personalizado permita essa porta como regra Inbound
. Depois que a regra apropriada é adicionada ao NSG personalizado no nível da sub-rede, o aplicativo fica acessível.
$ curl -Iv http://10.81.x.x
* Trying 10.81.x.x:80...
* Connected to 10.81.x.x (10.81.x.x) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 10.81.x.x left intact
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.