Obter um Shell em um Contêiner em Execução

Esta página mostra como usar kubectl exec para obter um shell em um contêiner em execução.

Antes de você começar

Você precisa ter um cluster do Kubernetes e a ferramenta de linha de comando kubectl deve estar configurada para se comunicar com seu cluster. É recomendado executar esse tutorial em um cluster com pelo menos dois nós que não estejam atuando como hosts de camada de gerenciamento. Se você ainda não possui um cluster, pode criar um usando o minikube ou pode usar um dos seguintes ambientes:

Obtendo um Shell em um Contêiner

Neste exercício, você cria um Pod que possui um contêiner. O contêiner executa a imagem do nginx. Aqui está o arquivo de configuração para o Pod:

apiVersion: v1
kind: Pod
metadata:
  name: shell-demo
spec:
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  hostNetwork: true
  dnsPolicy: Default

Crie o Pod:

kubectl apply -f https://k8s.io/examples/application/shell-demo.yaml

Verifique se o contêiner está em execução:

kubectl get pod shell-demo

Obtenha um shell no contêiner em execução:

kubectl exec --stdin --tty shell-demo -- /bin/bash

No seu shell, liste o diretório raiz:

# Execute isso dentro do contêiner
ls /

No seu shell, experimente outros comandos. Aqui estão alguns exemplos:

# Você pode executar esses comandos de exemplo dentro do contêiner
ls /
cat /proc/mounts
cat /proc/1/maps
apt-get update
apt-get install -y tcpdump
tcpdump
apt-get install -y lsof
lsof
apt-get install -y procps
ps aux
ps aux | grep nginx

Escrevendo a página raiz para o nginx

Veja novamente o arquivo de configuração do seu Pod. O Pod possui um volume emptyDir, e o contêiner monta esse volume em /usr/share/nginx/html.

No seu shell, crie um arquivo index.html no diretório /usr/share/nginx/html:

# Execute isso dentro do contêiner
echo 'Hello shell demo' > /usr/share/nginx/html/index.html

No seu shell, envie uma solicitação GET para o servidor nginx:

# Execute isso no shell dentro do seu contêiner
apt-get update
apt-get install curl
curl http://localhost/

A saída exibe o texto que você escreveu no arquivo index.html:

Hello shell demo

Quando terminar de usar o shell, digite exit.

exit # Para sair do shell no contêiner

Executando comandos individuais em um contêiner

Em uma janela de comando comum, fora do seu shell, liste as variáveis de ambiente no contêiner em execução:

kubectl exec shell-demo -- env

Experimente executar outros comandos. Aqui estão alguns exemplos:

kubectl exec shell-demo -- ps aux
kubectl exec shell-demo -- ls /
kubectl exec shell-demo -- cat /proc/1/mounts

Abrindo um shell quando um Pod tem mais de um contêiner

Se um Pod tiver mais de um contêiner, use --container ou -c para especificar um contêiner no comando kubectl exec. Por exemplo, suponha que você tenha um Pod chamado my-pod, e esse Pod tenha dois contêineres chamados main-app e helper-app. O seguinte comando abriria um shell no contêiner main-app.

kubectl exec -i -t my-pod --container main-app -- /bin/bash

Próximos passos