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

K8s部署端口配置问题排查:NextJS应用503错误解析

问题分析与解决

一、Dockerfile中两处3003端口的作用与必要性

  • CMD npx next start -p 3003:必须保留,这是强制NextJS应用实际监听容器内的3003端口,是应用能被外部访问的核心配置,没有它应用会默认监听3000端口,和预期端口不匹配。
  • EXPOSE 3003:可选但推荐保留,这是镜像的元数据声明,仅用于告知Docker/K8s容器计划使用的端口,不会实际打开端口(端口暴露由Docker运行参数或K8s Service实现),但能提升镜像可读性,方便后续维护。

二、K8s清单的核心错误(导致503的根本原因)

你的清单存在两个致命配置错误:

1. Deployment存在嵌套的spec字段

原Deployment错误地嵌套了两层spec,同时缺少Pod标签和关联的selector,导致Service无法找到Pod。修正后的Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example # 用于匹配Pod标签
  template:
    metadata:
      labels:
        app: example # Pod的标签,需与selector对应
    spec:
      containers:
        - name: example
          image: "hub.domain.com/example:1.0.0"
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3003 # 必须与应用实际监听端口一致

2. Service缺少selector字段

原Service未配置selector,K8s无法识别需要转发流量的目标Pod,导致Service无可用Endpoints。修正后的Service:

apiVersion: v1
kind: Service
metadata:
  name: example
spec:
  selector:
    app: example # 匹配Deployment中Pod的标签
  ports:
    - protocol: TCP
      port: 80 # Service在集群内暴露的端口,选80符合HTTP默认端口习惯
      targetPort: 3003 # 必须指向容器内应用实际监听的端口

三、各组件端口配置详解

组件端口配置项值原因说明
Dockerfile CMD-p 30033003确保应用监听容器内的3003端口,是流量进入容器的基础
DeploymentcontainerPort3003声明容器内应用的监听端口,与实际端口一致,用于K8s服务发现、健康检查等场景
Serviceport80Service在集群内的暴露端口,集群内其他服务可通过此端口访问
ServicetargetPort3003指向容器内应用的实际监听端口,保证Service流量转发到正确位置
Ingressbackend.service.port.number80指向Service的暴露端口,Ingress将外部流量转发到Service的这个端口

四、Ingress配置补充说明

你的Ingress配置基本可用,但nginx.ingress.kubernetes.io/ssl-passthrough: "true"会让Ingress直接透传SSL流量到后端。如果你的NextJS应用没有处理SSL的逻辑,建议移除该注解,让Ingress负责SSL终止,这是更常规的配置方式。

修正后重新部署所有资源,503错误和Service端口转发问题即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:55:26