Conexión a los nodos de clúster de Azure Kubernetes Service (AKS) para mantenimiento o solución de problemas

Durante el ciclo de vida del clúster de Azure Kubernetes Service (AKS), es posible que necesite acceder directamente a un nodo de AKS. Este acceso podría ser para mantenimiento, recopilación de registros u otras operaciones de solución de problemas.

Puede acceder a un nodo a través de la autenticación, con métodos que varían en función del sistema operativo del nodo y del método de conexión. Puede autenticarse de forma segura en nodos de AKS Linux y Windows mediante dos opciones que se describen en este artículo. Una requiere que tenga acceso a la API de Kubernetes y la otra es a través de la API de ARM para AKS, que proporciona información de IP privada directa. Por motivos de seguridad, los nodos de AKS no están expuestos a Internet. En su lugar, para conectarse directamente a cualquier nodo de AKS, debe usar kubectl debug o la dirección IP privada del host.

Acceso a nodos mediante la API de Kubernetes

Este método requiere el uso del comando kubectl debug.

Antes de empezar

En esta guía se muestra cómo crear una conexión a un nodo de AKS y actualizar la clave SSH del clúster de AKS. Para seguir los pasos, debe usar la CLI de Azure que admita la versión 2.0.64 o posterior. Ejecute az --version para comprobar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Complete estos pasos si no tiene una clave SSH. Cree una clave SSH en función de la imagen del sistema operativo del nodo, para macOS y Linux o Windows. Asegúrese de que guarda el par de claves en formato OpenSSH y evite formatos no admitidos, como .ppk. A continuación, consulte Administración de la configuración de SSH para agregar la clave al clúster.

Linux y macOS

Los usuarios de Linux y macOS pueden acceder a su nodo mediante kubectl debug o su dirección IP privada. Los usuarios de Windows deben ir directamente a la sección Proxy de Windows Server para obtener una solución alternativa a SSH a través del proxy.

SSH mediante la depuración de kubectl

Para crear una conexión de shell interactiva, use el comando kubectl debug para ejecutar un contenedor con privilegios en el nodo.

  1. Para enumerar los nodos, use el comando kubectl get nodes:

    kubectl get nodes -o wide
    

    Resultados del ejemplo:

    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 el comando kubectl debug para iniciar un contenedor con privilegios en el nodo y conectarse a él.

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

    Resultados del ejemplo:

    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:/#
    

    Ahora tiene acceso al nodo a través de un contenedor con privilegios como pod de depuración.

    Nota:

    Puede interactuar con la sesión de nodo mediante la ejecución de chroot /host desde el contenedor con privilegios.

Salida del modo de depuración de kubectl

Cuando haya terminado con el nodo, escriba el comando exit para finalizar la sesión interactiva del shell. Una vez que se cierre la sesión interactiva del contenedor, elimine el pod de depuración usado con kubectl delete pod.

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

Conexión del proxy de Windows Server para SSH

Siga estos pasos como solución alternativa para conectarse con SSH en un nodo de Windows Server.

Creación de un servidor proxy

En este momento, no se puede conectar a un nodo de Windows Server directamente con kubectl debug. En su lugar, primero debe conectarse a otro nodo del clúster con kubectl y, luego, conectarse al nodo de Windows Server desde ese nodo mediante SSH.

Para conectarse a otro nodo del clúster, use el comando kubectl debug. Para más información, siga los pasos anteriores en la sección kubectl. Cree una conexión SSH al nodo de Windows Server desde otro nodo mediante las claves SSH proporcionadas al crear el clúster de AKS y la dirección IP interna del nodo de Windows Server.

Importante

Los pasos siguientes para crear la conexión SSH al nodo de Windows Server desde otro nodo solo se pueden utilizar si ha creado el clúster de AKS mediante la CLI de Azure con el parámetro --generate-ssh-keys. Si quiere usar sus propias claves SSH en su lugar, puede usar el az aks update para administrar las claves SSH en un clúster de AKS existente. Para más información, consulte Administración del acceso al nodo con SSH.

Nota:

Si el nodo del proxy de Linux está inactivo o no responde, use el método de Azure Bastion para conectarse.

  1. Use el comando kubectl debug para iniciar un contenedor con privilegios en el nodo (Linux) del proxy y conectarse a él.

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

    Resultados del ejemplo:

    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 una nueva ventana de terminal y use el comando kubectl get pods para obtener el nombre del pod iniciado por kubectl debug.

    kubectl get pods
    

    Resultados del ejemplo:

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

    En la salida del ejemplo, node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx es el nombre del pod iniciado por kubectl debug.

  3. Use el comando kubectl port-forward para abrir una conexión al pod implementado:

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

    Resultados del ejemplo:

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

    En el ejemplo anterior se comienza a reenviar el tráfico de red desde el puerto 2022 del equipo de desarrollo al puerto 22 del pod implementado. Cuando se usa kubectl port-forward para abrir una conexión y reenviar el tráfico de red, la conexión permanece abierta hasta que se detiene el comando kubectl port-forward.

  4. Abra un nuevo terminal y ejecute el comando kubectl get nodes para mostrar la dirección IP interna del nodo de Windows Server:

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

    Resultados del ejemplo:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    

    En el ejemplo anterior, 10.224.0.62 es la dirección IP interna del nodo de Windows Server.

  5. Cree una conexión SSH al nodo de Windows Server mediante la dirección IP interna y conéctese al puerto 22 mediante el puerto 2022 en el equipo de desarrollo. El nombre de usuario para los nodos de AKS es azureuser. Acepte el mensaje para continuar con la conexión. Luego, se le proporciona el símbolo del sistema de bash del nodo de Windows Server:

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

    Salida de muestra:

    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
    

    Nota:

    Si prefiere usar la autenticación con contraseña, incluya el parámetro -o PreferredAuthentications=password. Por ejemplo:

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

Uso del contenedor de procesos de host para acceder al nodo de Windows

  1. Cree hostprocess.yaml con el siguiente contenido y reemplace AKSWINDOWSNODENAME por el nombre del nodo de Windows de 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. Ejecute kubectl apply -f hostprocess.yaml para implementar el contenedor de procesos de host (HPC) de Windows en el nodo de Windows especificado.

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

  4. Para acceder al nodo de Windows puede ejecutar cualquier comando de PowerShell dentro del contenedor de HPC.

Nota:

Para acceder a los archivos del nodo de Windows, debe cambiar la carpeta raíz a C:\ dentro del contenedor de HPC.

Conexión a través de SSH mediante Azure Bastion para Windows

Si el nodo de proxy de Linux no es accesible, el uso de Azure Bastion como proxy es una alternativa. Este método requiere que configure un host de Azure Bastion para la red virtual donde reside el clúster. Consulte Conexión con Azure Bastion para más información.

Conexión a través de SSH mediante direcciones IP privadas desde la API de AKS (versión preliminar)

Si no tiene acceso a la API de Kubernetes, puede acceder a propiedades como Node IP y Node Name mediante la API del grupo de agentes de AKS (versión preliminar), (disponible en versiones preliminares 07-02-2023 u otras posteriores) para conectarse a los nodos de AKS.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y la garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Creación de una conexión de shell interactiva a un nodo mediante la dirección IP

Para mayor comodidad, los nodos de AKS se exponen en la red virtual del clúster mediante direcciones IP privadas. Sin embargo, debe estar en la red virtual del clúster para conectarse mediante SSH al nodo. Si aún no tiene configurado un entorno, puede usar Azure Bastion para establecer un proxy desde el que puede conectarse mediante SSH a los nodos del clúster. Asegúrese de que Azure Bastion está implementado en la misma red virtual que el clúster.

  1. Obtenga direcciones IP privadas mediante el comando az aks machine list, que tengan como destino todas las máquinas virtuales de un grupo de nodos específico con la marca --nodepool-name.

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

    La salida del ejemplo siguiente muestra las direcciones IP internas de todos los nodos del grupo de nodos:

    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 establecer como destino un nodo específico dentro del grupo de nodos, use la marca --machine-name:

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

    La salida del ejemplo siguiente muestra las direcciones IP internas de todos los nodos especificados:

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. Conéctese a través de SSH al nodo mediante la dirección IP privada que obtuvo en el paso anterior. Este paso solo es aplicable a las máquinas Linux. Para máquinas Windows, consulte Conexión con Azure Bastion.

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

Pasos siguientes

Si necesita datos adicionales para la solución de problemas, puede ver los registros de kubelet o ver los registros del plano de control de Kubernetes.

Para obtener información sobre la administración de las claves SSH, consulte Administración de la configuración de SSH.