Вы пытаетесь получить доступ к службе шлюза из браузера клиента.
Я хотел бы предложить вам другое решение, немного отличающееся от того, что вы пытаетесь достичь, но оно может решить вашу проблему.
Из вашего вопроса я смог сделать вывод, что ваше веб-приложение и приложение шлюза находятся в одном кластере.
В моем решении вам не нужен сервис типа LoadBalancer, а базового Ingress достаточно, чтобы он работал.
Вам нужно только создать объект Service (обратите внимание, что опция type: LoadBalancer
теперь отсутствует)
apiVersion: v1
kind: Service
metadata:
name: gateway
spec:
selector:
app: gateway
ports:
- name: http
port: 3000
targetPort: 3000
nodePort: 30000
, и вам также нужен входной объект (помните, что на Ingress Controller нужнобыть развернутым в кластер, чтобы заставить его работать), как показано ниже: Подробнее о том, как развернуть контроллер Nginx Ingress, вы можете найти здесь , и если вы уже используете один (может быть, другой), то вы можете пропустить этоstep.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: gateway-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: gateway.foo.bar.com
http:
paths:
- path: /
backend:
serviceName: gateway
servicePort: 3000
Обратите внимание на поле хоста.
То же самое вам нужно повторить для вашего веб-приложения. Не забудьте использовать соответствующее имя хоста (DNS-имя), например, для веб-приложения: foo.bar.com
и для шлюза: gateway.foo.bar.com
, а затем просто используйте имя gateway.foo.bar.com
dns для подключения к приложению-шлюзу из клиентского веб-браузера.
Вам также необходимо создать запись DNS, которая указывает *.foo.bar.com
на публичный IP-адрес Ingress, поскольку контроллер Ingress создаст свой собственный балансировщик нагрузки.
Поток трафика будет таким, как показано ниже:
+-------------+ +---------+ +-----------------+ +---------------------+
| Web Browser |-->| Ingress |-->| gateway Service |-->| gateway application |
+-------------+ +---------+ +-----------------+ +---------------------+
Этот подход лучше, потому что он не вызовет проблем с Cross-Origin Resource Sharing (CORS) в клиентском браузере.
Примеры манифестов Ingress и Service, которые я взял из официальной документации kubernetes и немного изменил.
Подробнее о входе вы можете найти здесь и об услугах здесь