Как запустить образ докера на kubernetes, который принимает аргументы командной строки? - PullRequest
0 голосов
/ 29 января 2019

У меня есть образ докера, который содержит файл python, который принимает аргументы из командной строки, используя sys.stdin ().Я могу запустить образ с помощью следующей команды

cat file.csv |docker run -i -t my_image

Он передает содержимое файла file.csv в образ, и я получаю вывод, как и ожидалось.

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

kubectl run -i my_deployment --image = gcr.io / $ {PROJECT_ID} / my_image: v1 --port 8080

Он построил развертывание, и я вижу запущенные модули.Затем я раскрываю его.

kubectl раскрываю развертывание my_deployment --type = LoadBalancer --port 80 --target-port 8080

Но если я пытаюсь получить к нему доступ, используяIP-адрес, назначенный с помощью curl,

curl http://allocated_ip

я получаю ответ «соединение отклонено».

Как можно развернуть этот образ докера какслужба на kubernetes и отправить содержимое файла в качестве входа в службу?Нужен ли для этого веб-сервер?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Поскольку вы передаете файл в качестве аргумента при запуске команды, это заставляет меня думать, что, как только у вас есть содержимое контейнера, вам не нужно обновлять содержимое csv.

Лучший подходчтобы выполнить операцию чтения этого файла, необходимо ADD этот файл в вашем Dockerfile и открыть файл с помощью функции open .

У вас будетстрока типа

ADD file.csv /home/file.csv

И в вашем коде Python что-то вроде:

file_in = open(‘home/file.csv’, ‘r’)

Обратите внимание, что если вы хотите изменить файл, вам нужно обновить Dockerfile, собрать заново, нажатьв реестр и переустановить в GKE.Если вы не хотите следовать этому процессу, вы можете использовать ConfigMap .

Кроме того, если он отвечает на ваш вопрос, обязательно укажите тот же вопрос на serverfault

0 голосов
/ 30 января 2019

Kubernetes обычно предполагает, что контейнеры, которые он развертывает, являются долгоживущими и автономными.Если вы развертываете что-то в модуле Pod, в частности, через развертывание, оно должно работать самостоятельно без каких-либо конкретных входных данных.Если он немедленно завершится, Kubernetes перезапустит его, и вы быстро окажетесь в ужасном состоянии CrashLoopBackOff.

Короче: вам нужно изменить дизайн контейнера, чтобы он не использовал stdin, а stdout является его основным интерфейсом..

Ваш инстинкт добавления сетевой конечной точки в службу, вероятно, верен, но Kubernetes не будет делать это самостоятельно.Если вы перестраиваете свое приложение, чтобы иметь, скажем, сервер Flask и прослушивать порт, это то, что вы можете легко развернуть в Kubernetes.Если приложение ожидает поступления данных на стандартный ввод, а его результаты - на стандартный вывод, добавление сетевых метаданных Kubernetes ничего не поможет: в вашем примере, если ничего не прослушивается внутри контейнера на порте 8080, сетевое соединение никогда не прекратится..

0 голосов
/ 29 января 2019

Я предполагаю, что Kubernetes работает в помещениях.Я бы сделал следующее.

  • Создание развертывания nginx или apache.Используя Helm, очень просто с

helm install stable / nginx-ingress

  • Создать развертывание с портом 8080,или что бы вы не выставили, запустив его с помощью докера.Фактическое развертывание будет иметь API, который я мог бы отправлять контент через POST.

  • Создать службу с портом 8080 и targetPort 8080. Это должен быть тип ClusterIP.

  • Создание входа с именем хоста и портом службы 8080.

...