Как я могу сохранить контейнер работающим на Kubernetes?
Сейчас я пытаюсь запустить простой контейнер с оболочкой (/bin/bash) в кластере Kubernetes.
Я подумал, что есть способ сохранить контейнер на Docker-контейнере, используя опцию pseudo-tty
и detach (опция -td
в команде docker run
).
Например,
$ sudo docker run -td ubuntu:latest
Есть ли такой вариант в Кубернетесе?
Я попытался запустить контейнер с помощью команды kubectl run-container
например:
kubectl run-container test_container ubuntu:latest --replicas=1
Но контейнер выходит на несколько секунд (так же, как запуск с командой docker run
без параметров, которые я упоминал выше). И ReplicationController запускает его снова и снова.
Есть ли способ сохранить контейнер работающим в Kubernetes, например, опции -td
в команде docker run
?
Ответы
Ответ 1
Контейнер выходит, когда его основной процесс завершается. Выполнение чего-то вроде:
docker run -itd debian
чтобы держать контейнер открытым, является откровенно взломом, который должен использоваться только для быстрых тестов и примеров. Если вы просто хотите контейнер для тестирования в течение нескольких минут, я бы сделал:
docker run -d debian sleep 300
Что имеет преимущество, что контейнер автоматически выйдет, если вы забудете об этом. В качестве альтернативы вы можете поместить что-то вроде этого в цикле while
, чтобы он работал вечно, или просто запустить приложение, такое как top
. Все это должно быть легко сделать в Кубернете.
Реальный вопрос, почему вы хотите это сделать? Ваш контейнер должен предоставлять услугу, процесс которой будет поддерживать контейнер в фоновом режиме.
Ответ 2
Контейнеры должны выполняться до завершения. Вам необходимо предоставить вашему контейнеру задачу, которая никогда не закончится. Что-то вроде этого должно работать:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
Ответ 3
Вы можете использовать этот CMD в вашем Dockerfile
:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Это сохранит ваш контейнер живым, пока ему не скажут остановиться. Использование trap и wait заставит ваш контейнер немедленно отреагировать на запрос на остановку. Без ловушки/ожидания остановка займет несколько секунд.
Для изображений на основе busybox (используемых в альпийских изображениях) сон не знает об аргументе бесконечности. Этот обходной путь дает такой же немедленный ответ на docker stop
как в приведенном выше примере:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Ответ 4
-
В вашем Dockerfile используйте эту команду:
CMD ["sh", "-c", "tail -f /dev/null"]
-
Создайте изображение докеры.
- Нажмите на свой кластер или аналогичный, просто чтобы убедиться, что оно доступно.
-
kubectl run debug-container -it --image=<your-image>
Ответ 5
Я смог заставить это работать с командой sleep infinity
в Kubernetes, которая будет держать контейнер открытым. Посмотрите этот ответ для альтернатив, когда это не работает.
Ответ 6
Чтобы POD работал, POD должен выполнять определенную задачу, иначе Kubernetes сочтет это ненужным, поэтому он завершается. Есть много способов поддерживать работу POD.
Я сталкивался с подобными проблемами, когда мне нужно было POD просто для непрерывной работы, ничего не делая. Вот два способа, которые спомогли мне:
- Запускает команду сна во время работы контейнера.
- Запуск бесконечного цикла внутри контейнера.
Хотя первый вариант проще, чем второй и может удовлетворять требованию, это не лучший вариант. Кроме того, существует ограничение на количество секунд, которые вы собираетесь назначить в команде сна. Но контейнер с бесконечным циклом внутри никогда не выходит.
Однако я опишу оба способа (учитывая, что вы используете контейнер busybox):
1. Спящая команда
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "sleep 1000"]
nodeSelector:
beta.kubernetes.io/os: linux
2. Бесконечный цикл
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
nodeSelector:
beta.kubernetes.io/os: linux
Запустите следующую команду, чтобы запустить модуль:
kubectl apply -f <pod-yaml-file-name>.yaml
Надеюсь, поможет!
Ответ 7
Самая простая команда для манифеста модуля p8 для запуска контейнера навсегда:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
Ответ 8
В моем случае, pod с initContainer не удалось инициализировать. Запуск docker ps -a
, а затем docker logs exited-container-id-here
дал мне сообщение журнала, которое kubectl logs podname
не отображалось. Тайна решена: -)
Ответ 9
Используйте эту команду внутри вашего Dockerfile, чтобы поддерживать работу контейнера в вашем кластере K8s: