无法访问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应用:
- localhost:8080
- obfuscatedIP_1:8080
- 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)。
- 云厂商K8s集群:执行
排查防火墙与安全组
- 云环境:确认节点安全组是否开放了80端口(LoadBalancer)和30416端口(NodePort)的入站流量。
- 本地环境:检查主机防火墙是否允许相关端口的入站请求。
查看容器启动日志
检查Tomcat是否正常启动:kubectl logs <你的pod名称>查找是否有端口绑定失败、依赖缺失等错误信息。
内容的提问来源于stack exchange,提问作者zaidabuhijleh
相关产品推荐
相关产品推荐

