Compartir a través de


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

A lo largo del ciclo de vida del clúster de Azure Kubernetes Service (AKS), finalmente debe 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.

En este artículo se describen dos opciones para la conexión segura con los nodos de Linux y Windows de AKS. 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 o la dirección IP privada del host.

Acceso a nodos con la API de Kubernetes

Este método requiere el comando .

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 estos pasos, necesita CLI de Azure versión 2.0.64 o posterior. Ejecute para comprobar la versión. Si necesita instalar o actualizar, consulte Install 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. Guarde el par de claves en el formato OpenSSH y evite formatos no admitidos como . 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 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.

Conexión con kubectl debug

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

  1. Para enumerar los nodos, use el comando :

    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 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/azurelinux/busybox:1.36
    

    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 ejecutando desde el contenedor privilegiado.

Salida del modo de depuración de kubectl

Cuando haya terminado con el nodo, escriba el comando 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 node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx

Conexión de 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 directamente a un nodo de Windows Server mediante kubectl debug. En su lugar, primero debe conectarse a otro nodo del clúster con kubectl y, a continuación, conectarse al nodo Windows Server desde ese nodo mediante SSH.

Para conectarse a otro nodo del clúster, use el comando . Para obtener más información, siga los pasos anteriores de la sección kubectl. Cree una conexión SSH al nodo 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 Windows Server.

Importante

Los pasos siguientes para crear la conexión SSH al nodo Windows Server desde otro nodo solo se pueden usar si creó el clúster de AKS mediante el CLI de Azure con el parámetro --generate-ssh-keys. Si quiere usar sus propias claves SSH en su lugar, puede usar el 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 proxy de Linux está inactivo o no responde, use el método Azure Bastion para conectarse en su lugar.

  1. Use el comando 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/azurelinux/busybox:1.36
    

    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 para obtener el nombre del pod iniciado por .

    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 de ejemplo, es el nombre del pod iniciado por .

  3. Use el comando 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  del equipo de desarrollo al puerto  del pod implementado. Cuando se usa para abrir una conexión y reenviar el tráfico de red, la conexión permanece abierta hasta que se detiene el comando .

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

    kubectl get nodes -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
    aksnpwin000000                      10.224.0.62
    

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

  5. Cree una conexión SSH al nodo Windows Server mediante la dirección IP interna y conéctese al puerto 22 a través del 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
    

    Resultados del ejemplo:

    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 . Por ejemplo:

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

Usa un contenedor de procesos de host para acceder a un nodo de Windows

  1. Ejecute el siguiente script para crear . En el script, reemplace AKSWINDOWSNODENAME por el nombre de nodo de AKS Windows.

    Esta especificación usa la imagen base nanoserver. La imagen base no tiene PowerShell, pero porque se ejecuta como contenedor de procesos host (HPC), PowerShell está disponible en la máquina virtual subyacente.

    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/nanoserver:ltsc2022 # Use nanoserver: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 HPC de Windows en el nodo de Windows especificado.

  3. Utilice .

  4. Puede ejecutar cualquier comando de PowerShell dentro del contenedor de HPC para acceder al nodo Windows.

Nota:

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

SSH con Azure Bastion

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 en la que reside el clúster. Consulte Connect with Azure Bastion para obtener más información.

SSH con direcciones IP privadas de la red virtual del clúster

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.

  1. Si no tiene acceso a la API de Kubernetes, puede obtener acceso a propiedades como y a través de la API del grupo de agentes de AKS , (disponible en versiones estables o posteriores) para conectarse a los nodos de AKS. Obtenga direcciones IP privadas mediante el comando , que tengan como destino todas las máquinas virtuales de un grupo de nodos específico con la marca .

    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 :

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

    En la salida de ejemplo siguiente se muestra la dirección IP interna del nodo especificado:

    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 se aplica a los nodos de Linux.

    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.