jQuery вызов REST API не работает в Docker / Kubernetes - PullRequest
0 голосов
/ 08 февраля 2020

Это Java приложение REST API для весенней загрузки, использующее индекс. html для представления пользователю пользовательской веб-страницы. Когда отображается индекс. html, он запускает logi c из Javascript / jQuery, чтобы выполнить вызов API REST (закодированный как показано ниже), для серверной службы в классе контроллера Java, чтобы получить 2 случайные сгенерированные числа:

$.ajax({
    url: "http://localhost:8080/multiplications/random"

Программа работает нормально при запуске ее как приложения Spring Boot в Eclipse!

Однако она не работает после того, как я использовал файл .jar для создания Docker файл образа затем развернул его с помощью Kubernetes / minikube (я новичок в Docker / Kubernetes).

вот док-файл для создания файла образа с использованием .jar:

FROM openjdk:latest

ADD target/social-multiplication-v3-0.3.0-SNAPSHOT.jar app.jar

ENTRYPOINT ["java","-jar","app.jar"]

EXPOSE 8080

Вот файл deploy.yaml:

---
kind: Service
apiVersion: v1
metadata:
  name: multiplicationservice
spec:
  selector: 
      app: multiplication
  ports:
     - protocol: "TCP"
       port:  80
       targetPort:  8080
       nodePort:  30001
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mdeploy
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: multiplication
  template:
    metadata:
      labels:
        app: multiplication
    spec:
      containers:
      - name: multiplication
        image: huxianjun/multiplication
        ports:
        - containerPort: 80

и IP-адрес хоста, на котором развернуто приложение в Kubernetes:

$ minikube ip
192.168.99.101

В конце я могу добраться до index. html страница из браузера по следующему URL:

http://192.168.99.101:30001/

Страница отображается должным образом - что НЕ работает, следующий вызов API REST не произошел, поэтому 2 числа не возвращаются из вызов и отображается на дисплее ge:

$.ajax({
    url: "http://localhost:8080/multiplications/random"

Я думаю, это вызвано тем, что 'localhost' и порт '8080' не выровнены с тем номером порта, # определенным в файле deploy.yaml? или даже что-то противоречит «EXPOSE 8080» в файле документации?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

В вашем случае вы вызываете команду $.ajax из своего браузера, который находится на вашем хост-компьютере, следовательно, эти вызовы API будут отправляться с вашего локального компьютера, но не внутри вашего docker контейнера.

Чтобы решить эту проблему, вы можете обновить URL-адрес, используя http://192.168.99.101:30001/, например:

$.ajax({
    url: "http://192.168.99.101:30001/multiplications/random"
0 голосов
/ 08 февраля 2020

Попробуйте запустить sudo lsof -i :8080, если вы используете linux. Он покажет все ваши доступные порты. Если вы не видите порт 8080, порт вашего приложения недоступен и видим для вашего локального хоста. Это потому, что Docker контейнеры «закрыты / изолированы» для всех внешних процессов и файлов. Более того, инструкции EXPOSE 8080 в Dockerfile недостаточно. Попробуйте docker run -p 8080:8080 YOUR_CREATED_IMAGE_NAME. Он создаст перенаправление из docker контейнера localhost: 8080 на Ваш localhost: 8080

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...