#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;.