Kubernetes 作为现代云原生架构的核心编排工具,其服务发现与网络通信机制高度依赖 DNS 和 Ingress 控制器(如 Nginx),三者协同构建了集群内外的流量路由体系,确保应用可访问性与稳定性。

Kubernetes DNS 核心机制
在 Kubernetes 集群中,DNS 服务(通常由 CoreDNS 或 Kube-DNS 提供)承担着服务名称解析的关键角色,每个 Service 资源会自动分配一个 DNS 记录(格式为 <service-name>.<namespace>.svc.cluster.local),Pod 可通过该域名跨命名空间或集群内部访问服务,若创建名为 web-service 的 Service,Pod 内可通过 http://web-service.default.svc.cluster.local 访问,无需关心后端 Pod 的 IP 变化。
DNS 还支持SRV 记录解析,用于服务发现(如数据库连接字符串中的端口自动映射),以及 ExternalName 类型 Service 解析外部域名(如将 external-api 映射到公网地址 api.example.com),这种抽象层极大简化了微服务间的调用逻辑。
Nginx Ingress Controller 的作用
Ingress 是 Kubernetes 对外暴露服务的标准化方式,而 Nginx Ingress Controller 则是实现这一功能的主流组件,它作为反向代理运行在集群边缘节点,监听 Ingress 资源的配置变更,动态生成 Nginx 配置文件以实现以下核心能力:
-
基于路径/主机名的路由:根据请求的 Host 头或 URL 路径,将流量分发至不同 Service。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80该配置会将
app.example.com域名下的所有请求转发至web-service的 80 端口。 -
TLS 终止与证书管理:通过
tls字段关联 Secret 存储的 TLS 证书,自动处理 HTTPS 加密流量。 -
负载均衡与故障转移:内置健康检查机制,结合 Kubernetes Service 的 Endpoint 列表,实现后端 Pod 的负载均衡与自动故障隔离。
三者协同工作流程
当外部用户访问 https://app.example.com 时,流程如下:

- 客户端发起 DNS 查询,本地 DNS 或递归服务器最终指向集群内 CoreDNS;
- CoreDNS 解析
app.example.com为 Nginx Ingress Controller 的 NodePort/IP(需提前配置 A 记录); - 流量到达 Nginx Ingress Controller 后,根据 Ingress 规则匹配路径/主机,转发至目标 Service 的 ClusterIP;
- Service 通过标签选择器将流量分发至后端 Pod,完成整个请求链路。
此过程中,DNS 提供全局命名解析,Nginx 负责流量调度,Kubernetes 维护资源状态一致性,形成闭环的服务交付体系。
| 组件 | 核心功能 | 关键配置项 |
|---|---|---|
| Kubernetes DNS | 服务名称解析、SRV记录支持 | kube-dns Service、Corefile 配置 |
| Nginx Ingress | 反向代理、路由规则、TLS 终止 | Ingress 资源、ConfigMap(Nginx 参数) |
| 协同点 | DNS 解析 Ingress 外部地址,Nginx 转发至 Service | nginx.ingress.kubernetes.io/rewrite-target 注解等 |
常见问题与解决方案
Q1:为什么 Pod 无法解析自定义域名?
A:需确保 CoreDNS 配置中包含自定义域名的上游 DNS 服务器,可通过修改 ConfigMap 增加 forward . /etc/resolv.conf 以继承节点 DNS 设置,或手动添加 hosts 条目映射特定域名。
Q2:Nginx Ingress 如何处理 WebSocket 连接?
A:默认配置可能因超时导致连接中断,需在 Ingress 注解中设置 nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" 延长读取超时,并在 Nginx ConfigMap 中调整 proxy_http_version 为 1 并启用 proxy_set_header Upgrade $http_upgrade。