操作手册 · 云原生与容器

待环境验证

Kubernetes DNS 与 Service 分层排障手册

区分域名解析、Service 端点、后端应用与节点数据面问题,明确只读证据、获准探测、最小变更和访问隔离验收。

Kubernetes监控告警高可用
阅读导引 · 理解后再操作

这篇知识解决什么问题

本篇以相同调用端和时间窗拆开解析、Service 转发与后端执行,解释为何一次域名失败并不等于 DNS 故障。先读取现有对象及日志建立对照,再辨别策略和节点差异;主动请求、容器执行及配置修改属于后续获批动作,不混入只读取证。

对照实验的可比性先于工具结果

两个请求若来自不同节点、版本或协议,即使一个成功一个失败,也难以归因到单一网络层。先用既有日志固定源端、目标、时间和语义,区分短名、完整域名及服务类型;未获准的探测保持未知,避免把新增流量或证书误配制造的错误当成原故障。

服务发现信息和数据面行为分开

Service 与 EndpointSlice 描述期望入口及可用后端,实际请求还经过所用节点数据面和访问策略。对象正确只说明控制信息的一个层面,后端就绪也不证明每条源端路径可达;把对象、实际实现和业务证据分别对照,才能收窄传播、策略或应用问题。

进入文章正文
关联架构图解7 个组件 · 点击展开

引用普通 ClusterIP 的逻辑图区分 DNS 查询与后续应用请求,EndpointSlice 提供后端信息而非转发业务流量。图未覆盖 Headless、ExternalName、NodeLocal DNS 和所有替代数据面,实际实现须先盘点。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

DNS 解析、Service 转发与后端排障架构

把解析请求与应用请求拆成两条路径,结合 EndpointSlice、节点数据面和 NetworkPolicy 定位故障;先采集对象证据,再批准有限探测与最小变更。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

DNS 解析、Service 转发与后端排障架构:组件关系图把解析请求与应用请求拆成两条路径,结合 EndpointSlice、节点数据面和 NetworkPolicy 定位故障;先采集对象证据,再批准有限探测与最小变更。 调用端 Pod → 集群 DNS:解析查询;调用端 Pod → Service 逻辑入口:应用请求;Service 逻辑入口 → 后端 Pod:节点数据面转发;EndpointSlice → Service 逻辑入口:后端发现信息;NetworkPolicy → 调用端 Pod:调用端出口约束;NetworkPolicy → 后端 Pod:后端入口约束;集群 DNS → 既有指标与日志:解析状态证据;后端 Pod → 既有指标与日志:就绪与业务信号。箭头说明见下方流向解读。
普通 ClusterIP Service 的逻辑参考图,不是实际网络拓扑;NodeLocal DNS、替代数据面及特殊 Service 类型须按现场单独展开。

调用端 Pod

入口 / 来源

固定命名空间、节点、地址族和协议,区分 API 对象查询、容器执行与主动流量探测的权限。

查看关联工具
全部组件职责 7 个组件
调用端 Pod
固定命名空间、节点、地址族和协议,区分 API 对象查询、容器执行与主动流量探测的权限。工具介绍 调用端 Pod
Service 逻辑入口
Service 不是必然独立运行的代理进程;请求如何转发由实际 kube-proxy 或替代节点数据面实现。工具介绍 Service 逻辑入口
后端 Pod
以真实后端端口、就绪条件和应用日志验证,不把 Running 状态当成能接收业务请求。工具介绍 后端 Pod
集群 DNS
核对 DNS Service、Pod、集群域与调用端策略,是否使用 NodeLocal DNS 由现场确认。工具介绍 集群 DNS
EndpointSlice
记录服务后端地址、端口和就绪条件;核对全部相关切片,不手工覆盖控制器管理的端点。工具介绍 EndpointSlice
NetworkPolicy
按实际插件确认策略生效,源端出口与目标端入口均须允许;不把规则写存在等同于已经实施。工具介绍 NetworkPolicy
既有指标与日志
对照 DNS 错误、工作负载和业务基线,保存最小修复与原有隔离验收证据。工具介绍 既有指标与日志
流向解读 8 条连接
  1. 1

    调用端 Pod 集群 DNS

    数据 / 请求 · 解析查询

    调用端按实际解析器配置查询域名;DNS 通常返回地址,不替应用代理后续业务请求。

  2. 2

    调用端 Pod Service 逻辑入口

    数据 / 请求 · 应用请求

    解析后应用请求进入对应 Service 地址和端口;保持主机名、SNI 与 TLS 校验。

  3. 3

    Service 逻辑入口 后端 Pod

    数据 / 请求 · 节点数据面转发

    表达普通 ClusterIP 的逻辑转发路径,具体代理、地址转换和负载选择按插件核对。

  4. 4

    EndpointSlice Service 逻辑入口

    控制 / 管理 · 后端发现信息

    节点代理或替代数据面使用服务与端点信息建立转发,不是业务数据经过切片对象。

  5. 5

    NetworkPolicy 调用端 Pod

    控制 / 管理 · 调用端出口约束

    检查源端到实际 DNS 和业务目标的出口允许范围,地址转换细节按实现核验。

  6. 6

    NetworkPolicy 后端 Pod

    控制 / 管理 · 后端入口约束

    检查目标 Pod 入口策略与匹配标签,不通过删除全部策略制造连通。

  7. 7

    集群 DNS 既有指标与日志

    观测 / 查询 · 解析状态证据

    缺少查询日志不代表 DNS 未收到请求,区分未开启、无权限和真实错误。

  8. 8

    后端 Pod 既有指标与日志

    观测 / 查询 · 就绪与业务信号

    对照不同源端、节点及必要地址族,保留未覆盖范围。

故障域与操作边界

特殊 Service 不套普通转发图

Headless、ExternalName、无选择器 Service 与不同地址族分别处理;图中不默认存在 kube-proxy 或 NodeLocal DNS。

主动诊断不等于纯只读 API

kubectl exec 启动进程,探测产生流量;没有工具时不擅自创建特权 Pod、安装软件或扩大网络放行。

修复只作用于获批对象

保存原配置和回退版本,恢复时重验正常对照与访问隔离;仅重启后暂时正常仍标为缓解。

架构依据与版本核对 1 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与安全边界

本文用于已有 Kubernetes 集群中“域名无法解析、Service 超时、部分节点偶发失败”的分层定位,配合 Kubernetes DNS 与 Service 连通性排障场景 使用。内容状态为 PENDING(待环境验证),示例未在你的集群执行。先确认实际 Kubernetes、CoreDNS、容器运行时及网络插件版本;托管集群、Windows 节点、无 kube-proxy 的数据面不能机械套用 Linux 排查结论。

命令中的 NAMESPACE、SERVICE_NAME、POD_NAME、CONTAINER_NAME、DNS_SERVICE_NAME 与域名均为占位符,必须由负责人替换。第一阶段仅通过 API 读取资源及获准查看的日志,不创建 Pod,不编辑 ConfigMap,不重启 DNS,不清空节点网络规则。日志和资源配置可能含内部拓扑,分享前需要脱敏。

建立可复现的故障矩阵

在工单中记录首次异常时间、调用端命名空间、Pod 与节点、被调服务、协议、端口、期望响应和最近变更。分别标记短名称、完整域名、Service IP、后端 Pod IP 的表现;没有取得探测授权时,先从既有应用日志和监控补齐,未知项保持未知。一次访问成功不能代表全部副本、节点或地址族正常。

对照至少一个正常调用端与一个异常调用端,优先选用同一业务、相同发布版本和请求语义。把“全部域名失败”“仅一个服务失败”“仅外部域名失败”“只在某节点失败”分开,能减少不必要的 DNS 全局调整。记录超时、拒绝连接、NXDOMAIN、SERVFAIL 等原始错误,不把所有失败统一写成网络不通。

先核对 Service 与后端对象

以下查询不更改资源。查看 Service 的类型、选择器、端口映射、地址族和流量策略,再核对同命名空间全部相关 EndpointSlice;一个 Service 可以对应多个切片,不能只查看第一项。示例选择器通过 Service 名称定位切片,仍要核对其管理者与实际目标。

kubectl config current-context
kubectl -n NAMESPACE get service SERVICE_NAME -o yaml
kubectl -n NAMESPACE get endpointslices -l kubernetes.io/service-name=SERVICE_NAME -o yaml
kubectl -n NAMESPACE get pods -o wide --show-labels

EndpointSlice 中的地址、端口与 ready、serving、terminating 条件应结合当前 Service 行为解释。选择器拼写不一致、命名 targetPort 不匹配、后端未就绪均应先交给应用负责人确认;不要直接手改控制器管理的 EndpointSlice。Headless Service、ExternalName 和无选择器 Service 的语义不同,不能统一要求它们存在普通 ClusterIP 与自动生成的后端列表。详见 Service 排查

将 DNS 服务与业务域名分开

先识别安装中真正使用的 DNS Service、DNS Pod 和可能存在的 NodeLocal DNSCache,不假设组件名称、标签与所有发行版相同。常见 CoreDNS Service 名为 kube-dns,但查询前应确认。检查 DNS Service 的 UDP/TCP 端口、EndpointSlice、Pod 就绪和近期重启;只有日志读取授权时才查看有限时间窗口。

kubectl -n kube-system get services
kubectl -n kube-system get endpointslices -l kubernetes.io/service-name=DNS_SERVICE_NAME -o yaml
kubectl -n kube-system get pod DNS_POD_NAME -o wide
kubectl -n kube-system logs DNS_POD_NAME -c DNS_CONTAINER_NAME --since=10m --tail=200 --timestamps

CoreDNS 的 API 访问错误、上游解析错误与进程资源异常要分别记录。未看到查询日志不等于没有请求,因为查询日志插件可能没有启用。启用详细 DNS 日志属于配置变更,会增加负载并记录访问域名,必须另行审批、限定时间并准备撤回;本手册不默认开启。官方核对入口为 DNS 调试

在授权后检查调用端解析配置

从 Pod 对象先检查 dnsPolicy、dnsConfig、hostNetwork 及所在节点。随后如需实际查看容器内解析文件,应取得 pods/exec 权限和业务负责人同意。kubectl exec 会在容器中启动进程,不是纯 API 只读查询;即使执行的命令只读文件,也可能增加审计事件和少量负载。

kubectl -n NAMESPACE get pod POD_NAME -o yaml
# 下行仅在获得容器内执行授权后使用,不安装软件。
kubectl -n NAMESPACE exec POD_NAME -c CONTAINER_NAME -- cat /etc/resolv.conf

比对 nameserver、search 与 ndots,使用实际集群域而非默认认定 cluster.local。短名称受命名空间和搜索域影响;完整域名末尾的点用于避免继续追加搜索后缀。hostNetwork 与 ClusterFirstWithHostNet 的组合需按操作系统核验,Windows 不支持这一策略。不要用修改容器内 /etc/hosts 的方式掩盖服务发现问题。策略边界参考 Pod 与 Service DNS

批准有限探测后逐层比较

使用已存在且经批准的诊断容器;如果没有 dig、nslookup 或协议客户端,不在业务容器临时安装,也不默认创建特权 Pod。先申请诊断资源、镜像来源和生命周期,再选择具体方案。获准后限制请求次数、超时与目标,禁止扫描整个网段;HTTP 探测只使用业务确认无副作用的健康接口,不向真实支付、任务触发或写接口发测试请求。

从相同源端依次比较完整服务域名、Service IP 和各个后端地址,并记录实际使用的 Service 端口与容器目标端口。对 HTTPS 必须保持正确的主机名、SNI 和证书校验;直接改成 IP 可能制造证书错误,不能据此认定网络故障。UDP 与 TCP DNS 分别测量,应用正常需要的协议才纳入通过标准。诊断工具结果也需与应用实际解析库及缓存行为对照。

分析策略与节点数据面

读取调用端和服务端命名空间 NetworkPolicy,核对真实标签是否被选中、出口和入口是否分别允许目标流量;DNS 还需要考虑实际解析器所在位置。多条标准策略按允许规则累加,而不是按文件顺序覆盖。资源存在不代表网络插件已实施策略。NodeLocal DNS、Service 地址转换与插件扩展策略应按照具体实现评估,不能只凭一份 YAML 下结论。NetworkPolicy 官方说明 说明了这些边界。

若后端直连成功但 Service 路径失败,再检查实际代理实现、节点级异常与已采集的网络指标。使用 eBPF 等替代数据面的集群,不应强行寻找或重启 kube-proxy。将节点、地址族、源命名空间作为对照维度,不清空 iptables、不全网放通、不一次重启所有网络组件。抓包可能包含敏感数据,必须另行确定范围与保留策略。

最小变更、停止条件与回退

只有在证据能指向具体对象后才进入变更:例如纠正单个 Service 的端口引用、恢复误改的标签或撤回一条近期错误策略。审批记录需要包含配置原版本、拟修改字段、预计传播时间、观察窗口和停止负责人。优先在非核心副本或测试命名空间验证,按 GitOps 或平台现有入口落地,避免手动修复被自动同步覆盖。

如果故障扩散到多个节点、API 不稳定、错误率明显上升或无法确认策略影响范围,停止新增变更并升级事件级别。回退只恢复本次已确认修改对象的前一个已知版本;不删除全部策略,不批量重建服务。已产生的业务请求或数据写入无法由配置回退自动撤销,应由应用负责人另行核对。

验收与值班交接

按事先约定的窗口观察完整 DNS 缓存周期、就绪探针周期和代表性业务请求。验收至少覆盖原异常源端、正常对照源端、相关节点与地址族;业务成功率和延迟回到团队基线,DNS 错误和后端重启不再持续增加,同时原来应该拒绝的访问仍然被拒绝。负向权限验证需有独立授权,不能随意连接未批准资产。

交接表记录每条假设、证据、结论、修改对象、恢复时间和未验证项。若只是重启后暂时恢复,标记为临时缓解,不伪装成根因已解决。将配置差异和版本边界关联到场景步骤,后续值班人员能够按同一来源复查,而不是依赖截图猜测当时对象状态。

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 只有短名称的既有请求失败,完整域名记录正常,异常集中在某命名空间且应用版本没有变化。

    只读核对
    只读核对调用端 Pod 的 dnsPolicy、dnsConfig、hostNetwork 与实际集群域,并比较正常对照的对象配置。
    如何判读
    现象支持搜索域或解析配置差异,但还需考虑应用缓存与实际解析器;不能直接认定全部 CoreDNS 服务故障。
  2. 后端已有成功访问记录,Service 路径仍失败,部分副本处于 Running 但端点就绪信息不一致。

    只读核对
    读取 Service 类型、端口映射与全部相关 EndpointSlice,对照 Pod 标签、就绪条件及现有节点数据面日志。
    如何判读
    可能涉及端点选择、端口或转发实现;Running 不是服务可用证明,特殊 Service 也不能套普通端点判据。
  3. 异常仅出现在部分节点或某地址族,策略对象存在却无法说明实际实施情况,日志没有完整请求记录。

    只读核对
    只读审阅真实插件、源出口和目标入口策略、匹配标签及已有网络指标,分别记录未启用日志和权限缺口。
    如何判读
    策略存在不代表已实施,缺日志也不等于无流量;需要实际实现与对照证据,不能先全网放通验证猜测。
常见误区与判断边界 2 项

把 DNS 画成所有业务流量的代理

DNS 通常为客户端提供地址信息,后续请求仍沿应用到服务或后端的路径传递。域名访问失败可能发生在解析之后,也可能因 TLS 主机名或服务端口不匹配;应保持请求身份和协议证据,不能靠关闭校验或改 hosts 让错误表面消失。

只读对象权限等于任意排障权限

容器执行会启动进程,主动探测产生流量,创建诊断 Pod 或开启详细日志还会改变环境及数据暴露范围。当前诊断清单先读取已有对象和限定日志,不假定这些额外动作获准;缺少工具或权限时明确待授权,而不是新增特权资源继续调查。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 保存正常与异常源端、命名空间、节点、版本、协议和时间的对照矩阵,未授权探测项标为未知而非填入猜测结果。
  • 关联 Service 类型、端口和全部 EndpointSlice 的受控快照,记录标签及就绪差异,说明特殊服务不适用的常规判据。
  • 保留实际 DNS、NodeLocal 与节点数据面信息、策略匹配和限定日志摘要,区分真实错误、未启用采集与读取权限缺口。
  • 交接每项假设的支持与反证、最小修复候选、已有访问隔离证据及未覆盖节点,暂时缓解不写成根因已经解决。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。