我有一个前端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
答案 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