You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连写),也会影响资源创建。

修复步骤

  1. 修改backend.yaml中的Deployment模板标签,添加tier: backend:
template:
  metadata:
    labels:
      app: knote
      tier: backend
  1. 确保所有配置文件的语法正确(比如name: knote-backend与spec:需分两行书写)
  2. 重新应用后端配置:
kubectl apply -f backend.yaml

验证方式

修复后执行以下命令,确认Service已关联到Pod:

kubectl get endpoints knote-backend

输出中若包含Pod的IP和端口,说明关联成功,此时访问/api/hello即可正常返回结果。


内容的提问来源于stack exchange,提问作者DaPurr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:14:57