React App общение с Go backend api - PullRequest
0 голосов
/ 07 июля 2019

У меня есть приложение React веб-интерфейса и серверная часть Go в качестве API для интерфейса. Оба являются сервисами Kubernetes в одном и том же пространстве имен. Как я могу общаться с сервисом Go backend без использования внешнего IP? Я получил его для работы с внешним IP-адресом, но я не могу заставить fqdn разрешать правильно, как должно. Интерфейсный сервис построен на основе образа докера nginx:1.15.2-alpine. Как заставить приложение React внешнего интерфейса взаимодействовать с внутренним сервером Go?

Внешний сервис.yaml:

apiVersion: v1
kind: Service
metadata:
  name: ui
  namespace: client
  labels:
    app: ui
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
  selector:
    app: ui

Frontend deploy.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ui
  namespace: client
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 2
  template:
    metadata:
      labels:
        app: ui
    spec:
      containers:
        - name: ui
          image: #######
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80

Backend service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: api
  namespace: client
  labels:
    app: api
spec:
  type: NodePort
  ports:
    - port: 8001
      protocol: TCP
      targetPort: http
      name: http
  selector:
    app: api

Backend deploy.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: api
  namespace: client
  labels:
    name: api
spec:
  replicas: 1
  revisionHistoryLimit: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: ####
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8001

Ответы [ 2 ]

4 голосов
/ 07 июля 2019

Приложение React не запускается в Kubernetes. Возможно, у вас есть сервер dev, работающий в Kubernetes, но он просто передает файлы HTML и Javascript в браузер, работающий вне кластера. Приложение в браузере не имеет представления об этой сущности Kubernetes и не может разрешить внутренние имена хостов Kubernetes ...svc.cluster.local; ему нужен способ для обратной связи с кластером.

Поскольку бэкэнд настроен как служба типа NodePort, вы можете посмотреть внешне видимый порт бэкенда, а затем настроить URL-адрес бэкенда в обслуживаемом приложении браузера так, чтобы он был номером этого порта на каком-либо узле в вашем кластере. Это немного грязно и вручную.

Лучший способ - настроить вход , чтобы, например, https://.../ обслуживал приложение браузера, а https://.../api - ваш бэкэнд. Тогда внутренним URL может быть просто пустой путь /api, и он будет интерпретироваться с тем же именем хоста и схемой, что и пользовательский интерфейс.

0 голосов
/ 07 июля 2019

Есть много проблем с ямлами. Во-первых, в сервисных yamls targetPort должен быть номерами портов (целыми числами), а не строкой. Итак, обновленный конфиг будет,

apiVersion: v1
kind: Service
metadata:
  name: ui
  namespace: client
  labels:
    app: ui
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
  selector:
    app: ui

и

apiVersion: v1
kind: Service
metadata:
  name: api
  namespace: client
  labels:
    app: api
spec:
  type: NodePort
  ports:
    - port: 8001
      protocol: TCP
      targetPort: 8001
      name: http
  selector:
    app: api

После изменения targetPort в сервисных yamls я создал модуль для выполнения nslookup, и он работает как положено.

kubectl apply -f https://k8s.io/examples/admin/dns/busybox.yaml
kubectl exec -ti busybox -- nslookup api.client

производит вывод

Defaulting container name to busybox.
Use 'kubectl describe pod/busybox -n default' to see all of the containers in this pod.
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      api.client
Address 1: 10.101.84.21 api.client.svc.cluster.local
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...