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

无法访问Kubernetes负载均衡器后端Pod上的Tomcat Web应用

故障排查:Kubernetes中Tomcat应用无法访问问题

部署配置

使用以下YAML部署Deployment和Service:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rest-deployment
  labels:
    app: rest-deployment
spec:
  selector:
    matchLabels:
      app: rest-deployment
  replicas: 1 
  template:
    metadata:
      labels:
        app: rest-deployment
    spec:
      containers:
        - name: rest-deployment
          image: public.ecr.aws/apryse/fluent-restful:24.2.1.4
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: restful-service
spec:
  selector:
    app: rest-deployment
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer

问题现状

目标是实现多Pod负载均衡,先测试单Pod运行场景:

  • kubectl get deployments显示Pod处于运行状态
  • kubectl describe svc restful-service显示LoadBalancer正常运行,Endpoints已关联Pod IP(obfuscatedIP_2:8080)
  • 容器内Tomcat配置监听8080端口:
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxParameterCount="1000"
           />

但尝试以下方式均无法访问Web应用:

  1. localhost:8080
  2. obfuscatedIP_1:8080
  3. obfuscatedIP_2:8080

故障排查思路

  • 检查容器内服务监听状态
    进入Pod执行命令,确认Tomcat是否真的监听了可被外部访问的地址:

    kubectl exec -it <你的pod名称> -- netstat -tulpn
    

    需确保看到类似0.0.0.0:8080的监听记录(如果仅监听127.0.0.1,则集群内无法访问)。同时在容器内直接测试:

    kubectl exec -it <你的pod名称> -- curl localhost:8080
    

    看是否能返回Tomcat页面或API响应。

  • 修正Service访问端口
    你的Service配置中,port为80(Service对外暴露的端口),targetPort为8080(Pod内的端口),因此访问Service的正确方式是obfuscatedIP_1:80,而非obfuscatedIP_1:8080——之前的尝试用错了端口,这是常见误区。

  • 验证集群内部网络连通性
    在集群内启动临时Pod测试网络:

    kubectl run -it --rm busybox --image=busybox:1.28 -- wget -qO- obfuscatedIP_2:8080
    

    测试Service连通性:

    kubectl run -it --rm busybox --image=busybox:1.28 -- wget -qO- obfuscatedIP_1:80
    

    如果内部能访问,说明问题出在外部网络或LoadBalancer配置;如果内部也访问不了,排查Pod或容器本身的问题。

  • 检查LoadBalancer外部访问配置

    • 云厂商K8s集群:执行kubectl get svc restful-service,确认EXTERNAL-IP列是否为有效值(非pending),需用这个外部IP加80端口访问,而非Service的ClusterIP(obfuscatedIP_1)。
    • 本地集群(如Minikube):LoadBalancer类型Service需要通过minikube tunnel获取外部可访问IP,否则改用NodePort访问:集群节点IP:30416(30416是Service的NodePort)。
  • 排查防火墙与安全组

    • 云环境:确认节点安全组是否开放了80端口(LoadBalancer)和30416端口(NodePort)的入站流量。
    • 本地环境:检查主机防火墙是否允许相关端口的入站请求。
  • 查看容器启动日志
    检查Tomcat是否正常启动:

    kubectl logs <你的pod名称>
    

    查找是否有端口绑定失败、依赖缺失等错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:51:24