Como executar comandos dentro de contêineres de pod do Kubernetes

0
20


Os aplicativos executados no Kubernetes geralmente são serviços de longa duração com os quais você não precisa interagir. No entanto, às vezes você pode querer executar manualmente um comando dentro de um contêiner, talvez para uma operação de manutenção única ou para auxiliar em um procedimento de depuração.

Neste artigo, mostraremos como executar comandos e obter sessões de shell interativas dentro de contêineres do Kubernetes. Isso permitirá que você inicie processos no contêiner usando seu terminal local. Ele é totalmente integrado ao Kubernetes e sua CLI Kubectl, para que você não precise poluir suas imagens de contêiner com um daemon SSH para habilitar o acesso remoto.

Usando o Kubectl Exec

kubectl exec execute um comando dentro de um contêiner em execução. Possui a seguinte sintaxe básica:

$ kubectl exec demo-pod -- demo-command

isso vai rodar demo-command dentro do primeiro recipiente demo-pod Bainha. O comando é executado com privilégios de root.

São necessários sinalizadores adicionais para configurar uma sessão de terminal interativa:

  • --stdin (-i) – Passe o fluxo de entrada padrão do seu terminal para o contêiner.
  • --tty (-t) – Marque o fluxo de entrada padrão como um TTY, tornando-o interativo.

Aqui está um exemplo de como obter um shell para o primeiro contêiner em um pod:

$ kubectl exec -it demo-pod -- /bin/sh

tudo depois do -- ele se torna parte do comando que é executado dentro do contêiner. kubectl exec ignora o ponto de entrada padrão do contêiner e, em vez disso, inicia um novo processo com o comando especificado. Você não deve envolver o comando com aspas ("/bin/sh") a menos que você normalmente os use ao executar o comando localmente.

Escolha um recipiente diferente

kubectl exec se conecta ao contêiner padrão do pod quando nenhum outro argumento é fornecido. O contêiner padrão é aquele com o kubectl.kubernetes.io/default-container anotação. Este será o primeiro contêiner no pod se você não tiver adicionado manualmente a anotação a nenhum outro.

Aqui está um Pod que executa dois contêineres:

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: app-container
      image: nginx:latest
    - name: sidecar-container
      image: busybox:latest

Você pode executar um comando dentro do sidecar-container adicionando o -c bandeira para kubectl exec:

$ kubectl exec --it demo-pod -c sidecar-container -- /bin/sh

Aguardando a execução dos pods

Kubectl aguardará um minuto para que o Pod seja Running se seus contêineres ainda não foram iniciados quando você executa o exec domínio. Este valor de tempo limite pode ser alterado com o --pod-running-timeout bandeira. Isso é útil quando você deseja executar um comando imediatamente após criar um novo Pod, quando ele pode não ter sido agendado para um Node.

$ kubectl exec --pod-running-timeout=5m demo-pod -- demo-command

Quando devo usá-lo?

kubectl exec é melhor reservado para situações especializadas em que você precisa interagir diretamente com o sistema de arquivos de um contêiner. Você pode usá-lo para acessar logs ou caches após um problema ou para executar um script de limpeza usado com pouca frequência fornecido em uma imagem de contêiner.

A pesar de que kubectl exec permite que você execute qualquer comando, você deve evitar modificar drasticamente o ambiente do contêiner. Isso pode fazer com que o contêiner se desvie do estado esperado. Os recipientes normalmente não devem exigir intervenção, portanto, usar kubectl exec em ambientes de produção, geralmente indica que algo deu errado.

Não use este comando para instalar pacotes ou aplicar atualizações dentro do contêiner. Esse tipo de operação deve ser tratado criando uma nova imagem de contêiner que inclua as alterações e, em seguida, substituindo os pods do Kubernetes por aqueles que executam a versão revisada. Seguir esse princípio garante que suas alterações não sejam perdidas quando o Pod for reinicializado e retornar ao sistema de arquivos da sua imagem de contêiner. Manter seus contêineres imutáveis ​​também garante que eles possam ser reproduzidos de forma confiável a partir de suas imagens, o que melhora a confiabilidade e a facilidade de depuração.

Resumo

A execução de um único comando dentro de um contêiner do Kubernetes permite depurar problemas, realizar manutenção e inspecionar o sistema de arquivos do contêiner. Em cada uma dessas situações, você pode usar kubectl exec para obter uma conexão com um contêiner.

Adicionando o -it A combinação de sinalizadores encaminhará o fluxo de entrada padrão do seu terminal como um TTY, fornecendo uma sessão de shell interativa. Isso nem sempre será necessário dependendo de qual comando você deseja usar: se ele apenas produz saída, sem exigir nenhuma entrada, você pode omitir os sinalizadores com segurança.