我的前端设置为:
this.http.post<any>(`${environment.apiUrl}/auth/login`, {email, password})
apiUrl: 'http://backend/api'
我在容器中构建了前端,并将其暴露给负载均衡器服务,我试图通过ClusterIP服务将其连接到端口3000上的后端。
前端YAML:
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
selector:
tier: frontend
ports:
- port: 80
targetPort: 80
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
tier: frontend
replicas: 1
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: frontend
image: <Image>
imagePullPolicy: Always
ports:
- containerPort: 80
后端YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
selector:
matchLabels:
app: app
tier: backend
replicas: 1
template:
metadata:
labels:
app: app
tier: backend
spec:
containers:
- name: frontend-container
image: <Image>
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: app
tier: backend
ports:
- protocol: TCP
port: 80
targetPort: 3000
如文档here中所述。
但是当我尝试从浏览器访问它时,它不起作用,我收到未知错误!!
以下是前端内部的屏幕截图,以确保它能够在内部到达后端。
我不明白我在哪里出了问题。我认为设置为http:// backend的apiUrl var无法正确转换,因为如果我将其更改为负载均衡器IP并重建了映像,则将后端公开给LB服务而不是ClusterIP。确实可以。
但是显然我不想让我的后端使用LB服务。
有什么主意吗?
答案 0 :(得分:2)
查看以下内容:
outside world | k8s cluster
|
Browser --> | Nginx-pod --> backend-pod
|
|
URL http://backend/api
仅在群集中可解析,但是您的浏览器在外部环境中,因此它不知道此URL是什么。
理想情况下,您将使用ingress
来管理到群集Pod的路由。
答案 1 :(得分:1)
正如@Elgarni所说,客户端的浏览器无法访问您的集群,因此http://backend/api
在集群外部无法解析。
如果您定义了入口,请使用kubectl get ingress
命令并了解您的外部IP。然后将您的${environment.apiUrl}
替换为http://$EXTERNAL_IP/api/
或
为您的外部IP定义DNS记录,并通过您定义的域进行访问。