Подтвердить что ты не робот

Как я могу сохранить контейнер работающим на 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?

4b9b3361

Ответ 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 просто для непрерывной работы, ничего не делая. Вот два способа, которые спомогли мне:

  1. Запускает команду сна во время работы контейнера.
  2. Запуск бесконечного цикла внутри контейнера.

Хотя первый вариант проще, чем второй и может удовлетворять требованию, это не лучший вариант. Кроме того, существует ограничение на количество секунд, которые вы собираетесь назначить в команде сна. Но контейнер с бесконечным циклом внутри никогда не выходит.

Однако я опишу оба способа (учитывая, что вы используете контейнер 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:

  • Хвост CMD -f/dev/null