在AWS EKS部署SpringBoot应用时遭遇502 Bad Gateway错误求助
AWS EKS上Spring Boot应用502 Bad Gateway问题排查与修复
核心问题:端口配置不匹配
你的配置中存在端口映射混乱,这是502错误的主要诱因:
- Deployment里声明的
containerPort: 81与Spring Boot默认监听的8080端口不符,虽然Kubernetes不强制该字段与实际端口一致,但错误配置会干扰排查逻辑,甚至影响ALB健康检查判定。 - Service的
targetPort: 8080是正确的(指向应用实际端口),但结合Deployment的错误端口声明,容易导致ALB健康检查路径错位。
排查步骤
验证Pod内应用状态
进入Pod内部,确认应用是否正常监听8080端口:kubectl exec -it <backend-pod-name> -n my-namespace -- curl localhost:8080 # 或查看端口监听情况 kubectl exec -it <backend-pod-name> -n my-namespace -- netstat -tulpn | grep 8080如果返回Hello World内容,说明应用本身正常;否则检查镜像内应用的启动配置。
测试Service连通性
在集群内测试Service是否能正确转发流量到Pod:kubectl port-forward service/backend-service -n my-namespace 8181:81本地访问
localhost:8181,如果能正常返回内容,说明Service配置有效,问题出在Ingress/ALB层面。检查ALB目标组健康状态
登录AWS控制台,找到Ingress对应的ALB,查看关联的目标组:- 确认目标组的健康检查路径是否为
/(Spring Boot Hello World默认路径) - 检查目标(Pod)的健康状态,如果显示
不健康,说明ALB拒绝转发流量,直接导致502错误。
- 确认目标组的健康检查路径是否为
修复方案
1. 修正Deployment的端口配置
将Deployment的containerPort改为Spring Boot实际监听的8080:
apiVersion: apps/v1 kind: Deployment metadata: name: backend-deployment namespace: my-namespace labels: app: backend-java spec: replicas: 1 selector: matchLabels: app: backend-java template: metadata: labels: app: backend-java spec: containers: - name: backend-java image: <docker-image-location> ports: - containerPort: 8080 # 匹配Spring Boot默认端口 resources: limits: cpu: "4000m" memory: "2048Mi" requests: cpu: "100m" memory: "1024Mi"
2. 优化Ingress的健康检查配置
为Ingress添加明确的健康检查注解,确保ALB能正确识别Pod状态:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: "my-app-ingress" namespace: "my-namespace" annotations: alb.ingress.kubernetes.io/scheme: internal alb.ingress.kubernetes.io/backend-protocol: HTTP alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]' alb.ingress.kubernetes.io/healthcheck-path: "/" # 指定健康检查路径 alb.ingress.kubernetes.io/healthcheck-port: "traffic-port" # 使用Service的端口 alb.ingress.kubernetes.io/healthcheck-interval-seconds: "10" alb.ingress.kubernetes.io/healthy-threshold-count: "2" spec: ingressClassName: alb rules: - host: myapp.aws.com http: paths: - path: / pathType: Prefix backend: service: name: "backend-service" port: number: 81
3. 重新部署配置
应用修改后的配置:
kubectl apply -f deployment.yaml -n my-namespace kubectl apply -f ingress.yaml -n my-namespace
等待Pod重启、ALB更新配置后,再次访问应用验证。
额外注意事项
- 确认Docker镜像内的Spring Boot应用确实监听8080端口,可本地启动镜像后执行
docker exec <container-id> curl localhost:8080验证。 - 检查Pod的资源限制是否足够,避免因OOM或CPU不足导致应用无法正常启动。
内容的提问来源于stack exchange,提问作者Prajul Aaditya
相关产品推荐
相关产品推荐

