React App与Go后端api通信

时间:2019-07-07 02:43:26

标签: reactjs go kubernetes dns

我有一个前端React应用程序和一个Go后端服务作为前端的API。两者都是同一名称空间中的Kubernetes服务。在不使用外部IP的情况下如何与Go后端服务通信?我知道它可以与外部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

前端Deployment.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

后端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

后端Deployment.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 个答案:

答案 0 :(得分:4)

React应用程序不在Kubernetes中运行。也许您有一个在Kubernetes中运行的开发服务器,但是它只是将HTML和Javascript文件提供给在集群外部运行的浏览器。浏览器中的应用程序对此“ Kubernetes”一无所知,并且无法解析Kubernetes内部的...svc.cluster.local主机名。它需要一种与集群对话的方法。

由于已将后端配置为NodePort类型服务,因此您可以查找后端的外部可见端口,然后在服务的浏览器应用程序中将后端URL配置为群集中某个节点上的端口号。这有点麻烦和手动。

一个更好的方法是配置一个ingress,例如,https://.../为您的浏览器应用程序提供服务,而https://.../api进入您的后端。然后,后端URL可以只是裸路径/api,它将使用与UI相同的主机名和方案进行解释。

答案 1 :(得分:0)

yamls有很多问题。首先,在服务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

在服务Yamls中更改targetPort之后,我创建了一个执行nslookup的pod,它按预期工作。

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