Por que eu não posso efetuar SSH em meu nó do trabalhador?

Virtual Private Cloud Infra-estrutura Classic

Não é possível acessar o nó do trabalhador usando uma conexão SSH.

O SSH por senha está indisponível nos nós do trabalhador.

Para executar ações em cada nó do trabalhador, use um DaemonSet do Kubernetes ou use tarefas para ações únicas.

Para obter acesso de host aos nós do trabalhador para fins de depuração e resolução de problemas, revise as opções a seguir.

Depuração usando kubectl debug

Use o comando kubectl debug node para implementar um pod com um securityContext privilegiado para um nó do trabalhador que você deseja solucionar problemas.

O pod de depuração é implementado com um shell interativo para que seja possível acessar o nó do trabalhador imediatamente após a criação do pod. Para obter mais informações sobre como o comando kubectl debug node funciona, consulte Comando debug na referência do Kubernetes.

  1. Obtenha o nome do nó do trabalhador que você deseja acessar. Para nós do trabalhador CoreOS, o nome é o nome do host do trabalhador. Para todos os outros nós do trabalhador, o nome do nó do trabalhador é o endereço IP privado
    kubectl get nodes -o wide
    
  2. Crie um pod de depuração com acesso de host. O shell interativo do pod é automaticamente aberto quando o pod é criado. Se o comando kubectl debug node falhar, continue com a opção 2.
    kubectl debug --image=us.icr.io/armada-master/network-alpine:latest -it node/<NODE_NAME> -- sh
    
  3. Execute os comandos de depuração para ajudá-lo a reunir informações e solucionar problemas. Os comandos usados para a depuração, como tcpdump, curl, ip, ifconfig, nc, ping e ps, estão disponíveis no shell. Você também pode instalar outras ferramentas, como mtr e conntrack, executando apk add <tool>.

Depuração usando kubectl exec

Se você não conseguir usar o comando kubectl debug node, será possível criar um pod Alpine com um securityContext privilegiado e usar o comando kubectl exec para executar comandos de depuração por meio do shell interativo do pod.

  1. Obtenha o nome do nó do trabalhador que você deseja acessar. Para nós do trabalhador CoreOS, o nome é o nome do host do trabalhador. Para todos os outros nós do trabalhador, o nome do nó do trabalhador é o endereço IP privado

    kubectl get nodes -o wide
    
  2. Exporte o nome em uma variável de ambiente.

    export NODE=<NODE_NAME>
    
  3. Crie um pod de depuração no nó do trabalhador. A imagem alpina do Docker aqui é usada como exemplo. Se o nó de trabalho não tiver acesso à rede pública, você poderá manter uma cópia da imagem para depuração em seu próprio repositório ICR ou criar uma imagem personalizada com outras ferramentas para atender às suas necessidades.

    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. Faça login no pod de depuração. O shell interativo do pod é aberto automaticamente. Se o comando kubectl exec falhar, continue com a opção 3.

    kubectl exec -it debug-${NODE} -- sh
    

    Você pode usar o comando kubectl cp para obter logs ou outros arquivos de um nó de trabalho. O exemplo a seguir obtém o arquivo /var/log/syslog.

    kubectl cp --retries 20 default/debug-${NODE}:/host/var/log/syslog ./syslog
    

    Obtenha os logs a seguir para encontrar problemas no nó do trabalhador.

    /var/log/syslog
    /var/log/containerd.log
    /var/log/kubelet.log
    /var/log/kern.log
    
  5. Execute os comandos de depuração para ajudá-lo a reunir informações e solucionar problemas. Os comandos que você pode usar para depurar, como dig, tcpdump, mtr, curl, ip, ifconfig, nc, ping e ps, já estão disponíveis no shell. Você também pode instalar outras ferramentas, como conntrack, executando apk add <tool>. Por exemplo, para adicionar conntrack, execute apk add conntrack-tools.

  6. Exclua o pod com acesso de host que foi criado para a depuração.

    kubectl delete pod debug-${NODE}
    

Depurando ativando o acesso SSH raiz em um nó do trabalhador

Se você não conseguir usar os comandos kubectl debug node ou kubectl exec, por exemplo, se a conexão VPN entre o cluster principal e os nós do trabalhador estiver inativa, será possível criar um pod que ativa o acesso SSH raiz e copia uma chave SSH pública para o nó do trabalhador para acesso SSH.

Permitir o acesso SSH raiz é um risco de segurança. Somente permita esse acesso quando necessário e quando não houver nenhuma outra opção disponível para solucionar problemas do nó do trabalhador. Ao finalizar a resolução de problemas, certifique-se de seguir as etapas na seção Limpeza após depuração para desativar o acesso SSH.

  1. Escolha uma chave SSH pública existente ou crie uma nova.

    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. Obtenha o nome do nó do trabalhador que você deseja acessar. Para nós do trabalhador CoreOS, o nome é o nome do host do trabalhador. Para todos os outros nós do trabalhador, o nome do nó do trabalhador é o endereço IP privado

    kubectl get nodes -o wide
    
  3. Crie o arquivo YAML a seguir para um pod de depuração e salve o arquivo como enable-ssh.yaml. Substitua <NODE_NAME> pelo nome do nó do trabalhador e substitua o exemplo value por SSH_PUBLIC_KEY pela chave SSH pública. A imagem alpina do Docker aqui é usada como exemplo. Se o nó de trabalho não tiver acesso à rede pública, você poderá manter uma cópia da imagem para depuração em seu próprio repositório ICR ou criar uma imagem personalizada com outras ferramentas para atender às suas necessidades.

    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. Crie o pod em seu cluster. Quando o pod for é criado, a chave pública é incluída no nó do trabalhador e o SSH é configurado para permitir o login SSH raiz.

    kubectl apply -f enable-ssh.yaml
    
  5. Use a rede privada ou pública para acessar o nó do trabalhador usando a chave SSH.

SSH no trabalhador na rede privada

Escolha uma instância de servidor existente com acesso à mesma rede privada do nó do trabalhador ou crie uma nova. Para clusters VPC, a instância de servidor virtual deve existir na mesma VPC que o nó do trabalhador.

Para clusters clássicos, o dispositivo poderá acessar o nó do trabalhador por meio de qualquer VLAN privada se um Virtual Router Function (VRF) ou VLAN Spanning estiver ativado. Caso contrário, o dispositivo deverá existir na mesma VLAN privada do nó do trabalhador.

  1. Copie sua chave privada SSH da etapa 1 da sua máquina local para esta instância do servidor.

    scp <SSH_private_key_location> <user@host>:/.ssh/id_rsa_worker_private
    
  2. Acesse a instância de servidor via SSH.

  3. Configure as permissões corretas para usar a chave privada SSH que você copiou.

    chmod 400 ~/.ssh/id_rsa_worker_private
    
  4. Use a chave privada para SSH no nó do trabalhador que você localizou na etapa 2.

    ssh -i ~/.ssh/id_rsa_worker_private root@<WORKER_PRIVATE_IP>
    

SSH no nó do trabalhador na rede pública

Depurar clusters clássicos conectados a uma VLAN publica efetuando login em seus nós do trabalhador.

  1. Instale e configure a CLI do Calico e defina o contexto para que o cluster execute os comandos do Calico.

  2. Crie uma política de rede global Calico denominada ssh-open para permitir o tráfego SSH de entrada na 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. Obtenha o endereço IP público do seu nó do trabalhador.

    kubectl get nodes -o wide
    
  4. SSH no nó do trabalhador por meio de seu endereço IP público.

    ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP>
    
  5. Execute comandos de depuração para ajudá-lo a coletar informações e solucionar problemas, como ip, ifconfig, ping, ps e curl. Também é possível instalar outras ferramentas que podem não ser instaladas por padrão, como tcpdump ou nc, executando apt install <tool>

Limpeza após a depuração

Depois de concluir a depuração, limpe os recursos para desativar o acesso SSH.

  1. Exclua o pod de ativação SSH.

    kubectl delete pod enable-ssh-<NODE_NAME>
    
  2. Se você acessou o nó do trabalhador por meio da rede pública, exclua a política do Calico para que a porta 22 seja bloqueada novamente.

    calicoctl delete gnp ssh-open [-c <path_to_calicoctl_cfg>/calicoctl.cfg]
    
  3. Recarregue o nó do trabalhador clássico ou substitua o nó do trabalhador de VPC para que a configuração SSH original seja usada e a chave SSH incluída seja removida.