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
Nota:
O duplo traço (--
) separa os argumentos que você deseja passar para o comando dos argumentos do kubectl
.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
Nota:
As opções curtas-i
e -t
são equivalentes às opções longas --stdin
e --tty
Próximos passos
- Leia mais sobre
kubectl exec