IBM Cloud Docs
Perché non posso eseguire l'SSH nel nodo di lavoro?

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 DaemonSetoppure 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.

  1. 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
    
  2. 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
    
  3. 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 e ps, sono già disponibili nella shell. È anche possibile installare altri strumenti, come mtr e conntrack, eseguendo apk 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.

  1. 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
    
  2. Esportare il nome in una variabile di ambiente.

    export NODE=<NODE_NAME>
    
  3. 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
    
  4. 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
    
  5. 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 e ps, sono già disponibili nella shell. È anche possibile installare altri strumenti, come conntrack, eseguendo apk add <tool>. Ad esempio, per aggiungere conntrack, eseguire apk add conntrack-tools.

  6. 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.

  1. 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
    
  2. 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
    
  3. 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'esempio value per SSH_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
    
  4. 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
    
  5. 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.

  1. 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
    
  2. SSH nell'istanza del server.

  3. Imposta le autorizzazioni corrette per utilizzare la chiave privata SSH che hai copiato.

    chmod 400 ~/.ssh/id_rsa_worker_private
    
  4. 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.

  1. Installa e configurare la CLI Calico e imposta il contesto per il tuo cluster per eseguire i comandi Calico.

  2. 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
    
  3. Ottenere l'indirizzo IP pubblico del nodo worker.

    kubectl get nodes -o wide
    
  4. SSH nel nodo di lavoro tramite il suo indirizzo IP pubblico.

    ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP>
    
  5. Eseguire i comandi di debug per raccogliere informazioni e risolvere problemi, come ip, ifconfig, ping, ps e curl. È anche possibile installare altri strumenti che potrebbero non essere installati per impostazione predefinita, come tcpdump o nc, eseguendo apt install <tool>.

Ripulitura dopo il debugging

Una volta terminato il debug, ripulire le risorse per disabilitare l'accesso SSH.

  1. Elimina il pod di abilitazione SSH.

    kubectl delete pod enable-ssh-<NODE_NAME>
    
  2. 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]
    
  3. 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.