Это вывод netstat -an: tcp 0 0 127.0.0.1:5000 0.0.0.0:* СЛУШАТЬ - torpido 3 часа a go
Это подтверждает правильность @Arghya Sadhu подозревает, что ваша проблема связана с тем, что ваше приложение настроено на прослушивание только на localhost
адрес , что означает, что доступен только локально . Это было бы более ясно, если бы вы вставили свой результат netstat
с заголовками, описывающими содержимое каждого столбца.
Взгляните на пример. Чтобы проиллюстрировать идею, я развернул набор nginx Pods
из , пример доступен в официальных документах k8s.
После перечисления доступных модулей и прикрепления к одному из них через kubectl exec
Я выполнил команду netstat -ntlp
:
root@nginx-deployment-pod1:/# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
Как вы можете видеть, вывод в третьем столбце сильно отличается от вашего примера. 0 0.0.0.0:80
означает, что сервер nginx прослушивает все адреса IPv4, назначенные всем сетевым интерфейсам в этой системе (в данном случае container
или Pod
). Вы можете перечислить все доступные сетевые интерфейсы и адреса с помощью команд ip a
или ifconfig
.
Взгляните на свою команду:
curl -i \
--header "Content-Type: application/json" \
--request POST \
--data '[[5.1, 3.5, 1.4, 0.2]]' \
localhost:5000/predict
Вы указали, что хотите связаться с вашим app на порту 5000 на localhost
, но тот факт, что оно доступно на localhost
, не означает, что оно будет доступно и за пределами Pod
. Давайте еще раз посмотрим на ваш вывод netstat
(на этот раз с заголовками):
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN
Как видите, ваше приложение прослушивает или, другими словами, привязывается только к адресу localhost
(127.0.0.1 ). Как упоминал @Arghya Sadhu, он обычно настраивается где-то в коде приложения или в файлах конфигурации, если таковые имеются. они должны быть сначала предоставлены Pod
, что означает, что приложение, работающее с Pod
, должно быть настроено для прослушивания всех локальных IP-адресов.
Возвращаясь к нашему nginx Например, , он слушает 0.0.0.0:80
, потому что он настроен на это. Это делается с помощью следующей директивы, присутствующей в файле конфигурации /etc/nginx/conf.d/default.conf
:
server {
listen 80;
server_name localhost;
...
или, более конкретно, в этой строке:
listen 80;
Это равно:
listen 0.0.0.0:80;
Это в основном означает «прослушивать все IP-адреса / все сетевые интерфейсы на порту 80» . Если мы изменим его на:
listen localhost:80;
или
listen 127.0.0.1:80;
nginx, будет прослушиваться только адрес loclhost (127.0.0.1), и это будет доступный только локально, т.е. из Pod
.
Каждое приложение делает это по-своему. Если вы развертываете в kubernetes какое-то настраиваемое приложение, которое не поставляется с файлами конфигурации, которые позволяют вам определять прослушивание или привязку IP-адреса, скорее всего, оно жестко запрограммировано в коде приложения, поэтому вам нужно найти фрагмент, который за него отвечает . Специально ищите записи, содержащие localhost
или 127.0.0.1
, и измените его на 0.0.0.0
, что означает все IP-адреса, поиск строк, содержащих ключевые слова listen
или bind
, также может быть полезным.