Kubernetes单Deployment第二个容器端口访问Connection refused问题
首先明确核心认知:Kubernetes Pod 定义中的 containerPort 是纯声明性字段,不会实际执行端口开放、防火墙放行或端口映射操作。你遇到的 Connection refused 错误说明网络链路已经通达 Pod 所在网络命名空间,问题根源是 81 端口没有进程正常监听,和 K8s 层面的配置缺失无关。
第一步:确认第二个容器的端口监听状态
执行以下命令进入container2查看实际端口监听情况:# 用netstat查看 kubectl exec -it <你的Pod名称> -c container2 -- netstat -tulpn | grep 81 # 如果镜像里没有netstat可以用ss kubectl exec -it <你的Pod名称> -c container2 -- ss -tulpn正常情况下应该能看到业务进程绑定在
0.0.0.0:81的监听记录,如果没有记录直接走第二步排查。第二步:检查container2的启动参数配置
你提到两个容器使用完全相同的镜像,仅通过 command/args 区分业务逻辑,90% 以上的此类问题都是启动参数配置错误:你给container2传入的参数没有把业务进程的监听端口改成81,业务默认还是尝试监听80端口。
注意:同一个Pod内的所有容器共享网络命名空间,端口是全局唯一的,container1已经占用了80端口,container2如果尝试绑定80会直接失败,最终不会监听任何端口。
可以直接查看容器日志确认启动异常:kubectl logs <你的Pod名称> -c container2找到业务启动时的端口配置项,把监听端口改成81重新发布即可。
第三步:确认监听地址配置
如果第一步查到进程确实在监听81端口,检查监听地址是不是127.0.0.1:如果进程只绑定了回环地址,Pod外部、甚至同Pod的其他容器访问PodIP的81端口都会被拒绝,需要把监听地址改成0.0.0.0。
你当前贴出的Deployment配置没有缺失K8s层面的必填项,不需要额外补充端口相关的K8s配置,问题完全出在第二个容器内部的业务启动逻辑上。
内容的提问来源于stack exchange,提问作者Yashasvi Raj Pant

