Agora estou tentando executar um contêiner simples com shell (/ bin / bash) em um cluster Kubernetes.
Eu pensei que havia uma maneira de manter um contêiner em execução em um contêiner do Docker usando pseudo-tty
e desanexando a opção ( -td
opção no docker run
comando).
Por exemplo,
$ sudo docker run -td ubuntu:latest
Existe uma opção como esta no Kubernetes?
Eu tentei executar um contêiner usando um kubectl run-container
comando como:
kubectl run-container test_container ubuntu:latest --replicas=1
Mas o contêiner sai por alguns segundos (como iniciar com o docker run
comando sem as opções mencionadas acima). E o ReplicationController o lança novamente repetidamente.
Existe uma maneira de manter um contêiner em execução no Kubernetes como as -td
opções no docker run
comando?
docker
containers
kubernetes
google-kubernetes-engine
Springwell
fonte
fonte
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Respostas:
Um contêiner sai quando seu processo principal termina. Fazendo algo como:
manter o contêiner aberto é francamente um truque que deve ser usado apenas para testes e exemplos rápidos. Se você quiser apenas um contêiner para teste por alguns minutos, eu faria:
O que tem a vantagem de o contêiner sair automaticamente se você o esquecer. Como alternativa, você pode colocar algo assim em um
while
loop para mantê-lo em execução para sempre ou apenas executar um aplicativo como otop
. Tudo isso deve ser fácil no Kubernetes.A verdadeira questão é por que você quer fazer isso? Seu contêiner deve estar fornecendo um serviço, cujo processo manterá o contêiner em execução em segundo plano.
fonte
cat
sem argumentos etop
esleep
com o argumento de grande número.sleep infinity
funciona em muitos casos (não busybox)Os contêineres devem ser executados até a conclusão. Você precisa fornecer ao seu contêiner uma tarefa que nunca será concluída. Algo assim deve funcionar:
fonte
ubuntu
e tentei abash
imagem, mas não consegui fazê-la funcionar. Alguma idéia de como fazer o mesmo com estabash
imagem?Você pode usar esse CMD em
Dockerfile
:Isso manterá seu recipiente vivo até que seja solicitado que ele pare. O uso de trap and wait fará com que seu contêiner reaja imediatamente a uma solicitação de parada . Sem parar a captura / espera, levará alguns segundos.
Para imagens baseadas em busybox (usadas em imagens alpinas), o sono não conhece o argumento infinito. Esta solução alternativa fornece a mesma resposta imediata a um
docker stop
exemplo no exemplo acima:fonte
No seu Dockerfile, use este comando:
Crie sua imagem do Docker.
fonte
Para manter um POD em execução, o POD deve executar determinadas tarefas, caso contrário, o Kubernetes achará desnecessário e, portanto, será encerrado. Existem muitas maneiras de manter um POD em execução.
Eu enfrentei problemas semelhantes quando precisei de um POD apenas para executar continuamente sem fazer nada. A seguir, estão as duas maneiras pelas quais isso funcionou para mim:
Embora a primeira opção seja mais fácil que a segunda e possa ser suficiente, não é a melhor opção. Como, há um limite até o número de segundos que você irá atribuir no comando de suspensão. Mas um contêiner com loop infinito rodando dentro dele nunca sai.
No entanto, descreverei as duas maneiras (considerando que você está executando o container busybox):
1. Comando de suspensão
2. Loop infinito
Execute o seguinte comando para executar o pod:
Espero que ajude!
fonte
Consegui fazer isso funcionar com o comando
sleep infinity
no Kubernetes, que manterá o contêiner aberto. Veja esta resposta para alternativas quando isso não funcionar.fonte
sleep infinity
mantém o contêiner aberto, fornecendo o mesmo tipo de funcionalidade que a pergunta faz (para a maioria dos tipos de contêineres). Ele também fornece um link para alternativas para casos em que o comando específico não trabalhoO comando mais simples possível para o k8s pod manifest executar o contêiner para sempre:
fonte
Use este comando dentro do Dockerfile para manter o contêiner em execução no cluster do K8s:
fonte
No meu caso, um pod com um initContainer falhou ao inicializar. Em execução
docker ps -a
e, em seguida,docker logs exited-container-id-here
me deu uma mensagem de log quekubectl logs podname
não foi exibida. Mistério resolvido :-)fonte
Existem muitas maneiras diferentes de conseguir isso, mas uma das mais elegantes é:
fonte
Meus poucos centavos sobre o assunto. Supondo que
kubectl
esteja funcionando, o comando mais próximo que seria equivalente ao comando docker que você mencionou na sua pergunta seria algo parecido com isto.O comando acima criará um único
Pod
nodefault
espaço para nome e executará osleep
comando com oinfinity
argumento - dessa forma, você terá um processo que é executado em primeiro plano, mantendo o contêiner ativo.Afterwords, você pode interagir
Pod
executando okubectl exec
comandoEssa técnica é muito útil para criar um recurso de Pod e depuração ad-hoc.
fonte
--restart=Never
, basta ligarkubectl run ubuntu --image=ubuntu -- sleep infinity