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 3003 | 3003 | 确保应用监听容器内的3003端口,是流量进入容器的基础 |
| Deployment | containerPort | 3003 | 声明容器内应用的监听端口,与实际端口一致,用于K8s服务发现、健康检查等场景 |
| Service | port | 80 | Service在集群内的暴露端口,集群内其他服务可通过此端口访问 |
| Service | targetPort | 3003 | 指向容器内应用的实际监听端口,保证Service流量转发到正确位置 |
| Ingress | backend.service.port.number | 80 | 指向Service的暴露端口,Ingress将外部流量转发到Service的这个端口 |
四、Ingress配置补充说明
你的Ingress配置基本可用,但nginx.ingress.kubernetes.io/ssl-passthrough: "true"会让Ingress直接透传SSL流量到后端。如果你的NextJS应用没有处理SSL的逻辑,建议移除该注解,让Ingress负责SSL终止,这是更常规的配置方式。
修正后重新部署所有资源,503错误和Service端口转发问题即可解决。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

