¿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.
-
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 -
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 nodefalla, 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. -
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,pingyps, ya están disponibles en el shell. También puedes instalar otras herramientas, comomtryconntrack, ejecutandoyum 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.
-
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 -
Exporte el nombre en una variable de entorno.
export NODE=<NODE_NAME> -
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 -
Inicie sesión en el pod de depuración. El shell interactivo del pod se abre automáticamente. Si el mandato
kubectl execfalla, continúe en la opción 3.kubectl exec -it debug-${NODE} -- shPara 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 ./messagesObtenga 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 -
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,pingyps, ya están disponibles en el shell. También puedes instalar otras herramientas, comoconntrack, ejecutandoapk add <tool>. Por ejemplo, para añadirconntrack, ejecutaapk add conntrack-tools. -
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.
-
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 /tmpid_rsa_cluster_worker id_rsa_cluster_worker.pubcat /tmp/id_rsa_cluster_worker.pub -
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 -
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 ejemplovaluedeSSH_PUBLIC_KEYpor 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 -
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 -
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.
-
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 -
Ejecute SSH en la instancia de servidor.
-
Establezca los permisos correctos para utilizar la clave privada SSH que ha copiado.
chmod 400 ~/.ssh/id_rsa_worker_private -
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.
-
Cree una política de red global de Calico denominada
ssh-openpara 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 -
Obtenga la dirección IP pública del nodo trabajador.
oc get nodes -o wide -
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> -
Ejecuta comandos de depuración que te ayudarán a recopilar información y a resolver problemas, como
ip,ifconfig,ping,psycurl. También puede instalar otras herramientas que podrían no estar instaladas de forma predeterminada, comotcpdumponc, ejecutandoyum install <tool>.
Limpieza tras depurar
Una vez finalizada la depuración, limpie los recursos para inhabilitar el acceso SSH.
-
Suprima el pod de habilitación de SSH.
oc delete pod enable-ssh-<NODE_NAME> -
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] -
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.