Conecte os nós de cluster do AKS (Azure Kubernetes Service) para manutenção ou solução de problemas

Durante todo o ciclo de vida do cluster do AKS (Serviço de Kubernetes do Azure), você eventualmente precisa acessar diretamente um nó do AKS. Esse acesso pode ser para operações de solução de problemas, coleta de logs ou manutenção.

Você acessa um nó por meio da autenticação, quais métodos variam dependendo do sistema operacional do Nó e do método de conexão. Você se autentica com segurança em nós do AKS Linux e do Windows por meio de duas opções discutidas neste artigo. Um requer que você tenha acesso à API do Kubernetes e o outro é por meio da API DO ARM do AKS, que fornece informações de IP privado diretas. Por motivos de segurança, os nós do AKS não são expostos à Internet. Em vez disso, para se conectar diretamente a quaisquer nós do AKS, você precisa usar um kubectl debug ou o endereço IP privado do host.

Acessar nós usando a API do Kubernetes

Esse método requer o uso do comando kubectl debug.

Antes de começar

Este guia mostra como criar uma conexão com um nó do AKS e atualizar a chave SSH do cluster do AKS. Para seguir as etapas, você precisa usar a CLI do Azure que dá suporte à versão 2.0.64 ou posterior. Execute az --version para verificar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

Conclua estas etapas se você não tiver uma chave SSH. Crie uma chave SSH dependendo da imagem do sistema operacional do Nó, para macOS e Linux ou Windows. Salve o par de chaves no formato OpenSSH, evite formatos sem suporte, como .ppk. Em seguida, consulte Gerenciar a configuração de SSH para adicionar a chave ao cluster.

Linux e macOS

Os usuários do Linux e macOS podem acessar o SSH para acessar seu nó usando kubectl debug ou seu endereço IP privado. Os usuários do Windows devem pular para a seção Proxy do Windows Server para obter uma solução alternativa para o SSH por meio de proxy.

SSH usando depuração kubectl

Para criar uma conexão de shell interativa, use o comando kubectl debug para executar um contêiner privilegiado em seu nó.

  1. Para listar os nós, use o comando kubectl get nodes:

    kubectl get nodes -o wide
    

    Saída de exemplo:

    NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE
    aks-nodepool1-37663765-vmss000000   Ready    agent   166m   v1.25.6   10.224.0.33   <none>        Ubuntu 22.04.2 LTS
    aks-nodepool1-37663765-vmss000001   Ready    agent   166m   v1.25.6   10.224.0.4    <none>        Ubuntu 22.04.2 LTS
    aksnpwin000000                      Ready    agent   160m   v1.25.6   10.224.0.62   <none>        Windows Server 2022 Datacenter
    
  2. Use o comando kubectl debug para iniciar um contêiner privilegiado em seu nó e conectar-se a ele.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    Saída de exemplo:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    

    Agora você tem acesso ao nó por meio de um contêiner privilegiado como um pod de depuração.

    Observação

    Você pode interagir com a sessão de nó executando chroot /host no contêiner privilegiado.

Sair do modo de depuração kubectl

Quando terminar de usar o nó, insira o comando exit para encerrar a sessão interativa do shell. Depois que a sessão de contêiner interativa for fechada, exclua o pod de depuração usado com kubectl delete pod.

kubectl delete pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx

Conexão de proxy do Windows Server para SSH

Siga estas etapas como uma solução alternativa para se conectar ao SSH em um nó do Windows Server.

Criar um servidor proxy

Neste momento, você não pode conectar um nó do Windows Server diretamente usando kubectl debug. Em vez disso, primeiro você precisa se conectar a outro nó no cluster com kubectl e, em seguida, conectar-se ao nó do Windows Server desse nó usando SSH.

Para se conectar a outro nó no cluster, use o comando kubectl debug. Para obter mais informações, siga as etapas acima na seção kubectl. Crie uma conexão SSH com o nó do Windows Server de outro nó usando as chaves SSH fornecidas quando você criou o cluster do AKS e o endereço IP interno do nó do Windows Server.

Importante

As etapas a seguir para criar a conexão SSH com o nó do Windows Server de outro nó só poderão ser usadas se você criou o cluster do AKS usando a CLI do Azure com o parâmetro --generate-ssh-keys. Se você quiser usar suas próprias chaves SSH, poderá usar o az aks update para gerenciar chaves SSH em um cluster do AKS existente. Para obter mais informações, consulte gerenciar o acesso ao nó SSH.

Observação

Se o nó de proxy do Linux estiver inativo ou sem resposta, use o método do Azure Bastion para se conectar.

  1. Use o comando kubectl debug para iniciar um contêiner privilegiado em seu nó proxy (Linux) e conectar-se a ele.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    Saída de exemplo:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    
  2. Abra uma nova janela de terminal e use o comando kubectl get pods para obter o nome do pod iniciado por kubectl debug.

    kubectl get pods
    

    Saída de exemplo:

    NAME                                                    READY   STATUS    RESTARTS   AGE
    node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx   1/1     Running   0          21s
    

    Na saída de exemplo, node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx é o nome do pod iniciado por kubectl debug.

  3. Use o comando kubectl port-forward para abrir uma conexão com o pod implantado:

    kubectl port-forward node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx 2022:22
    

    Saída de exemplo:

    Forwarding from 127.0.0.1:2022 -> 22
    Forwarding from [::1]:2022 -> 22
    

    O exemplo anterior começa a encaminhar o tráfego de rede da porta 2022 no seu computador de desenvolvimento para a porta 22 no pod implantado. Ao usar kubectl port-forward para abrir uma conexão e encaminhar o tráfego da rede, a conexão permanecerá aberta até que você interrompa o comando kubectl port-forward.

  4. Abra um novo terminal e execute o comando kubectl get nodes para mostrar o endereço IP interno do nó do Windows Server:

    kubectl get no -o custom-columns=NAME:metadata.name,'INTERNAL_IP:status.addresses[?(@.type == \"InternalIP\")].address'
    

    Saída de exemplo:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    

    No exemplo anterior, 10.224.0.62 é o endereço IP interno do Nó do Windows Server.

  5. Crie uma conexão SSH com o nó do Windows Server usando o endereço IP interno e conecte-se à porta 22 por meio da porta 2022 no seu computador de desenvolvimento. O nome de usuário padrão para os nós do Serviço de Kubernetes do Azure é azureuser. Aceite o prompt para continuar com a conexão. Em seguida, você verá o prompt do Bash do seu nó do Windows Server:

    ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' azureuser@10.224.0.62
    

    Saída de exemplo:

    The authenticity of host '10.224.0.62 (10.224.0.62)' can't be established.
    ECDSA key fingerprint is SHA256:1234567890abcdefghijklmnopqrstuvwxyzABCDEFG.
    Are you sure you want to continue connecting (yes/no)? yes
    

    Observação

    Se preferir usar autenticação de senha, inclua o parâmetro -o PreferredAuthentications=password. Por exemplo:

     ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' -o PreferredAuthentications=password azureuser@10.224.0.62
    

Usar o Contêiner do Processo de Host para acessar o nó do Windows

  1. Crie hostprocess.yaml com o conteúdo a seguir e substituindo AKSWINDOWSNODENAME pelo nome do nó do Windows do AKS.

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        pod: hpc
      name: hpc
    spec:
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\SYSTEM"
      hostNetwork: true
      containers:
        - name: hpc
          image: mcr.microsoft.com/windows/servercore:ltsc2022 # Use servercore:1809 for WS2019
          command:
            - powershell.exe
            - -Command
            - "Start-Sleep 2147483"
          imagePullPolicy: IfNotPresent
      nodeSelector:
        kubernetes.io/os: windows
        kubernetes.io/hostname: AKSWINDOWSNODENAME
      tolerations:
        - effect: NoSchedule
          key: node.kubernetes.io/unschedulable
          operator: Exists
        - effect: NoSchedule
          key: node.kubernetes.io/network-unavailable
          operator: Exists
        - effect: NoExecute
          key: node.kubernetes.io/unreachable
          operator: Exists
    
  2. Execute kubectl apply -f hostprocess.yaml para implantar o contêiner de processo de host (HPC) do Windows no nó do Windows especificado.

  3. Use kubectl exec -it [HPC-POD-NAME] -- powershell.

  4. Você pode executar todos os comandos do PowerShell dentro do contêiner HPC para acessar o nó do Windows.

Observação

Você precisa mudar a pasta raiz para C:\ dentro do contêiner HPC para acessar os arquivos no nó do Windows.

SSH usando o Azure Bastion para Windows

Se o nó proxy do Linux não for acessível, usar o Azure Bastion como proxy será uma alternativa. Esse método exige que você configure um host do Azure Bastion para a rede virtual na qual o cluster reside. Consulte Conectar com o Azure Bastion para obter mais detalhes.

SSH usando IPs privados da API do AKS (versão prévia)

Se você não tiver acesso à API do Kubernetes, poderá obter acesso a propriedades como Node IP e Node Name por meio da API do pool de agentes do AKS (versão prévia) (disponível em versões prévias 07-02-2023 ou posteriores) para se conectar aos nós do AKS.

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As versões prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Criar uma conexão de shell interativa com um nó usando o endereço IP

Para conveniência, os nós do AKS são expostos na rede virtual do cluster por meio de endereços IP privados. No entanto, você precisa estar na rede virtual do cluster para SSH no nó. Se você ainda não tiver um ambiente configurado, poderá usar o Azure Bastion para estabelecer um proxy do qual você pode SSH para nós de cluster. Verifique se o Azure Bastion está implantado na mesma rede virtual que o cluster.

  1. Obtenha IPs privados usando o comando az aks machine list, direcionando todas as VMs em um pool de nós específico com o sinalizador --nodepool-name.

    az aks machine list --resource-group myResourceGroup  --cluster-name myAKSCluster --nodepool-name nodepool1 -o table
    

    A saída de exemplo a seguir mostra os endereços IP internos de todos os nós no pool de nós:

    Name                               Ip           Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    aks-nodepool1-33555069-vmss000001  10.224.0.6   IPv4
    aks-nodepool1-33555069-vmss000002  10.224.0.4   IPv4
    

    Para direcionar um nó específico dentro do pool de nós, use o sinalizador --machine-name:

    az aks machine show --cluster-name myAKScluster --nodepool-name nodepool1 -g myResourceGroup --machine-name aks-nodepool1-33555069-vmss000000 -o table
    

    A saída de exemplo a seguir mostra o endereço IP interno de todo o nó especificado:

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. SSH para o nó usando o endereço IP privado obtido na etapa anterior. Esta etapa é aplicável somente para computadores Linux. Para computadores Windows, consulte Conectar-se com o Azure Bastion.

    ssh -i /path/to/private_key.pem azureuser@10.224.0.33
    

Próximas etapas

Se você precisar de mais dados de solução de problemas, poderá exibir os logs do kubelet ou exibir os logs do plano de controle do Kubernetes.

Para saber mais sobre como gerenciar suas chaves SSH, consulte Gerenciar a configuração do SSH.