интерфейс Vue.js приложение в контейнере Kubernetes docker не может подключиться к серверной части

#docker #vue.js #docker-networking

#docker #vue.js #kubernetes #axios

Вопрос:

Я создал интерфейс Vue.js приложение, запущенное в контейнере docker в среде kubernetes. серверная часть также находится в том же кластере kubernetes (я использую Minikube для проекта). При запуске он выдает ошибку net::ERR_NAME_NOT_RESOLVED при подключении к внутренним контейнерам: введите описание изображения здесь

находясь внутри контейнера, нет проблем с подключением к серверной части с помощью curl:

 $ kubectl exec -it deployment/hpl-browser-deployment -- sh
/ # curl http://hpl-manager-service:2354
{
  "message": "Manager status", 
  "state": "IDLE"
}
  

Я использовал axios для службы api:

 import axios from 'axios';

export default class APIService {
  API_URL = '';

  constructor(apiAddress) {
    this.API_URL = apiAddress;
  }

  async get() {
    console.log('ApiService: get()');
    try {
      const response = await axios.get(this.API_URL);
      console.log(`ApiService: get result: ${response.data}`);
      return response.data;
    } catch (error) {
      console.error(error);
      return error;
    }
  }

  async postPlainText(data) {
    console.log(`ApiService: post() - data: ${data}`);
    try {
      const response = await axios.post(this.API_URL,
        data,
        {
          headers: {
            'Content-Type': 'text/plain',
            Accept: '*/*',
          },
        });
      console.log(`ApiService: post result: ${response.data}`);
      return response.data;
    } catch (error) {
      console.error(error);
      return error;
    }
  }
}
  

У приложения нет проблем с запуском в среде разработки, когда я переношу серверную службу и подключаюсь к http://localhost:2354 .

Я хотел бы знать, что может вызвать эту проблему?

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

1. Интерфейс размещен только в контейнере, но запускается из браузера в клиенте. Для его работы ваша серверная часть также должна быть доступна из браузера на клиенте.

2. Спасибо @jbud, не могли бы вы подробнее рассказать? Разве клиент браузера не подключается к интерфейсу в контейнере, а затем к интерфейсу, отправляющему команды API и получающему ответы в / из серверной части, поэтому связь должна происходить только между интерфейсной частью и серверной частью внутри одного и того же кластера kubernetes (у меня естьдобавлены дополнительные сведения о моей настройке, поэтому я использую Minikube, интерфейсные и серверные контейнеры работают в одном кластере kubernetes.

3. Ваш интерфейс и серверная часть могут работать в отдельных кластерах, это не имеет значения. Клиентом в этом случае является браузер пользователя. Интерфейс просто размещается в контейнере, клиент загружает его на свою рабочую станцию, поэтому API (серверная часть) должна быть доступна для браузера пользователя. На самом деле не имеет значения, что контейнер, в котором размещен интерфейс, может взаимодействовать с серверной частью. Если бы вы запускали сценарии на стороне сервера, это имело бы значение. Теперь у вас фактически работает только скрипт на стороне клиента.

4. Связь между интерфейсом и серверной частью осуществляется не через контейнер интерфейса, а напрямую от клиента к серверной части.

5. Я понимаю, что вы имеете в виду, поэтому в этом случае мне нужно будет предоставить свой серверный сервер, а затем сохранить IP-адрес во внешнем интерфейсе, чтобы клиент мог подключиться к серверной службе? Но я помню, что большинству приложений нужно только указать интерфейсный IP-адрес?

Ответ №1:

Ваш интерфейс vue.js приложение просто размещается в контейнере. Приложение фактически запускается из браузера клиента. Ваш серверный интерфейс, который функционирует как API, также должен быть доступен для браузера клиента. Связь между интерфейсом и серверной частью осуществляется не через контейнер интерфейса, а напрямую от клиента к серверной части.

Соединение между интерфейсным контейнером и внутренним контейнером в этом случае не используется / не требуется, поскольку вы ничего не рендерите из интерфейсного контейнера, прежде чем отвечать клиенту. Если вы используете технологию рендеринга на стороне сервера, такую как PHP, Django, .net, Nodejs и т. Д., При которой вам необходимо подключиться к серверной части, чтобы получить некоторые данные и отобразить что-то перед ответом клиенту, тогда соединение между интерфейсным контейнером и внутренним контейнером будетактуально.

Ваша текущая настройка ничем не отличается от размещения вашего приложения / кода на CDN и доступа к API, размещенному в отдельной службе (общедоступной).