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

如何排查AWS EKS Fargate集群Kubernetes Service外网暴露失败问题

问题描述

我正尝试在AWS EKS集群(所有Pod运行在Fargate节点上)中暴露以下Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: ssd-namespace-01
spec:
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-reverse-proxy
        image: nginx-reverse-proxy

我已尝试两种方式暴露服务:

  1. 使用Expose命令:
kubectl expose deployment nginx-deployment --port=80 --target-port=80 --name nginx-exposed-svc --type LoadBalancer
  1. 应用带注解的Service清单:
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: ssd-namespace-01
  annotations:
    kubernetes.io/aws-load-balancer-type: external 
    kubernetes.io/aws-load-balancer-scheme: internet-facing
    kubernetes.io/aws-load-balancer-nlb-target-type: ip
spec:
  type: LoadBalancer
  selector:
    app: nginx-deployment
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

问题:
负载均衡器已创建,kubectl get svc也返回了服务的EXTERNAL-IP(实际为URL),但无法访问该服务。浏览器HTTP请求失败,Postman返回“Error: socket hang up”。怀疑是安全组阻止了连接,但找不到问题所在,请问有什么方法可以排查连接被阻断的位置?


排查步骤

1. 验证Pod与Service的基础关联

  • 检查Pod运行状态:执行kubectl get pods -n ssd-namespace-01,确认所有Pod状态为Running;再通过kubectl logs <pod-name> -n ssd-namespace-01查看nginx容器日志,确认无启动报错、服务正常运行。
  • 核对Service与Pod的标签匹配:执行kubectl describe svc nginx-service -n ssd-namespace-01,查看Endpoints字段。如果显示<none>,说明Service的Selector和Pod的Labels不匹配,需要修正两者的标签一致。
  • 集群内测试连通性:临时启动一个busybox Pod,执行kubectl run -it --rm busybox --image=busybox:1.36 -n ssd-namespace-01,进入容器后执行wget -O- http://nginx-service:80。如果集群内都无法访问,问题出在Pod或Service配置,与负载均衡器无关。

2. 检查AWS NLB的配置与状态

  • 登录AWS控制台找到对应的网络负载均衡器(NLB):
    • 目标组状态:查看目标组中Pod的IP是否处于健康状态。若为不健康,说明NLB无法与Pod建立连接,需检查健康检查规则(默认检查80端口的HTTP 200响应,若nginx是反向代理,可能需要调整健康检查路径为存在的页面)。
    • 监听配置:确认NLB的80端口监听已正确关联到目标组,转发规则无误。

3. 逐层排查安全组与网络ACL

NLB安全组

  • 确保NLB的安全组允许外部客户端的80端口入站(来源可设为0.0.0.0/0或指定IP段),同时允许出站到Pod安全组的80端口。

Fargate Pod安全组

  • 通过kubectl describe pod <pod-name> -n ssd-namespace-01查看Pod的SecurityGroups字段,找到对应的安全组。
  • 确认该安全组允许NLB安全组的80端口入站,同时允许Pod的80端口出站(若nginx需反向代理到后端,还要确保出站规则开放对应后端端口)。

VPC网络ACL

  • 检查Pod所在子网的网络ACL,入站规则需允许80端口流量(来源为NLB所在子网或0.0.0.0/0),出站规则需允许TCP 1024-65535端口的响应流量。

4. 抓包定位阻断节点

若以上步骤未发现问题,通过抓包进一步定位:

  • 本地客户端抓包:使用tcpdump或Wireshark,确认请求是否发送到NLB的IP,是否收到响应。
  • Fargate Pod内抓包:执行kubectl exec -it <pod-name> -n ssd-namespace-01 -- tcpdump -i any port 80,观察是否有来自NLB的请求到达Pod。若无请求,说明安全组或ACL阻断;若有请求但无响应,说明Pod内nginx配置存在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:38