我刚刚部署了前端和后端 pod,但它们之间的连接存在问题。
后端 pod 配置如下:
apiVersion: v1
kind: Pod
metadata:
name: af-backend-pod
labels:
name: af-backend-pod
app: adv-format
spec:
containers:
- name: af-backend
image: localhost:5000/backend:1.2
ports:
- containerPort: 4040
env:
- name: NODE_ENV
value: "test"
后端 pod 的服务:
apiVersion: v1
kind: Service
metadata:
name: af-backend
labels:
name: af-backend-service
app: adv-format
spec:
ports:
- port: 4040
targetPort: 6011
selector:
name: af-backend-pod
app: adv-format
当前端尝试使用 pod 配置中定义的名称调用后端时,就会出现此问题:
apiVersion: v1
kind: Pod
metadata:
name: af-frontend-pod
labels:
name: af-frontend-pod
app: adv-format
spec:
containers:
- name: af-frontend
image: localhost:5000/frontend:1.1
ports:
- containerPort: 80
env:
- name: REACT_APP_SETUP
value: "test"
- name: REACT_APP_BACKEND_URL
value: "af-backend" # <- this
- name: REACT_APP_BACKEND_PORT
value: "6011"
目前,前端通过端口 30120 上的 NodePort 服务公开。将错误记录到控制台表明前端尝试使用以下 URL 调用后端:http://10.11.12.13:30120/这是不正确的:我希望在内部看到端口 6011 处的后端 API。
我的理解正确吗?还是我应该将后端服务公开以供外部访问?
或者也许有办法格式化后端的 URL,剪切出端口并将其替换为所需的端口?
答案1
问题出在后端 pod 的 sevice.spec.ports 配置中。目标端口是服务将转发流量的端口。在本例中,它是 4040,因为后端 pod 正在监听 4040。服务端口应该是 6011,因为 FE pod 将在此端口上调用服务。无需将后端服务公开为 NodePort。您还可以从 FE 容器尝试 netcat 命令来检查服务是否可以访问。命令:nc -v Service_IP 6011(响应中预期为“成功”)。
apiVersion: v1
kind: Service
metadata:
name: af-backend
labels:
name: af-backend-service
app: adv-format
spec:
ports:
- port: 4040 << Wrong Should be 6011; FE Pod calls the service at 6011
targetPort: 6011 << Wrong Should be 4040; backend pod container port 4040
selector:
name: af-backend-pod
app: adv-format