конечная точка выставлена, но попытка использовать netstat из другого модуля в том же пространстве имен не может ее достичь - PullRequest
0 голосов
/ 18 июня 2020

Любая помощь будет принята с благодарностью.

Я пытаюсь отправить запрос от модуля к модулю внутри кластера k8s в том же пространстве имен, запущенном на AWS.

Я добавил модуль, который обслуживает запросы, поступающие с порта 5000, из модуля мне удалось успешно запустить команду curl:

curl -i \
  --header "Content-Type: application/json" \
  --request POST \
  --data '[[5.1, 3.5, 1.4, 0.2]]' \
  localhost:5000/predict

Я добавил службу в модуль, чтобы открыть конечную точку, чтобы я мог отправить трафик c к нему:

apiVersion: v1
kind: Service
metadata:
  annotations:
  name: sklearn-iris-bentoml-deployment-sklearn-iris-example
  namespace: bentoml
  ownerReferences:
  selfLink: /api/v1/namespaces/bentoml/services/sklearn-iris-bentoml-deployment-sklearn-iris-example
  labels:
    run: my-bentoml
spec:
  ports:
  - name: http
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    run: my-bentoml
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

Сервис:

➜ kubectl get svc -n bentoml
NAME                                                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
sklearn-iris-bentoml-deployment-sklearn-iris-example   ClusterIP   10.110.5.245   <none>        5000/TCP   5h6m

Конечная точка:

➜ k get endpoints sklearn-iris-bentoml-deployment-sklearn-iris-example -n bentoml
NAME                                                   ENDPOINTS             AGE
sklearn-iris-bentoml-deployment-sklearn-iris-example   10.110.115.108:5000   5h6m

Когда я пытаюсь подключиться через te lnet из другого модуля в том же пространстве имен, он не работает:

root@my-shell:/# telnet 10.110.115.108 5000
Trying 10.110.115.108...
telnet: Unable to connect to remote host: Connection refused

Я не уверен, следует ли мне настраивать DNS, поскольку у меня нет намерений отправлять трафик c извне кластера, поэтому сеть в основном сосредоточена внутри кластера

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Убедитесь, что модуль приложения прослушивает 0.0.0.0 вместо 127.0.0.1 или localhost. Обычно это можно изменить в коде приложения и зависит от языка приложения.

1 голос
/ 19 июня 2020

Это вывод 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, также может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...