Внешняя внешняя интерфейсная служба (NodePort) не может взаимодействовать с внутренней доступной серверной службой (ClusterIP)

#node.js #express #kubernetes

Вопрос:

Приложение состоит из 3 компонентов: интерфейса, бэкенда и Redis. Интерфейс взаимодействует только с серверной частью, служба Redis взаимодействует только с серверной службой. Все модули работают правильно, по крайней мере, журналы не показывают ничего тревожного.

Серверная часть построена с помощью NodeJS/ExpressJS, интерфейс: с помощью React.

Службы настраиваются следующим образом:

frontend:

 apiVersion: v1 kind: Service metadata:  name: plg-frontend  labels:  name: plg-frontend-service  app: playground-app spec:  type: NodePort  ports:  - port: 80  targetPort: 80  nodePort: 30010  protocol: TCP  selector:  name: plg-frontend-pod  app: playground-app  

backend:

 apiVersion: v1 kind: Service metadata:  name: plg-backend  labels:  name: plg-backend-service  app: playground-app spec:  ports:  - port: 4000  targetPort: 5011  selector:  name: plg-backend-pod  app: playground-app  

Все службы работают правильно:

 kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE plg-backend ClusterIP 10.233.23.12 lt;nonegt; 4000/TCP 2d3h plg-frontend NodePort 10.233.63.20 lt;nonegt; 80:30010/TCP 2d3h redis ClusterIP 10.233.59.37 lt;nonegt; 6379/TCP 2d3h  

На данный момент интерфейс, работающий на IP-адресе хоста, скажем http://10.11.12.13:30010, пытается вызвать внутреннюю конечную точку серверной части, поэтому 10.233.23.12:5011 (серверная targetPort часть ). Время ожидания соединения истекло. Должен ли я предоставить внутреннюю службу, чтобы она стала NodePort доступной?

Ответ №1:

Нет необходимости раскрывать информацию с помощью NodePort, если вы не собираетесь предоставлять доступ к внутренней службе в сети хоста. Ваш интерфейс должен вызывать 10.233.23.12:4000, а не 5011, который прослушивают вспомогательные модули.

Комментарии:

1. Спасибо, @gohm’c! Я exec вошел во внешний контейнер и попытался отправить несколько запросов, используя URL — адрес curl бэкенда 10.233.23.12:4000-все они получили ответы, поэтому бэкэнд доступен внутри. Однако до сих пор безуспешно пытаются добиться такого же поведения на веб — сайте-интерфейс отправляет запросы, которые в конечном итоге истекают. Все службы и модули были перезапущены. У меня закончились идеи, как это исправить.

2. ...no success trying to achieve the same behavior in the website - the frontend sends requests... — под «интерфейсом» здесь вы имели в виду реакцию, запущенную в браузере на стороне клиента ? Если это правда, вы не можете этого сделать, так как они не находятся в одной сети. Если ваш модуль не работает на узле с общедоступным IP-адресом, вы можете подключиться через lt;общедоступный IPgt;:lt;общедоступный IPgt;lt;Порт узла #gt;.