¿Por qué no puedo ejecutar SSH sobre mi nodo trabajador?

Nube privada virtual Infraestructura clásica

No puede acceder al nodo de trabajador utilizando una conexión SSH.

SSH mediante contraseña no está disponible en los nodos trabajadores.

Para ejecutar acciones en todos los nodos de trabajo, utiliza un « Kubernetes » DaemonSet, o bien utiliza trabajos para acciones puntuales.

Para obtener acceso de host a los nodos trabajadores para la depuración y la resolución de problemas, revise las opciones siguientes.

Depuración con oc debug

Utilice el mandato oc debug node para desplegar un pod con un securityContext con privilegios en un nodo trabajador cuyos problemas desee resolver.

El pod de depuración se despliega con un shell interactivo para que pueda acceder al nodo trabajador inmediatamente después de que se haya creado el pod. Para obtener más información sobre cómo funciona el mandato oc debug node, consulte esta entrada de blog de Red Hat.

  1. Obtenga el nombre del nodo trabajador al que desea acceder. Para los nodos de trabajador de CoreOS, el nombre es el nombre de host del trabajador. Para todos los demás nodos de trabajador, el nombre del nodo de trabajador es la dirección IP privada.

    oc get nodes -o wide
    
  2. Cree un pod de depuración que tenga acceso de host. Cuando se crea el pod, el shell interactivo del pod se abre automáticamente. Si el mandato oc debug node falla, continúe en la opción 2.

    oc debug node/<NODE_NAME>
    

    Si el mandato oc debug node/<NODE_NAME> falla, es posible que haya reglas de grupo de seguridad, ACL o cortafuegos que impidan extraer la imagen de contenedor predeterminada. Vuelve a ejecutar el comando con la opción « --image=us.icr.io/armada-master/network-alpine:latest », que utiliza una imagen de IBM Cloud Container Registry a la que se puede acceder a través de la red privada.

  3. Ejecute mandatos de depuración como ayuda para recopilar información y resolver problemas. Los mandatos que puede utilizar para depurar, como tcpdump, curl, ip, ifconfig, nc, ping y ps, ya están disponibles en el shell. También puedes instalar otras herramientas, como mtr y conntrack, ejecutando yum install <tool>.

Depuración con kubectl exec

Si no puede utilizar el mandato oc debug node, puede crear un pod Alpine con un securityContext con privilegios y utilizar el mandato kubectl exec para ejecutar mandatos de depuración desde el shell interactivo del pod.

  1. Obtenga el nombre del nodo trabajador al que desea acceder. Para los nodos de trabajador de CoreOS, el nombre es el nombre de host del trabajador. Para todos los demás nodos de trabajador, el nombre del nodo de trabajador es la dirección IP privada.

    oc get nodes -o wide
    
  2. Exporte el nombre en una variable de entorno.

    export NODE=<NODE_NAME>
    
  3. Cree un pod de depuración en el nodo trabajador. La imagen de Docker Alpine aquí se utiliza como un ejemplo. Si el nodo de trabajo no tiene acceso a la red pública, puedes guardar una copia de la imagen en tu propio repositorio ICR para la depuración o crear una imagen personalizada con otras herramientas que se adapte a tus necesidades.

    kubectl apply -f - << EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: debug-${NODE}
      namespace: default
    spec:
      tolerations:
      - operator: "Exists"
      hostNetwork: true
      containers:
      - args: ["-c", "sleep 20d"]
        command: ["/bin/sh"]
        image: us.icr.io/armada-master/network-alpine:latest
        imagePullPolicy: Always
        name: debug
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /host
          name: host-volume
      volumes:
      - name: host-volume
        hostPath:
          path: /
      nodeSelector:
        kubernetes.io/hostname: ${NODE}
      restartPolicy: Never
    EOF
    
  4. Inicie sesión en el pod de depuración. El shell interactivo del pod se abre automáticamente. Si el mandato kubectl exec falla, continúe en la opción 3.

    kubectl exec -it debug-${NODE} -- sh
    

    Para obtener los registros u otros archivos de un nodo de trabajo, utiliza el comando « **kubectl cp** » con el siguiente formato. En el siguiente ejemplo se obtiene el archivo « /var/log/messages » del sistema de archivos del nodo de trabajo.

    oc cp default/debug-${NODE}:/host/var/log/messages ./messages
    

    Obtenga los siguientes registros para buscar problemas en el nodo de trabajador.

    /var/log/messages
    /var/log/kubelet.log
    /var/log/crio.log
    /var/log/calico/cni/cni.log
    
  5. Ejecute mandatos de depuración como ayuda para recopilar información y resolver problemas. Comandos que podrías utilizar para depurar, como dig, tcpdump, mtr, curl, ip, ifconfig, nc, ping y ps, ya están disponibles en el shell. También puedes instalar otras herramientas, como conntrack, ejecutando apk add <tool>. Por ejemplo, para añadir conntrack, ejecuta apk add conntrack-tools.

  6. Suprima el pod de acceso a host que ha creado para la depuración.

    kubectl delete pod debug-${NODE}
    

Depuración habilitando el acceso SSH root en un nodo trabajador

Si no puede utilizar los mandatos oc debug node o kubectl exec, como por ejemplo si la conexión VPN entre el nodo maestro y los nodos trabajadores del clúster está inactiva, puede crear un pod que permita el acceso SSH root y copie una clave SSH pública en el nodo trabajador para el acceso SSH.

Permitir el acceso SSH root es un riesgo de seguridad. Permita solo el acceso SSH cuando sea necesario y no haya ninguna otra opción disponible para resolver los problemas del nodo trabajador. Cuando termine la resolución de problemas, asegúrese de seguir los pasos de la sección Limpieza después de la depuración para inhabilitar el acceso SSH.

  1. Elija una clave SHH pública existente o cree una nueva.

    ssh-keygen -f /tmp/id_rsa_cluster_worker -t rsa -b 4096 -C temp-worker-ssh-key -P ''
    ls /tmp
    
    id_rsa_cluster_worker id_rsa_cluster_worker.pub
    
    cat /tmp/id_rsa_cluster_worker.pub
    
  2. Obtenga el nombre del nodo trabajador al que desea acceder. Para los nodos de trabajador de CoreOS, el nombre es el nombre de host del trabajador. Para todos los demás nodos de trabajador, el nombre del nodo de trabajador es la dirección IP privada.

    oc get nodes -o wide
    
  3. Cree el archivo YAML siguiente para un pod de depuración y guarde el archivo como enable-ssh.yaml. Sustituya <NODE_NAME> por el nombre de nodo de trabajador y sustituya el ejemplo value de SSH_PUBLIC_KEY por la clave SSH pública. La imagen de Docker Alpine aquí se utiliza como un ejemplo. Si el nodo de trabajo no tiene acceso a la red pública, puedes guardar una copia de la imagen en tu propio repositorio ICR para la depuración o crear una imagen personalizada con otras herramientas que se adapte a tus necesidades.

    apiVersion: v1
    kind: Pod
    metadata:
      name: enable-ssh-<NODE_NAME>
      labels:
        name: enable-ssh
    spec:
      tolerations:
      - operator: "Exists"
      hostNetwork: true
      hostPID: true
      hostIPC: true
      containers:
      - image: us.icr.io/armada-master/network-alpine:latest
        env:
        - name: SSH_PUBLIC_KEY
          value: "<ssh-rsa AAA...ZZZ temp-worker-ssh-key>"
        args: ["-c", "echo $(SSH_PUBLIC_KEY) | tee -a /root/.ssh/authorized_keys && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config && sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/g' /host/etc/ssh/sshd_config.d/40-rhcos-defaults.conf || true && killall -1 sshd || yes n | ssh-keygen -f /host/etc/ssh/ssh_host_rsa_key -t rsa -b 4096 -C temp-server-ssh-key -P '' && while true; do sleep 86400; done"]
        command: ["/bin/sh"]
        name: enable-ssh
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /host
          name: host-volume
        - mountPath: /root/.ssh
          name: ssh-volume
      volumes:
      - name: host-volume
        hostPath:
          path: /
      - name: ssh-volume
        hostPath:
          path: /root/.ssh
      nodeSelector:
        kubernetes.io/hostname: <NODE_NAME>
      restartPolicy: Never
    
  4. Cree el pod en el clúster. Cuando se crea este pod, la clave pública se añade al nodo trabajador y SSH se configura para permitir el inicio de sesión SSH root.

    oc apply -f enable-ssh.yaml
    
  5. Utilice la red privada o pública para acceder al nodo trabajador utilizando la clave SSH.

SSH en el trabajador de la red privada

Cree un nueva nueva instancia de servicio. o elija una existente, que tenga acceso a la misma red privada que el nodo trabajador. En el caso de los clústeres de VPC, la instancia del servidor virtual debe encontrarse en la misma VPC que el nodo de trabajo.

En el caso de los clústeres clásicos, el dispositivo puede acceder al nodo de trabajo desde cualquier VLAN privada si se ha habilitado una función de enrutador virtual(VRF) o la extensión de VLAN. De lo contrario, el dispositivo debe existir en la misma VLAN privada que el nodo trabajador.

  1. Copie la clave privada SSH del paso 1 de la máquina local a esta instancia de servidor.

    scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private
    
  2. Ejecute SSH en la instancia de servidor.

  3. Establezca los permisos correctos para utilizar la clave privada SSH que ha copiado.

    chmod 400 ~/.ssh/id_rsa_worker_private
    
  4. Utilice la clave privada para ejecutar SSH en el nodo trabajador que ha encontrado en el paso 2.

    ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
    

SSH en el nodo trabajador de la red pública

Depuración de clústeres clásicos conectados a una VLAN pública iniciando sesión en los nodos trabajadores.

  1. Instale y configure la CLI de Calico y establezca el contexto para que el clúster ejecute mandatos de Calico.

  2. Cree una política de red global de Calico denominada ssh-open para permitir el tráfico SSH de entrada en el puerto 22.

    calicoctl apply -f - <<EOF
    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: ssh-open
    spec:
      selector: ibm.role == 'worker_public'
      ingress:
      - action: Allow
        protocol: TCP
        destination:
          ports:
          - 22
      order: 1500
    EOF
    
  3. Obtenga la dirección IP pública del nodo trabajador.

    oc get nodes -o wide
    
  4. SSH en el nodo de trabajador a través de su dirección IP pública.

    ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP>
    
  5. Ejecuta comandos de depuración que te ayudarán a recopilar información y a resolver problemas, como ip, ifconfig, ping, ps y curl. También puede instalar otras herramientas que podrían no estar instaladas de forma predeterminada, como tcpdump o nc, ejecutando yum install <tool>.

Limpieza tras depurar

Una vez finalizada la depuración, limpie los recursos para inhabilitar el acceso SSH.

  1. Suprima el pod de habilitación de SSH.

    oc delete pod enable-ssh-<NODE_NAME>
    
  2. Si ha accedido al nodo trabajador mediante la red pública, suprima la política de Calico de modo que el puerto 22 esté bloqueado de nuevo.

    calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg]
    
  3. Vuelva a cargar el nodo trabajador clásico o sustituya el nodo trabajador de VPC para que se utilice la configuración SSH original y se elimine la clave SSH que ha añadido.