Perché non posso eseguire l'SSH nel nodo di lavoro?
Virtual Private Cloud Infrastruttura classica
Non è possibile accedere al nodo worker utilizzando una connessione SSH.
SSH tramite password non è disponibile sui nodi di lavoro.
Per eseguire le azioni su ogni nodo di lavoro, utilizza un Kubernetes DaemonSet
oppure utilizza i lavori per le azioni
una tantum.
Per ottenere l'accesso host ai nodi di lavoro per scopi di debug e risoluzione dei problemi, esamina le seguenti opzioni.
Debug utilizzando kubectl debug
Utilizza il comando kubectl debug node
per distribuire un pod con un securityContext
privilegiato a un nodo di lavoro che vuoi risolvere.
Il pod di debug viene distribuito con una shell interattiva in modo da poter accedere al nodo di lavoro immediatamente dopo la creazione del pod. Per ulteriori informazioni su come funziona il comando kubectl debug node
, vedi
debug
command in Kubernetes reference.
- Ottenere il nome del nodo worker a cui si vuole accedere. Per nodi di lavoro CoreOS, il nome è il nome host del nodo di lavoro. Per tutti gli altri nodi di lavoro, il nome del nodo di lavoro è l'indirizzo IP privato.
kubectl get nodes -o wide
- Crea un pod di debug con accesso host. Quando il pod viene creato, la shell interattiva del pod viene aperta automaticamente. Se il comando
kubectl debug node
ha esito negativo, continuare con l'opzione 2.kubectl debug --image=us.icr.io/armada-master/network-alpine:latest -it node/<NODE_NAME> -- sh
- Eseguire i comandi di debug per raccogliere informazioni e risolvere i problemi. I comandi che è possibile utilizzare per eseguire il debug, come
tcpdump
,curl
,ip
,ifconfig
,nc
,ping
eps
, sono già disponibili nella shell. È anche possibile installare altri strumenti, comemtr
econntrack
, eseguendoapk add <tool>
.
Debug utilizzando kubectl exec
Se non sei in grado di utilizzare il comando kubectl debug node
, puoi creare un pod Alpine con un securityContext
privilegiato e utilizzare il comando kubectl exec
per eseguire i comandi di debug dalla
shell interattiva del pod.
-
Ottenere il nome del nodo worker a cui si vuole accedere. Per nodi di lavoro CoreOS, il nome è il nome host del nodo di lavoro. Per tutti gli altri nodi di lavoro, il nome del nodo di lavoro è l'indirizzo IP privato.
kubectl get nodes -o wide
-
Esportare il nome in una variabile di ambiente.
export NODE=<NODE_NAME>
-
Crea un pod di debug sul nodo di lavoro. L'immagine alpina Docker qui viene utilizzata come esempio. Se il nodo di lavoro non ha accesso alla rete pubblica, puoi conservare una copia dell'immagine per il debug nel tuo repository ICR o creare un'immagine personalizzata con altri strumenti per soddisfare le tue necessità.
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
-
Accedi al pod di debug. La shell interattiva del pod viene aperta automaticamente. Se il comando
kubectl exec
ha esito negativo, continuare con l'opzione 3.kubectl exec -it debug-${NODE} -- sh
Puoi utilizzare il comando
kubectl cp
per ottenere i log o altri file da un nodo di lavoro. Il seguente esempio richiama il file/var/log/syslog
.kubectl cp --retries 20 default/debug-${NODE}:/host/var/log/syslog ./syslog
Ottieni i seguenti log per cercare i problemi sul nodo di lavoro.
/var/log/syslog /var/log/containerd.log /var/log/kubelet.log /var/log/kern.log
-
Eseguire i comandi di debug per raccogliere informazioni e risolvere i problemi. I comandi che è possibile utilizzare per il debug, come
dig
,tcpdump
,mtr
,curl
,ip
,ifconfig
,nc
,ping
eps
, sono già disponibili nella shell. È anche possibile installare altri strumenti, comeconntrack
, eseguendoapk add <tool>
. Ad esempio, per aggiungereconntrack
, eseguireapk add conntrack-tools
. -
Elimina il pod di accesso host che hai creato per il debug.
kubectl delete pod debug-${NODE}
Debug abilitando l'accesso SSH root su un nodo di lavoro
Se non riesci a utilizzare i comandi kubectl debug node
o kubectl exec
, ad esempio se la connessione VPN tra il master cluster e i nodi di lavoro non è attiva, puoi creare un pod che abilita l'accesso SSH root e copia
una chiave SSH pubblica sul nodo di lavoro per l'accesso SSH.
Consentire l'accesso SSH root è un rischio per la sicurezza. Consenti l'accesso SSH solo quando è richiesto e non è disponibile nessun' altra opzione per risolvere i problemi del nodo di lavoro. Una volta terminata la risoluzione dei problemi, assicurati di seguire la procedura descritta nella sezione Pulizia dopo il debug per disabilitare l'accesso SSH.
-
Scegli una chiave SSH esistente o crea una nuova chiave SSH pubblica.
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
-
Ottenere il nome del nodo worker a cui si vuole accedere. Per nodi di lavoro CoreOS, il nome è il nome host del nodo di lavoro. Per tutti gli altri nodi di lavoro, il nome del nodo di lavoro è l'indirizzo IP privato.
kubectl get nodes -o wide
-
Crea il seguente file YAML per un pod di debug e salva il file come
enable-ssh.yaml
. Sostituisci<NODE_NAME>
con il nome del nodo di lavoro e sostituisci l'esempiovalue
perSSH_PUBLIC_KEY
con la tua chiave SSH pubblica. L'immagine alpina Docker qui viene utilizzata come esempio. Se il nodo di lavoro non ha accesso alla rete pubblica, puoi conservare una copia dell'immagine per il debug nel tuo repository ICR o creare un'immagine personalizzata con altri strumenti per soddisfare le tue necessità.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
-
Creare il pod nel cluster. Quando questo pod viene creato, la chiave pubblica viene aggiunta al nodo di lavoro e SSH viene configurato per consentire l'accesso SSH root.
kubectl apply -f enable-ssh.yaml
-
Utilizza la rete privata o pubblica per accedere al nodo di lavoro utilizzando la tua chiave SSH.
SSH nel nodo di lavoro sulla rete privata
Crea una nuova istanza del server o scegli un'istanza del server esistente che abbia accesso alla stessa rete privata del nodo di lavoro. Per i cluster VPC, l'istanza del server virtuale deve esistere nello stesso VPC del nodo di lavoro.
Per i cluster classici, il dispositivo può accedere al nodo di lavoro da qualsiasi VLAN privata se è abilitata una VRF(Virtual Router Function) o uno spanning della VLAN. Altrimenti, il dispositivo deve esistere sulla stessa VLAN privata del nodo di lavoro.
-
Copiare la chiave privata SSH dal passo 1 dalla macchina locale a questa istanza del server.
scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private
-
SSH nell'istanza del server.
-
Imposta le autorizzazioni corrette per utilizzare la chiave privata SSH che hai copiato.
chmod 400 ~/.ssh/id_rsa_worker_private
-
Utilizza la chiave privata per SSH nel nodo di lavoro che hai trovato nel passo 2.
ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
Esegui SSH nel nodo di lavoro sulla rete pubblica
Esegui il debug dei cluster classici connessi a una VLAN pubblica accedendo ai tuoi nodi di lavoro.
-
Crea una politica di rete globale Calico denominata
ssh-open
per consentire il traffico SSH in entrata sulla porta 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
-
Ottenere l'indirizzo IP pubblico del nodo worker.
kubectl get nodes -o wide
-
SSH nel nodo di lavoro tramite il suo indirizzo IP pubblico.
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP>
-
Eseguire i comandi di debug per raccogliere informazioni e risolvere problemi, come
ip
,ifconfig
,ping
,ps
ecurl
. È anche possibile installare altri strumenti che potrebbero non essere installati per impostazione predefinita, cometcpdump
onc
, eseguendoapt install <tool>
.
Ripulitura dopo il debugging
Una volta terminato il debug, ripulire le risorse per disabilitare l'accesso SSH.
-
Elimina il pod di abilitazione SSH.
kubectl delete pod enable-ssh-<NODE_NAME>
-
Se hai acceduto al nodo di lavoro tramite la rete pubblica, elimina la politica Calico in modo che la porta 22 venga nuovamente bloccata.
calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg]
-
Ricarica il tuo nodo di lavoro classico o sostituisci il tuo nodo di lavoro VPC in modo che venga utilizzata la configurazione SSH originale e venga rimossa la chiave SSH che hai aggiunto.