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.
-
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 -
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 nodefalhar, 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. -
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,pingeps, estão disponíveis no shell. Você também pode instalar outras ferramentas, comomtreconntrack, executandoyum 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.
-
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 -
Exporte o nome em uma variável de ambiente.
export NODE=<NODE_NAME> -
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 -
Faça login no pod de depuração. O shell interativo do pod é aberto automaticamente. Se o comando
kubectl execfalhar, continue com a opção 3.kubectl exec -it debug-${NODE} -- shPara obter logs ou outros arquivos de um nó de trabalho, use o comando
kubectl cpno formato a seguir. O exemplo a seguir obtém o arquivo/var/log/messagesdo sistema de arquivos do host do nó de trabalho.oc cp default/debug-${NODE}:/host/var/log/messages ./messagesObtenha 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 -
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,pingeps, já estão disponíveis no shell. Você também pode instalar outras ferramentas, como oconntrack, executando oapk add <tool>. Por exemplo, para adicionarconntrack, executeapk add conntrack-tools. -
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.
-
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 /tmpid_rsa_cluster_worker id_rsa_cluster_worker.pubcat /tmp/id_rsa_cluster_worker.pub -
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 -
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 exemplovalueporSSH_PUBLIC_KEYpela 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 -
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 -
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.
-
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 -
Acesse a instância de servidor via SSH.
-
Configure as permissões corretas para usar a chave privada SSH que você copiou.
chmod 400 ~/.ssh/id_rsa_worker_private -
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.
-
Crie uma política de rede global Calico denominada
ssh-openpara 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 -
Obtenha o endereço IP público do seu nó do trabalhador.
oc get nodes -o wide -
SSH no nó do trabalhador por meio de seu endereço IP público.
ssh -i <SSH_private_key_location> root@<WORKER_PUBLIC_IP> -
Execute comandos de depuração para ajudar a coletar informações e solucionar problemas, como
ip,ifconfig,ping,psecurl. Também é possível instalar outras ferramentas que podem não ser instaladas por padrão, comotcpdumpounc, executandoyum install <tool>
Limpeza após a depuração
Depois de concluir a depuração, limpe os recursos para desativar o acesso SSH.
-
Exclua o pod de ativação SSH.
oc delete pod enable-ssh-<NODE_NAME> -
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] -
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.