Теперь я пытаюсь запустить простой контейнер с оболочкой (/ bin / bash) в кластере Kubernetes.
Я думал, что есть способ поддерживать работу контейнера в контейнере Docker, используя pseudo-tty
опцию и отсоединение ( -td
опция в docker run
команде).
Например,
$ sudo docker run -td ubuntu:latest
Есть ли в Kubernetes такая возможность?
Я пробовал запустить контейнер с помощью такой kubectl run-container
команды:
kubectl run-container test_container ubuntu:latest --replicas=1
Но контейнер выходит на несколько секунд (точно так же, как запуск с помощью docker run
команды без параметров, о которой я упоминал выше). И ReplicationController снова запускает его повторно.
Есть ли способ, чтобы контейнер работал в Kubernetes, как -td
параметры в docker run
команде?
docker
containers
kubernetes
google-kubernetes-engine
Springwell
источник
источник
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Ответы:
Контейнер закрывается, когда завершается его основной процесс. Сделать что-то вроде:
Откровенно говоря, держать контейнер открытым - это хитрость, которую следует использовать только для быстрых тестов и примеров. Если вам нужен контейнер для тестирования на несколько минут, я бы сделал:
Это имеет то преимущество, что контейнер автоматически выйдет, если вы забудете об этом. В качестве альтернативы вы можете поместить что-то подобное в
while
цикл, чтобы он работал вечно, или просто запустить приложение, напримерtop
. Все это должно быть легко сделать в Kubernetes.Настоящий вопрос в том, зачем вам это нужно? Ваш контейнер должен предоставлять службу, процесс которой будет поддерживать работу контейнера в фоновом режиме.
источник
cat
без аргументовtop
иsleep
с аргументом большого числа.sleep infinity
работает во многих случаях (не в busybox)Контейнеры предназначены для работы до завершения. Вам нужно предоставить своему контейнеру задачу, которая никогда не завершится. Примерно так должно работать:
источник
ubuntu
и пробовалbash
изображение, но не смог заставить его работать. Есть идеи, как сделать то же самое сbash
изображением?{"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}
(только json, потому что здесь yaml не будет форматироваться в комментариях). Важный бит/bin/sh
вместо/bin/bash
.Вы можете использовать этот CMD в своих
Dockerfile
:Это сохранит ваш контейнер в живых до тех пор, пока он не остановится. Использование trap и wait заставит ваш контейнер немедленно реагировать на запрос остановки . Без прерывания / ожидания остановка займет несколько секунд.
Для изображений на основе busybox (используемых в изображениях на основе alpine) сон не знает аргумента бесконечности. Этот обходной путь дает тот же немедленный ответ, что
docker stop
и в приведенном выше примере:источник
В вашем Dockerfile используйте эту команду:
Создайте свой образ докера.
источник
Чтобы POD продолжал работать, он должен выполнять определенную задачу, иначе Kubernetes сочтет это ненужным, поэтому он останавливается. Есть много способов сохранить работоспособность POD.
Я столкнулся с аналогичными проблемами, когда мне нужно было, чтобы POD просто работал непрерывно, не выполняя каких-либо полезных операций. Вот два способа, которые у меня сработали:
Хотя первый вариант проще, чем второй, и может удовлетворять требованиям, это не лучший вариант. Как, существует ограничение на количество секунд, которое вы собираетесь назначить в команде сна. Но контейнер с бесконечным циклом внутри него никогда не выходит.
Однако я опишу оба способа (учитывая, что вы используете контейнер busybox):
1. Команда сна
2. Бесконечный цикл
Выполните следующую команду, чтобы запустить модуль:
Надеюсь, поможет!
источник
Мне удалось заставить это работать с командой
sleep infinity
в Kubernetes, которая будет держать контейнер открытым. См. Этот ответ, чтобы узнать об альтернативах, если это не сработает.источник
sleep infinity
сохраняет контейнер открытым, обеспечивая тот же тип функциональности, о котором задается вопрос (для большинства типов контейнеров). Он также предоставляет ссылку на альтернативы для случаев, когда эта конкретная команда не работаетСамая простая команда для манифеста модуля k8s, позволяющая запускать контейнер навсегда:
источник
Используйте эту команду внутри Dockerfile, чтобы контейнер работал в кластере K8s:
источник
В моем случае модуль с initContainer не удалось инициализировать. Запуск,
docker ps -a
а затемdocker logs exited-container-id-here
дал мне сообщение журнала, котороеkubectl logs podname
не отображалось. Тайна раскрыта :-)источник
Для этого есть много разных способов, но один из самых элегантных :
источник
Мои несколько центов по этой теме. Предполагая, что
kubectl
это работает, ближайшая команда, которая будет эквивалентна команде docker, которую вы упомянули в своем вопросе, будет примерно такой.Выше команда будет создавать единую
Pod
вdefault
пространстве имен , и он будет выполнятьsleep
команду сinfinity
аргументом -за образом , вы будете иметь процесс , который запускается в контейнере на переднем плане угаснуть.Послесловие, с которым вы можете взаимодействовать
Pod
, запустивkubectl exec
команду.Этот метод очень полезен для создания ресурса Pod и специальной отладки.
источник
--restart=Never
, просто позвонитеkubectl run ubuntu --image=ubuntu -- sleep infinity