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

Nuvem Privada Virtual Infraestrutura clássica

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 o oc debug

Use o comando oc debug node para implementar um pod com um securityContext privilegiado para um nó do trabalhador que tenha problemas a serem solucionados.

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 oc debug node funciona, consulte esta postagem do blog Red Hat.

  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

    oc 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 oc debug node falhar, continue com a opção 2.

    oc debug node/<NODE_NAME>
    

    Se o comando oc debug node/<NODE_NAME> falhar, poderá haver regras de grupo de segurança, ACL ou firewall que impedem que a imagem de contêiner padrão seja extraída. Tente executar o comando novamente com a opção --image=us.icr.io/armada-master/network-alpine:latest , que utiliza uma imagem do site IBM Cloud Container Registry, acessível pela rede privada.

  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 yum install <tool>.

Depuração usando o kubectl exec

Se não for possível usar o comando oc debug node, crie um pod do Alpine com um securityContext privilegiado e use 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

    oc 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ê pode manter uma cópia da imagem para fins de depuração em seu próprio repositório ICR ou criar uma imagem personalizada com outras ferramentas, de acordo com 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
    

    Para obter logs ou outros arquivos de um nó de trabalho, use o comando kubectl cp no formato a seguir. O exemplo a seguir obtém o arquivo /var/log/messages do sistema de arquivos do host do nó de trabalho.

    oc cp default/debug-${NODE}:/host/var/log/messages ./messages
    

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

    /var/log/messages
    /var/log/kubelet.log
    /var/log/crio.log
    /var/log/calico/cni/cni.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 depuração, 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 o conntrack, executando o 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 não for possível usar o comando oc debug node ou kubectl exec, como se a conexão VPN entre o cluster mestre e os nós do trabalhador estivesse inativa, crie um pod que permita o acesso SSH raiz e copie uma chave SSH pública para o nó do trabalhador a fim de obter 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

    oc 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ê pode 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.

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

    oc 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 ajudar 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 yum 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.

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