Solucionar problemas de erros do CSE que impedem o provisionamento de nós Serviço de Kubernetes do Azure

Resumo

Este artigo ajuda você a solucionar problemas de erros de CSE (extensão de script personalizado) que impedem AKS (Serviço de Kubernetes do Azure) de provisionar um novo nó. Identifique o código de saída do CSE e resolva a falha para que novas instâncias do conjunto de dimensionamento de máquinas virtuais se registrem como nós do AKS.

Pré-requisitos

Verifique se você tem o CLI do Azure instalado e se ele está atualizado para a versão mais recente. Use az --version para verificar a versão instalada.

Sintomas

Uma instância recém-provisionada do conjunto de dimensionamento de máquinas virtuais não é registrada como um nó do AKS. Após uma operação de expansão do pool de nós, você pode observar que o número de instâncias de Conjuntos de Dimensionamento de Máquinas Virtuais aumenta enquanto o número de nós do Kubernetes permanece inalterado.

Se o dimensionador automático do cluster estiver habilitado, ele poderá remover a instância de Conjuntos de Dimensionamento de Máquinas Virtuais não registrada após um período de tempo.

Solução de problemas

Para identificar a causa, recupere o código de saída do CSE da instância de Conjuntos de Dimensionamento de Máquinas Virtuais afetada.

Use CLI do Azure para executar as seguintes etapas:

  1. Defina as variáveis para o cluster do AKS.

    export RG_NAME="<cluster-resource-group>"
    export CLUSTER_NAME="<cluster-name>"
    
    export NODE_RG=$(az aks show \
      --resource-group "$RG_NAME" \
      --name "$CLUSTER_NAME" \
      --query nodeResourceGroup \
      --output tsv)
    
    export API_FQDN=$(az aks show \
      --resource-group "$RG_NAME" \
      --name "$CLUSTER_NAME" \
      --query fqdn \
      --output tsv)
    
  2. Liste os conjuntos de dimensionamento de VMs no grupo de recursos dos nós e identifique o conjunto de dimensionamento de VMs correspondente ao pool de nós afetado.

    az vmss list \
      --resource-group "$NODE_RG" \
      --query "[].{Name:name,Capacity:sku.capacity,ProvisioningState:provisioningState}" \
      --output table
    
    export VMSS_NAME="<affected-vmss-name>"
    
  3. Encontre o ID da instância afetada de Conjuntos de Dimensionamento de Máquinas Virtuais e exporte o valor.

    export INSTANCE_ID="<affected-vmss-instance-id>"
    
  4. Obtenha o status do CSE da instância afetada.

    az vmss get-instance-view \
      --resource-group "$NODE_RG" \
      --name "$VMSS_NAME" \
      --instance-id "$INSTANCE_ID" \
      --query "extensions[?name=='vmssCSE'].statuses[].{
        ExtensionState:code,
        Details:message
      }" \
      --output json
    

    A seguir está a saída de exemplo:

     [
       {
         "ExtensionState": "ProvisioningState/failed/0",
         "Details": "failed to execute command: command terminated with exit status=1\n[stdout]\n{ \"ExitCode\": \"51\", \"Output\": \"... Failed to connect to <AKS API server FQDN> port 443: Connection timed out ... API server connection check code: 51 ... exit 51\", ... }\n\n[stderr]\n..."
       }
     ]
    

Os códigos de saída identificam o problema específico que causou a falha de provisionamento. No exemplo anterior, o CSE retorna o código 51de saída, que indica um problema de conectividade com o servidor de API do Kubernetes.

Para mapeamentos de outros códigos de saída, consulte o auxiliar do CSE.

Solução: Teste e corrija timeouts de rede do servidor de API

Verifique se o servidor de API está acessível da instância de Conjuntos de Dimensionamento de Máquinas Virtuais afetada. Verifique as seguintes configurações de rede:

  • Verifique se o NSG (grupo de segurança de rede) associado à sub-rede do AKS bloqueia o tráfego de saída para o endereço IP do servidor de API na porta TCP 443.
  • Verifique se um NSG adicional está associado à interface de rede do Conjuntos de Dimensionamento de Máquinas Virtuais. Cada NSG aplicável deve permitir o tráfego de saída para o endereço IP do servidor de API na porta TCP 443.
  • Verifique se um firewall ou dispositivo virtual de rede (NVA) está no caminho do tráfego de saída. Normalmente, você configura uma NVA por meio de uma tabela de rotas associada à sub-rede de nó do AKS. Verifique se o firewall ou a NVA permite o tráfego de saída para o endereço IP do servidor de API na porta TCP 443. Para obter mais informações, confira Controlar o tráfego de saída para nós de cluster no AKS.

Para testar a conectividade da instância de Conjuntos de Dimensionamento de Máquinas Virtuais para o servidor de API, use CLI do Azure para executar os comandos a seguir.

az vmss run-command invoke \
  --resource-group "$NODE_RG" \
  --name "$VMSS_NAME" \
  --instance-id "$INSTANCE_ID" \
  --command-id RunShellScript \
  --scripts '
API_FQDN="'"$API_FQDN"'"

echo "=== DNS resolution ==="
getent ahostsv4 "$API_FQDN" |
  awk '"'"'NR==1 {print "Resolved IP: " $1}'"'"'

echo "=== TCP connectivity ==="
if timeout 10 bash -c "</dev/tcp/$API_FQDN/443"; then
  echo "TCP 443: connected"
else
  echo "TCP 443: failed"
fi

echo "=== HTTPS response ==="
curl -sS -k \
  --connect-timeout 10 \
  --max-time 15 \
  --output /dev/null \
  --write-out \
"HTTP status: %{http_code}
Remote IP: %{remote_ip}
Connect time: %{time_connect}s
TLS time: %{time_appconnect}s
" \
  "https://$API_FQDN/"
' \
  --query "value[0].message" \
  --output tsv

O comando testa a resolução do DNS (Sistema de Nomes de Domínio), a conectividade TCP (Protocolo de Controle de Transmissão) e a conectividade HTTPS. Se a conexão for bem-sucedida, a saída deverá ser semelhante ao exemplo a seguir.

Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 172.199.220.208
=== TCP connectivity ===
TCP 443: connected
=== HTTPS response ===
HTTP status: 401
Remote IP: 172.199.220.208
Connect time: 0.018883s
TLS time: 0.058870s

[stderr]

Uma resposta HTTP 401 é esperada porque a solicitação não inclui credenciais de autenticação. A resposta confirma que a resolução de DNS, a conexão TCP e a negociação de TLS foram bem-sucedidas e que o servidor da API está acessível.

Se a conexão expirar, a saída deverá ser semelhante ao exemplo a seguir.

Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 20.238.162.102
=== TCP connectivity ===
TCP 443: failed
=== HTTPS response ===
HTTP status: 000
Remote IP:
Connect time: 0.000000s
TLS time: 0.000000s

[stderr]
curl: (28) Connection timeout after 10000 ms

Se a conexão atingir o tempo limite, a instância Conjuntos de Dimensionamento de Máquinas Virtuais não poderá acessar o servidor de API na porta TCP 443. Verifique as regras NSG efetivas, rotas definidas pelo usuário, firewalls, NVAs e outros dispositivos de rede que possam bloquear a conexão.

Referências