клиентский интерфейс React, серверная часть node js, развертывание monogo db в виде микросервисов на kuberenetes minikube

Мое приложение

      React Front-end <------> Nodes js back-end <------> mongodb

Исходный код можно загрузить с здесь

Вы можете развернуть указанную выше команду ./setup.sh на minikube kubernetes

1) развертывание mongoDB с ресурсом службы типа clusterIP

2) Сервер js бэкэнд-узла с сервисным ресурсом типа clusterIP

3) интерфейсная сборка React с сервисным ресурсом типа nginx и LoadBalancer

Доступ к модулю monogdb из модуля node js с использованием полного доменного имени службы mongodb работает нормально, поскольку служба mongodb является IP-типом кластера, а доступ из модуля nodejs работает плавно.

У меня проблемы с общением с использованием axios из реакции (сборки) с использованием полного доменного имени ресурса внутренней службы. Он говорит:

**POST http://todo-backend-service:5000/init net::ERR_NAME_NOT_RESOLVED**

Я даже пробовал использовать IP-адрес кластера с портом 5000 вместо FQDN, но не работал.

Кажется, это проблема после сборки или еще чего?

Решение будет оценено.


person A-P    schedule 01.10.2019    source источник


Ответы (1)


Итак, проблема здесь в том, что интерфейсное приложение делает запросы из вашего браузера (это на стороне клиента, а не на стороне сервера), что означает, по сути, что вам нужно сделать, это открыть свой сервер node.js

Пример: если вы используете Minikube, вы можете сделать что-то очень простое: измените тип службы для вашего node.js на тип Loadbalancer:

apiVersion: v1
kind: Service
metadata:
  name: todo-backend-service
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: todo-server-app
  type: LoadBalancer

Затем вам нужно будет запустить:

minikube service todo-backend-service --url
# OUTPUT
http://192.168.99.113:30048

Этот IP-адрес и порт - это то, что ваш интерфейс должен использовать для подключения к бэкэнду node.js:

curl -X POST http://192.168.99.113:30048/todo/list
# OUTPUT
{"error":"Please login first."}

Обратите внимание: при перечислении элементов обычно следует использовать запрос GET.

Обоснование примера:

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

person Spazzy757    schedule 02.10.2019
comment
Спасибо за столь подробный ответ. Я был верен в данных React JS, когда make build переходит на клиентскую сторону и выходит за пределы кластера, поэтому о ClusterIP не может быть и речи. Служба типа LB, так как вы также отправили вывод, работает нормально, но есть ли способ иметь полное доменное имя или альтернативу абсолютному IP-адресу и порту (я знаю, что порт может быть исправлен, но я считаю, что это не лучший вариант для его жесткого кодирования) спины -окончить сервис. Поскольку при каждом развертывании необходимо пойти и проверить IP-адрес и порт svc на сервере, а затем изменить абсолютный IP-адрес и порт во внешнем Dockerfile и снова создать новую сборку для развертывания, и для этого требуется небольшая дополнительная работа для развертывателя. - person A-P; 02.10.2019
comment
Что касается POST, я где-то читал, что POST лучше при отправке токена аутентификации, пароля и т. д. в запросе. Поправьте меня, если я все еще ошибаюсь. - person A-P; 02.10.2019
comment
Таким образом, способ указания этого URL-адреса не должен выполняться в вашем Dockerfile, вы должны иметь возможность указать это через переменную среды, то есть BACKEND_URL = ‹url-to-backend› (посмотрите 12-факторные приложения). Есть способ настроить полное доменное имя, но вам нужно будет настроить вход определенного типа, что немного сложнее на Minikube, чем на облачном провайдере. Затем вам нужно будет настроить DNS для маршрутизации на этот IP-адрес. Но я считаю, что это должен быть другой вопрос, и он отличается от этой проблемы. - person Spazzy757; 02.10.2019