我正在使用Minikube制作一个完整的堆栈K8s应用程序,使用React作为前端,使用ASP.NETCore作为后端。这是我的配置
部署和服务
apiVersion: v1
kind: ServiceAccount
metadata:
name: web-frontend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
labels:
app: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app:
frontend
spec:
serviceAccountName: web-frontend
containers:
- name: frontend
image: frontend
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend-svc
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
labels:
app: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app:
backend
spec:
serviceAccountName: backend
containers:
- name: backend
image: backend
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 5000
targetPort: 5000前端的Dockerfile
FROM node:alpine as build-image
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
RUN npm i
COPY . .
CMD ["npm", "run", "start"]这是我的母校
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-backend-ingress
annotations:
# nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /?(.*)
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 80
- path: /api/?(.*)
pathType: Prefix
backend:
service:
name: backend
port:
number: 5000但是,当我输入minikube tunnel在本地公开入口IP时,我可以到达前端,但是当前端试图在浏览器控制台中向/api/something发出fetch请求时,就会得到GET http://localhost/api/patients/ 404 (Not Found)和错误SyntaxError: Unexpected token < in JSON at position 0。
而且,如果我用这种方式改变进城
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-backend-ingress
annotations:
# nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 80
- path: /api/
pathType: Prefix
backend:
service:
name: backend
port:
number: 5000然后我可以发出curl localhost/api/something并得到JSON结果,但是当前端试图联系后端时,我得到
GET http://localhost/api/patients/ 500 (Internal Server Error)
SyntaxError: Unexpected end of JSON input
at main.358f50ad.js:2:473736
at s (main.358f50ad.js:2:298197)
at Generator._invoke (main.358f50ad.js:2:297985)
at Generator.next (main.358f50ad.js:2:298626)
at Al (main.358f50ad.js:2:439869)
at a (main.358f50ad.js:2:440073)这看起来很奇怪,因为如果我尝试前端和kubernetes之外的后端,一切都很好,从React应用程序中,来自后端的结果是正确的(当然,在package.json中使用的是package.json)。
发布于 2022-05-08 19:08:18
要在应用程序之间联系或建立链接,可以使用它们的kubernetes本机FQDN (如果您想要测试连接,可以尝试使用ping或telnet ),但是它是如何工作的:任何服务的默认FQDN是:
<service-name>.<namespace>.svc.cluster.local.在上面的示例中,您应该能够从前端的后端服务与以下内容联系:
backend.YOURNAMESPACENAME.svc.cluster.local:5000对于相同命名空间中的服务,您不需要使用FQDN访问服务,只需使用服务名称即可:
backend:5000我不知道您在哪里准确地配置了前端和后端之间的链接,但是,您应该将这个链接“可变化”,并在kubernetes清单中添加变量定义。
https://stackoverflow.com/questions/72163933
复制相似问题