Warum kann ich nicht über SSH auf meinen Workerknoten zugreifen?
Virtual Private Cloud Classic-Infrastruktur
Sie können nicht über eine SSH-Verbindung auf Ihren Workerknoten zugreifen.
Auf den Workerknoten ist SSH nach Kennwort nicht verfügbar.
Um Aktionen auf jedem Worker-Knoten auszuführen, verwenden Sie einen „ Kubernetes “ DaemonSetoder nutzen Sie Jobs
für einmalige Aktionen.
Um den Host-Zugriff auf die Workerknoten für Debugging- und Fehlerbehebungszwecke zu erhalten, überprüfen Sie die folgenden Optionen.
Debugging mithilfe von kubectl debug
Verwenden Sie den Befehl kubectl debug node, um einen Pod mit einem privilegierten Sicherheitskontext (securityContext) für einen Workerknoten bereitzustellen, für den Sie eine Fehlerbehebung durchführen möchten.
Der Debug-Pod wird mit einer interaktiven Shell implementiert, so dass Sie unmittelbar nach der Erstellung des Pods auf den Workerknoten zugreifen können. Weitere Informationen zur Funktionsweise des Befehls kubectl debug node finden
Sie unter debug command in der Kubernetes-Referenz.
- Rufen Sie den Namen des Workerknotens auf, auf den Sie zugreifen möchten. Für CoreOS-Workerknoten ist der Name der Hostname des Workers. Für alle anderen Workerknoten ist der Name des Workerknotens die private IP-Adresse.
kubectl get nodes -o wide - Erstellen Sie einen Debug-Pod, der über den Hostzugriff verfügt. Bei der Erstellung des Pods wird die interaktive Shell des Pods automatisch geöffnet. Wenn der Befehl
kubectl debug nodefehlschlägt, fahren Sie mit der Option 2 fort.kubectl debug --image=us.icr.io/armada-master/network-alpine:latest -it node/<NODE_NAME> -- sh - Führen Sie Debugbefehle aus, um Informationen zu sammeln und Probleme zu beheben. Befehle, die für das Debugging verwendet werden können, wie z. B.
tcpdump,curl,ip,ifconfig,nc,pingundps, sind bereits in der Shell verfügbar. Sie können auch andere Tools installieren, wie beispielsweisemtrundconntrack, indem Sieapk add <tool>ausführen.
Debugging mithilfe von kubectl exec
Wenn Sie den Befehl kubectl debug node nicht verwenden können, dann können Sie einen Alpine-Pod mit einem privilegierten Sicherheitskontext (securityContext) erstellen und den Befehl kubectl exec verwenden,
um Debugbefehle von der interaktiven Shell des Pods auszuführen.
-
Rufen Sie den Namen des Workerknotens auf, auf den Sie zugreifen möchten. Für CoreOS-Workerknoten ist der Name der Hostname des Workers. Für alle anderen Workerknoten ist der Name des Workerknotens die private IP-Adresse.
kubectl get nodes -o wide -
Exportieren Sie den Namen in eine Umgebungsvariable.
export NODE=<NODE_NAME> -
Erstellen Sie einen Debug-Pod auf dem Workerknoten Das Alpine Docker-Image hier wird als Beispiel verwendet. Falls der Worker-Knoten keinen Zugang zum öffentlichen Netzwerk hat, können Sie eine Kopie des Images zu Debugging-Zwecken in Ihrem eigenen ICR-Repository verwalten oder mit anderen Tools ein an Ihre Anforderungen angepasstes Image erstellen.
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 -
Melden Sie sich beim Debug-Pod an. Die interaktive Shell des Pods wird automatisch geöffnet. Wenn der Befehl
kubectl execfehlschlägt, fahren Sie mit der Option 3 fort.kubectl exec -it debug-${NODE} -- shSie können den
kubectl cpBefehl verwenden, um Protokolle oder andere Dateien von einem Worker-Knoten abzurufen. Das folgende Beispiel ruft die Datei „/var/log/syslog“ ab.kubectl cp --retries 20 default/debug-${NODE}:/host/var/log/syslog ./syslogRufen Sie die folgenden Protokolle ab, um nach Problemen auf dem Workerknoten zu suchen.
/var/log/syslog /var/log/containerd.log /var/log/kubelet.log /var/log/kern.log -
Führen Sie Debugbefehle aus, um Informationen zu sammeln und Probleme zu beheben. Befehle, die Sie zum Debuggen verwenden können, wie beispielsweise „
dig“, „tcpdump“, „mtr“, „curl“, „ip“, „ifconfig“, „nc“, „ping“ und „ps“, sind in der Shell bereits verfügbar. Sie können auch andere Tools, wie beispielsweise „conntrack“, installieren, indem Sie den Befehl „apk add <tool>“ ausführen. Um beispielsweise „conntrack“ hinzuzufügen, führen Sie „apk add conntrack-tools“ aus. -
Löschen Sie den Host-Zugriffsbereich, den Sie für das Debugging erstellt haben.
kubectl delete pod debug-${NODE}
Debugging durch Aktivieren des SSH-Rootzugriffs auf einem Workerknoten
Wenn Sie die Befehle kubectl debug node oder kubectl exec nicht verwenden können, z. B. wenn die VPN-Verbindung zwischen den Master- und Workerknoten des Clusters inaktiv ist, können Sie einen Pod erstellen, der den
SSH-Rootzugriff ermöglicht und einen öffentlichen SSH-Schlüssel auf den Workerknoten für den SSH-Zugriff kopiert.
Der Zugriff auf den SSH-Rootzugriff ist ein Sicherheitsrisiko. Erlauben Sie den SSH-Zugang nur dann, wenn er erforderlich ist und keine andere Option zur Fehlerbehebung bei Workerknoten-Problemen zur Verfügung steht. Wenn Sie die Fehlerbehebung fertiggestellt haben, müssen Sie die Schritte im Abschnitt Bereinigung nach Debugging ausführen, um den SSH-Zugriff zu inaktivieren.
-
Wählen Sie einen vorhandenen Schlüssel aus oder erstellen Sie einen neuen öffentlichen SSH-Schlüssel.
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 -
Rufen Sie den Namen des Workerknotens auf, auf den Sie zugreifen möchten. Für CoreOS-Workerknoten ist der Name der Hostname des Workers. Für alle anderen Workerknoten ist der Name des Workerknotens die private IP-Adresse.
kubectl get nodes -o wide -
Erstellen Sie die folgende YAML-Datei für einen Debug-Pod und speichern Sie die Datei als
enable-ssh.yaml. Ersetzen Sie<NODE_NAME>durch den Namen des Workerknotens und ersetzen Sie dasvalue-Beispiel fürSSH_PUBLIC_KEYdurch Ihren öffentlichen SSH-Schlüssel. Das Alpine Docker-Image hier wird als Beispiel verwendet. Falls der Worker-Knoten keinen Zugang zum öffentlichen Netzwerk hat, können Sie eine Kopie des Images zu Debugging-Zwecken in Ihrem eigenen ICR-Repository speichern oder mit anderen Tools ein an Ihre Anforderungen angepasstes Image erstellen.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 -
Erstellen Sie den Pod in Ihrem Cluster. Wenn dieser Pod erstellt wird, wird der öffentliche Schlüssel zum Workerknoten hinzugefügt, und SSH ist so konfiguriert, dass die Root-SSH-Anmeldung zulässig ist.
kubectl apply -f enable-ssh.yaml -
Verwenden Sie das private oder öffentliche Netz, um über Ihren SSH-Schlüssel auf den Workerknoten zuzugreifen.
SSH zum Worker im privaten Netz
Erstellen Sie eine neue Serverinstanz oder wählen Sie eine vorhandene aus, die Zugang zu demselben privaten Netz hat wie der Workerknoten. Bei VPC-Clustern muss die virtuelle Serverinstanz in derselben VPC wie der Worker-Knoten vorhanden sein.
Bei klassischen Clustern kann das Gerät von jedem privaten VLAN aus auf den Worker-Knoten zugreifen, sofern eine Virtual Router Function(VRF) oder VLAN-Spanning aktiviert ist. Andernfalls muss sich das Gerät im selben privaten VLAN befinden wie der Workerknoten.
-
Kopieren Sie Ihren privaten SSH-Schlüssel aus Schritt 1 von Ihrem lokalen Rechner auf diese Serverinstanz.
scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private -
SSH in die Serverinstanz.
-
Legen Sie die richtigen Berechtigungen für die Verwendung des kopierten privaten SSH-Schlüssels fest.
chmod 400 ~/.ssh/id_rsa_worker_private -
Verwenden Sie den privaten Schlüssel, um sich über SSH in den Workerknoten einzuloggen, den Sie in Schritt 2 lokalisiert haben.
ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
SSH zum Workerknoten im öffentlichen Netz
Debuggen Sie klassische Cluster, die mit einem öffentlichen VLAN verbunden sind, indem Sie sich bei Ihren Workerknoten anmelden.
-
Erstellen Sie eine globale Calico-Netzrichtlinie mit dem Namen
ssh-open, um eingehenden SSH-Verkehr auf Port 22 zuzulassen.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 -
Geben Sie die öffentliche IP-Adresse Ihres Workerknotens an.
kubectl get nodes -o wide -
Stellen Sie über die öffentliche IP-Adresse eine SSH-Verbindung zum Workerknoten her.
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP> -
Führen Sie Debug-Befehle aus, um Informationen zu sammeln und Probleme zu beheben, beispielsweise
ip,ifconfig,ping,psundcurl. Sie können auch andere Tools installieren, die möglicherweise nicht standardmäßig installiert werden, wie z. B.tcpdumpodernc, indem Sieapt install <tool>ausführen.
Bereinigung nach Debugging
Nachdem Sie das Debugging abgeschlossen haben, bereinigen Sie die Ressourcen, um den SSH-Zugriff zu inaktivieren.
-
Löschen Sie den SSH-Aktivierungs-Pod.
kubectl delete pod enable-ssh-<NODE_NAME> -
Wenn Sie auf den Workerknoten über das öffentliche Netz zugegriffen haben, löschen Sie die Calico-Richtlinie, sodass der Port 22 erneut blockiert wird.
calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg] -
Laden Sie Ihren klassischen Workerknoten erneut oder ersetzen Sie Ihren VPC-Workerknoten, so dass die ursprüngliche SSH-Konfiguration verwendet und der von Ihnen hinzugefügte SSH-Schlüssel entfernt wird.