Kubernetes多容器Deployment对接单Service多端口访问故障排查
问题场景
- 单个Deployment资源下包含2个容器,分别配置不同监听端口,配置片段如下:
template: { spec: { containers: [ { name: container1, image: image1, command: [...], args: [...], imagePullPolicy: IfNotPresent, ports: [ { name: port1, containerPort: 80, }, ], ............. }, { name: container2, image: image1, command: [...], args: [...], imagePullPolicy: IfNotPresent, ports: [ { name: port2, containerPort: 81, }, ], ------------ } ] } }
- 创建了多端口配置的ClusterIP类型Service对接上述两个容器,配置片段如下:
spec: { type: ClusterIP, ports: [ { port: 7000, targetPort: 80, protocol: 'TCP', name: port1, }, { port: 7001, targetPort: 81, protocol: 'TCP', name: port2, } ] }
- 故障现象:可通过
Service名称+7000端口正常访问监听80端口的container1,但无法通过Service名称+7001端口访问监听81端口的container2 - 补充说明:两个容器使用完全相同的镜像,仅配置不同command和args参数实现不同内部业务逻辑
配置遗漏&故障排查方向
你贴出的Deployment、Service端口声明语法本身没有错误,故障基本是以下配置遗漏/错误导致,按优先级排查即可:
- container2业务进程未正确监听81端口
这是同镜像多容器场景下最高发的问题:多数通用镜像默认监听端口为80,你虽然修改了启动参数,但如果参数未生效、业务代码未配置监听81,或者进程只绑定了127.0.0.1:81而非0.0.0.0:81,都会导致访问不通。
排查方式:进入对应Pod执行
ss -lntp | grep 81,确认是否有进程绑定全网卡的81端口。
- container2内部拦截了81端口流量
部分基础镜像默认自带iptables规则、或者启动逻辑中包含端口限制配置,会拦截外部对81端口的访问。
排查方式:找同集群内其他任意Pod,直接执行
curl <故障Pod的IP>:81,如果直连PodIP都不通,说明问题出在容器内部,和Service配置无关。
- Service端点未正确收录81端口
执行kubectl get endpoints <你的Service名称>,查看返回的后端端点列表,确认是否同时存在对应Pod的80、81两个端口。如果只有80端口没有81端口,优先检查Pod模板中container2的端口声明是否有拼写错误、Service的targetPort配置是否和containerPort/端口名完全匹配(注意大小写、特殊字符)。 - 确认Service的selector配置完全匹配Pod标签
你贴出的Service配置片段中遗漏了selector字段,该字段是Service识别后端Pod的核心配置,虽然7000端口能通说明selector大概率配置正确,但仍需核对selector的键值是否和Pod模板的labels完全一致,避免存在特殊字符、空格导致匹配异常。
内容的提问来源于stack exchange,提问作者Yashasvi Raj Pant
相关产品推荐
相关产品推荐

