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.
- 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 - 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 nodefalhar, continue com a opção 2.kubectl debug --image=us.icr.io/armada-master/network-alpine:latest -it node/<NODE_NAME> -- sh - 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, executandoapk 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.
-
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 -
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ê 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 -
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} -- shVocê pode usar o comando
kubectl cppara 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 ./syslogObtenha 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 -
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,pingeps, já estão disponíveis no shell. Você também pode instalar outras ferramentas, comoconntrack, executandoapk 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 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.
-
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
kubectl 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ê 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 -
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 -
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.
kubectl 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 ajudá-lo 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, executandoapt 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.
kubectl 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.