K8s通过Service子域名访问Pod内应用出现连接拒绝问题排查
问题排查步骤
按以下优先级逐一排查即可定位问题:
- 第一优先级:修正访问地址的两处硬错误
- 访问URL中的Pod标识拼写完全不匹配:你配置里的Pod名称、hostname均为
playout-6297bbd9eab3f039170509e8,但实际访问地址里写的是playout-6297bbdceab3f039170509ee,字符串不一致会直接导致解析失败或指向不存在的资源。 - 域名后缀使用错误:默认K8s集群的集群域名为
cluster.local,你写的domain.com不是默认集群后缀,除非你手动修改过kubelet和CoreDNS的集群域名配置,否则集群内合法的Pod子域名格式为<pod-hostname>.<headless-svc-name>.<namespace>.svc.cluster.local,对应你这套配置的集群内访问地址应该是http://playout-6297bbd9eab3f039170509e8.default-subdomain.default.svc.cluster.local:80。另外注意:你配置的Headless Service(设置了clusterIP: None)仅支持集群内部DNS解析和访问,无法直接从集群外/本地公网环境访问,如果需要公网访问,要额外配置Ingress、LoadBalancer或NodePort类型的转发规则。
- 访问URL中的Pod标识拼写完全不匹配:你配置里的Pod名称、hostname均为
- 第二优先级:做集群内连通性基线校验
不要直接在本地电脑测试,先在集群内部验证链路是否正常:- 启动临时调试Pod:执行命令
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- sh进入调试容器 - 验证DNS解析:在调试容器内执行
nslookup playout-6297bbd9eab3f039170509e8.default-subdomain.default.svc.cluster.local,如果能返回对应Pod的IP,说明Headless Service和Pod的子域名配置生效;如果解析失败,检查CoreDNS组件运行状态、kubelet启动参数中的--cluster-domain配置是否和你使用的域名后缀一致。 - 验证端口连通性:解析正常后,在调试容器内执行
curl http://playout-6297bbd9eab3f039170509e8.default-subdomain.default.svc.cluster.local,如果能正常返回响应,说明集群内访问链路正常,连接拒绝问题来自集群外访问的配置缺失。
- 启动临时调试Pod:执行命令
- 第三优先级:检查Pod内服务运行状态
如果集群内curl也提示连接拒绝,排查服务本身问题:- 进入Pod执行
kubectl exec -it playout-6297bbd9eab3f039170509e8 -- curl http://127.0.0.1:7999,确认服务本身正常启动、没有崩溃退出。 - 检查服务监听地址:执行
kubectl exec -it playout-6297bbd9eab3f039170509e8 -- netstat -tulpn,如果7999端口绑定的是127.0.0.1而非0.0.0.0,集群内其他资源将无法访问该端口,需要修改服务配置绑定到所有网卡。
- 进入Pod执行
- 第四优先级:检查集群网络策略
执行kubectl get networkpolicy -n default查看default命名空间下是否存在拦截规则,Rancher部署的集群部分模板会默认添加网络访问限制,误拦截同命名空间的Pod间流量。
补充说明:你当前Pod配置中
hostname字段值和metadata.name完全一致,属于冗余配置,不删除也不影响功能,Pod默认会使用自身名称作为主机名。
内容的提问来源于stack exchange,提问作者Nitro
相关产品推荐
相关产品推荐

