Kubernetes环境下前端调用后端接口返回HTTP 503的排查解决
问题
在Kubernetes中同时运行前端和后端容器时,前端调用后端接口返回503错误,但本地运行容器一切正常。
详细信息
我的Spring后端提供了/hello接口,返回"Hello World!"。为排除CORS问题,已尽可能宽松配置CORS,相关代码如下:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedMethods("*"); } @Bean public CommonsRequestLoggingFilter logFilter() { var filter = new CommonsRequestLoggingFilter(); filter.setIncludeQueryString(true); filter.setIncludePayload(true); filter.setMaxPayloadLength(10_000); filter.setIncludeHeaders(false); filter.setBeforeMessagePrefix("Request: "); return filter; } }
Kubernetes配置文件
backend.yaml
# Deployment apiVersion: apps/v1 kind: Deployment metadata: name: knote-backend spec: replicas: 1 selector: matchLabels: app: knote template: metadata: labels: app: knote spec: containers: - name: backend image: knote-backend ports: - containerPort: 8080 imagePullPolicy: Never resources: limits: cpu: "2" memory: "512Mi" --- # Service apiVersion: v1 kind: Service metadata: name: knote-backend spec: selector: app: knote tier: backend ports: - port: 8080 targetPort: 8080
frontend.yaml
# Deployment apiVersion: apps/v1 kind: Deployment metadata: name: knote-frontend spec: replicas: 1 selector: matchLabels: app: knote tier: frontend template: metadata: labels: app: knote tier: frontend spec: containers: - name: frontend image: "knote-frontend" ports: - containerPort: 3000 imagePullPolicy: Never resources: limits: cpu: "2" memory: "512Mi" --- # Service apiVersion: v1 kind: Service metadata: name: knote-frontend spec: selector: app: knote tier: frontend ports: - port: 3000 targetPort: 3000
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: knote-ingress annotations: nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: "http://192.168.49.2" labels: name: knote-ingress spec: rules: - http: paths: - pathType: Prefix path: "/api" backend: service: name: knote-backend port: number: 8080 - pathType: Prefix path: "/" backend: service: name: knote-frontend port: number: 3000
执行kubectl describe ingress knote-ingress输出:
Name: knote-ingress Labels: name=knote-ingress Namespace: default Address: 192.168.49.2 Ingress Class: nginx Default backend: <default> Rules: Host Path Backends ---- ---- -------- * /api knote-backend:8080 (<none>) / knote-frontend:3000 (10.244.0.64:3000) Annotations: nginx.ingress.kubernetes.io/cors-allow-origin: http://192.168.49.2 nginx.ingress.kubernetes.io/enable-cors: true Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Sync 31m (x3 over 4h32m) nginx-ingress-controller Scheduled for sync
已尝试的操作
- 本地运行容器正常
- 增减Ingress的CORS注解无效果
- 将
knote-frontend和192.168.49.2添加为allowedOrigins无效果 - 在后端容器内curl localhost正常,但前端容器内curl后端失败
补充信息
请求/api/hello的请求头:
GET /api/hello HTTP/1.1 Host: 192.168.49.2 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.49.2/ DNT: 1 Connection: keep-alive Sec-GPC: 1 Pragma: no-cache Cache-Control: no-cache
响应头:
HTTP/1.1 503 Service Temporarily Unavailable Date: Sun, 25 Jun 2023 12:46:20 GMT Content-Type: text/html Content-Length: 190 Connection: keep-alive
问题原因及解决方法
从Ingress描述输出能看到knote-backend:8080对应的后端是<none>,说明Service找不到匹配的Pod,这是核心问题。
具体原因
后端Deployment的Pod标签只有app: knote,但后端Service的选择器要求app: knote+tier: backend,标签不匹配导致Service无法关联到Pod;另外原配置文件存在语法错误(如metadata.name与spec连写),也会影响资源创建。
修复步骤
- 修改
backend.yaml中的Deployment模板标签,添加tier: backend:
template: metadata: labels: app: knote tier: backend
- 确保所有配置文件的语法正确(比如
name: knote-backend与spec:需分两行书写) - 重新应用后端配置:
kubectl apply -f backend.yaml
验证方式
修复后执行以下命令,确认Service已关联到Pod:
kubectl get endpoints knote-backend
输出中若包含Pod的IP和端口,说明关联成功,此时访问/api/hello即可正常返回结果。
内容的提问来源于stack exchange,提问作者DaPurr
相关产品推荐
相关产品推荐

