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

在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健康检查路径错位。

排查步骤

  1. 验证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内容,说明应用本身正常;否则检查镜像内应用的启动配置。

  2. 测试Service连通性
    在集群内测试Service是否能正确转发流量到Pod:

    kubectl port-forward service/backend-service -n my-namespace 8181:81
    

    本地访问localhost:8181,如果能正常返回内容,说明Service配置有效,问题出在Ingress/ALB层面。

  3. 检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:07:11