#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, размещенному в отдельной службе (общедоступной).