Utilizando Shell in a Box através de um web browser para interagir com outros containers

Edson Morais
4 min readMay 30, 2021

Em uma arquitetura baseada em containers com orquestração por Kubernetes possuímos aplicações, estas aplicações estão em containers, estes containers estão em pods, estes pods estão em nodes, estes nodes em clusters. Veja esta boa e velha ilustração:

As vezes para identificar problemas nas aplicações ou no ‘host containerizado’, além dos logs dos containers precisamos acessar o container em si e as vezes precisamos integragir com estas aplicações e containers, através de outras aplicações em outros containers.

Deixe-me ilustar um cenário baseado em AWS ECS Fargate, no qual:

1 — Os dois containers não estão expostos na internet, mas precisam se comunicar (por este motivo considere que os dois serviços estão devidamente configurados com o Service Discovery).

2 — As aplicações estão operacionais, ou seja, cada uma delas, de forma isolada, estão funcionando como o esperado.

3 — As informações coletadas pelo AWS Cloudwatch não estão suficientes para identificar a falha de comunicação entre o containers e aplicações.

Surge então a dúvida: O que pode estar errado? Qual configuração está obstruindo a comunicação? Há alguma configuração no ‘host containerizado’ que não está correta?

E qual seria uma boa maneira de depurar o problema?

Uma boa reposta: Accessar os dois containers e depurar as configurações dos ‘hosts’ e realizar tentativas de comunicação entre eles, utilizando, por exemplo Tel Net, Curl — entre outras ferramentas.

Mas como acessar o ‘host’ de um AWS ECS Fargate?!

Ou, imagine outro cenário, no qual ao invés de você acessar o container ‘problemático’ em seu cluster Kubernetes, você queira, mais uma maneira ágil de interagir com outros containers e aplicações para depurar situações onde o log não é suficientemente claro.

Vamos ao que interessa

Criando os arquivos necessários

“Criar um container que utilizará um servidor SSH baseado em OpenBSD, possibilitando a instalação de ferramentas Linux, que através de uma sessão HTTP nos possibilite operar um host Linux utilizando um web browser!”

1 — Crie um diretório e nele crie os arquivos a seguir:

sshd_config (documentação oficial): Este é o arquivo de configuração do daemon do OpenSSH, responsável pela autenticação da sessão SSH que será instanciada quando o container for iniciado.

docker-entrypoint.sh : Este arquivo será executado imediatamente quando o container for iniciado e contém as informações de login que serão utilizadas pelo servidor SSH e para a sessão no web browser. Atenção aos pontos a seguir:

1 — {linha 3} Substitua o valor da variável [SSH_PUBLIC_KEY] por uma chave SSH-RSA. Nunca se esquecendo de que em ambientes de produção, é uma boa prática de segurança utilizar soluções de gerenciamento de segredos, preferencilamente com chaves rotativas ;) [não sabe gerar uma chave SSH-RSA? segue uma pequena referência]

2 — {Linha 11, 12 e 13} Defina um usuário e senha (também para o usuário root), que serão utilizados na sessão web, quando você for acessar o container. Lembre-se a boa prática de segurança mencionada anteriormente ;)

3 — {Linha 27} Defina a porta que você deseja expor a solução que está sendo containerizada.

Dockerfile : Este é arquivo com as instruções para a contrução da imagem do container. Atenção aos pontos a seguir:

1 — {Linha 1} Defina a imagem base, da distribuição Linux de sua preferência. Lembre-se, deve ser uma imagem base que tenha suporte à ferramenta Shelinabox e às ferramentas que você pretende instalar.

2 — {Linha 3 a 18} Defina os pacotes que você deseja utilizar quando fizer o acesso à aplicação containerizada através do web browser.

3 — {Linha 24} Defina a porta que você deseja expor a solução que está sendo containerizada.

Criando a imagem Docker e testando o container (neste momento utilizarei o Docker for Windows para ilustrar o processo)

1 — Fazendo o build da imagem:

docker build -t utils/webssh:1.0 .

2 — ‘Executando’ a imagem construída anteriormente:

docker run -d -p 8080:8080 utils/webssh:1.0

3 — Acessando o container iniciado anteriormente:

Acesse o endereço http://localhost:8080 através de seu eb browser de preferência.

Informe o Usuário e Senha que você definiu nas linhas 11, 12 e 13 do arquivo docker-entrypoint.sh.

De acordo com as ferramentas que você instalou nas linhas 13 a 18 do arquivo Dockerfile interaja com outras aplicações e containers do cluster no qual este novo container foi iniciado :)

Desejo que estes exemplos sejam úteis, que além dos comandos e lógicas técnicas, a idéia possa gerar novas idéias! E ainda melhores!

Deixo aqui o agradecimento e mérito do time DevOps da Avenue Code {Edson, Clebio e Bernardo}, que muito me ensinou e que me apresentou esta solução : Vocês são feras e muito obrigado!

--

--