Pourquoi ne puis-je pas accéder via SSH à mon noeud worker ?
Cloud privé virtuel Infrastructure classique
Vous ne pouvez pas accéder à votre nœud worker à l'aide d'une connexion SSH.
La connexion SSH par mot de passe n'est pas disponible sur les noeuds worker.
Pour exécuter des actions sur chaque nœud de travail, utilisez une « Kubernetes » DaemonSet, ou utilisez des tâches
pour les actions ponctuelles.
Pour obtenir un accès hôte aux noeuds worker à des fins de débogage et de traitement des incidents, passez en revue les options suivantes.
Débogage à l'aide de la commande kubectl debug
Utilisez la commande kubectl debug node pour déployer un pod avec un securityContext privilégié sur un noeud worker dont vous souhaitez traiter les incidents.
Le pod de débogage est déployé avec un interpréteur de commandes interactif afin de vous permettre d'accéder au noeud worker juste après la création du pod. Pour plus d'informations sur le fonctionnement de la commande kubectl debug node,
voir debug command in Kubernetes reference.
- Obtenez le nom du noeud worker auquel vous souhaitez accéder. Pour les noeuds worker CoreOS, le nom est le nom d'hôte de l'agent. Pour tous les autres noeuds worker, le nom de noeud worker est l'adresse IP privée.
kubectl get nodes -o wide - Créez un pod de débogage qui dispose d'un accès hôte. Lorsque le pod est créé, son interpréteur de commandes interactif s'ouvre automatiquement. Si la commande
kubectl debug nodeéchoue, passez à l'option 2.kubectl debug --image=us.icr.io/armada-master/network-alpine:latest -it node/<NODE_NAME> -- sh - Exécutez des commandes de débogage pour collecter des informations et traiter les incidents. Les commandes que vous pouvez utiliser pour le débogage, par exemple
tcpdump,curl,ip,ifconfig,nc,pingetps, sont déjà disponibles dans l'interpréteur de commandes. Vous pouvez également installer d'autres outils, tels quemtretconntrack, en exécutantapk add <tool>.
Débogage à l'aide de la commande kubectl exec
Si la commande kubectl debug node ne peut pas être utilisée, vous pouvez créer un pod Alpine avec un securityContext privilégié et utiliser la commande kubectl exec pour exécuter des commandes de débogage
à partir de l'interpréteur de commandes interactif du pod.
-
Obtenez le nom du noeud worker auquel vous souhaitez accéder. Pour les noeuds worker CoreOS, le nom est le nom d'hôte de l'agent. Pour tous les autres noeuds worker, le nom de noeud worker est l'adresse IP privée.
kubectl get nodes -o wide -
Exportez le nom dans une variable d'environnement.
export NODE=<NODE_NAME> -
Créez un pod de débogage sur le noeud worker. L'image Alpine Docker ici est utilisée à titre d'exemple. Si le nœud de travail ne dispose pas d'un accès au réseau public, vous pouvez conserver une copie de l'image à des fins de débogage dans votre propre référentiel ICR ou créer une image personnalisée à l'aide d'autres outils afin de l'adapter à vos besoins.
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 -
Connectez-vous au pod de débogage. L'interpréteur de commandes interactif du pod s'ouvre automatiquement. Si la commande
kubectl execéchoue, passez à l'option 3.kubectl exec -it debug-${NODE} -- shVous pouvez utiliser la
kubectl cpcommande pour récupérer les fichiers journaux ou d'autres fichiers depuis un nœud de travail. L'exemple suivant récupère le fichier «/var/log/syslog».kubectl cp --retries 20 default/debug-${NODE}:/host/var/log/syslog ./syslogRécupèrez les journaux suivants pour rechercher des problèmes sur le noeud worker.
/var/log/syslog /var/log/containerd.log /var/log/kubelet.log /var/log/kern.log -
Exécutez des commandes de débogage pour collecter des informations et traiter les incidents. Les commandes que vous pourriez utiliser pour le débogage, telles que
dig,tcpdump,mtr,curl,ip,ifconfig,nc,pingetps, sont déjà disponibles dans le shell. Vous pouvez également installer d'autres outils, tels queconntrack, en exécutantapk add <tool>. Par exemple, pour ajouterconntrack, exécutezapk add conntrack-tools. -
Supprimez le pod d'accès hôte que vous avez créé à des fins de débogage.
kubectl delete pod debug-${NODE}
Débogage en activant l'accès SSH root sur un noeud worker
Si la commande kubectl debug node ou kubectl exec ne peut pas être utilisée, comme par exemple lorsque la connexion VPN entre le maître et les noeuds worker du cluster est arrêtée, vous pouvez créer un pod qui autorise
l'accès SSH root et copie une clé SSH publique sur le noeud worker pour l'accès SSH.
Autoriser l'accès SSH racine entraîne un risque de sécurité. Vous ne devez autoriser l'accès SSH que lorsque cela est nécessaire et qu'aucune autre option ne permet de déboguer les problèmes de noeud worker. Lorsque vous avez terminé l'identification et la résolution des incidents, veillez à suivre les étapes de la section Nettoyage après le débogage pour désactiver l'accès SSH.
-
Choisissez une clé SSH publique existant ou créez-en une nouvelle.
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 -
Obtenez le nom du noeud worker auquel vous souhaitez accéder. Pour les noeuds worker CoreOS, le nom est le nom d'hôte de l'agent. Pour tous les autres noeuds worker, le nom de noeud worker est l'adresse IP privée.
kubectl get nodes -o wide -
Créez le fichier YAML suivant pour un pod de débogage et sauvegardez-le fichier sous le nom
enable-ssh.yaml. Remplacez<NODE_NAME>par le nom du noeud worker et remplacez l'exemplevaluepourSSH_PUBLIC_KEYpar votre clé SSH publique. L'image Alpine Docker ici est utilisée à titre d'exemple. Si le nœud de travail ne dispose pas d'un accès au réseau public, vous pouvez conserver une copie de l'image dans votre propre référentiel ICR à des fins de débogage, ou créer une image personnalisée à l'aide d'autres outils afin de l'adapter à vos besoins.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 -
Créez le pod dans votre cluster. Lorsque ce pod est créé, votre clé publique est ajoutée au noeud worker et SSH est configuré pour autoriser la connexion SSH racine.
kubectl apply -f enable-ssh.yaml -
Utilisez le réseau privé ou le réseau public pour accéder au noeud worker à l'aide de votre clé SSH.
Connexion SSH à l'agent sur le réseau privé
Créez une nouvelle instance de serveur ou choisissez-en une qui existe avec un accès au même réseau privé que le noeud worker. Pour les clusters VPC, l'instance de serveur virtuel doit se trouver dans le même VPC que le nœud de travail.
Pour les clusters classiques, l'appareil peut accéder au nœud de travail depuis n'importe quel VLAN privé si la fonction de routeur virtuel(VRF) ou l'extension de VLAN est activée. Sinon, l'unité doit exister sur le même VLAN privé que le noeud worker.
-
Copiez votre clé privée SSH de l'étape 1 depuis votre machine locale sur cette instance de serveur.
scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private -
Ouvrez une session SSH sur l'instance de serveur.
-
Définissez les droits corrects d'utilisation de la clé privée SSH que vous avez copiée.
chmod 400 ~/.ssh/id_rsa_worker_private -
Utilisez la clé privée pour vous connecter via SSH au noeud worker que vous avez trouvé à l'étape 2.
ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
Connexion SSH au noeud worker sur le réseau public
Déboguez des clusters classiques reliés à un réseau VLAN public en vous connectant aux noeuds worker.
-
Créez une règle réseau globale Calico nommée
ssh-openpour autoriser le trafic SSH entrant sur le port 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 -
Identifiez l'adresse IP publique de votre noeud worker.
kubectl get nodes -o wide -
SSH dans le nœud worker via son adresse IP publique.
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP> -
Exécutez des commandes de débogage pour vous aider à recueillir des informations et à résoudre les problèmes, telles que
ip,ifconfig,ping,psetcurl. Vous pouvez également installer d'autres outils qui peuvent ne pas être installés par défaut, tels quetcpdumpounc, en exécutantapt install <tool>.
Nettoyage après le débogage
Après avoir terminé le débogage, nettoyez les ressources pour désactiver l'accès SSH.
-
Supprimez le pod d'activation SSH.
kubectl delete pod enable-ssh-<NODE_NAME> -
Si vous avez accédé au noeud worker via le réseau public, supprimez la règle Calico pour que le port 22 soit de nouveau bloqué.
calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg] -
Rechargez le noeud worker classique ou remplacez votre noeud worker VPC de sorte que la configuration SSH d'origine soit utilisée et que la clé SSH que vous aviez ajoutée soit retirée.