Kubernetes 中,DNS 服务用于服务发现和负载均衡,通过
,以下是关于Kubernetes (K8s) 中 DNS 服务的详细解析与使用指南,本文将涵盖 K8s DNS 的作用、核心组件 CoreDNS 的安装与配置、Pod 的 DNS 策略以及常见问题解答。
K8s DNS 的作用
功能 | 说明 |
---|---|
服务发现 | 通过服务名称(如 myservice.default.svc.cluster.local )访问其他服务,无需依赖 IP 地址。 |
跨命名空间访问 | 支持通过域名后缀区分不同命名空间(如 default.svc.cluster.local )。 |
解耦服务依赖 | 当服务的 IP 地址变更时,DNS 自动更新解析结果,避免手动维护 IP 列表。 |
Pod 通信 | 每个 Pod 自动获取 DNS 配置,可通过主机名或服务名进行通信。 |
核心组件:CoreDNS
CoreDNS 的架构与部署
-
部署方式:
- 使用
kubectl apply f https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
自动部署。 - 包含 Deployment(定义 CoreDNS 副本)、Service(暴露 DNS 服务,默认集群 IP 为
96.0.10
)和 ConfigMap(存储 Corefile 配置)。
- 使用
-
示例配置:
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kubesystem data: Corefile: | .:53 { errors health ready kubernetes cluster.local inaddr.arpa ip6.arpa { fallthrough inaddr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance }
CoreDNS 的核心插件
插件 | 功能 |
---|---|
kubernetes |
从 K8s API 读取服务和端点信息,生成 DNS 记录。 |
prometheus |
暴露监控指标(如 /metrics )。 |
forward |
转发外部域名查询到宿主机的 DNS 服务器(如 /etc/resolv.conf )。 |
cache |
缓存 DNS 查询结果,减少重复请求。 |
loadbalance |
对 A/AAAA 记录进行负载均衡。 |
health |
提供健康检查端点(如 /health ),用于 Kubernetes 探针。 |
Pod 的 DNS 策略与自定义配置
DNS 策略 (dnsPolicy
)
策略 | 说明 |
---|---|
Default |
继承宿主机的 DNS 配置(适用于需要与外部 DNS 服务器交互的场景)。 |
ClusterFirst |
优先使用 K8s DNS 服务,未解析的域名再转发到宿主机 DNS。 |
None |
忽略 K8s DNS 配置,完全通过 dnsConfig 自定义。 |
自定义 DNS 配置 (dnsConfig
)
-
字段说明:
nameservers
:自定义 DNS 服务器列表(最多 3 个)。searches
:域名搜索后缀(最多 6 个)。options
:其他参数(如ndots
、timeout
)。
-
示例配置:
spec: dnsPolicy: "None" dnsConfig: nameservers: 8.8.8.8 1.1.1.1 searches: mynamespace.svc.cluster.local options: name: ndots value: "2"
常见问题与解答
问题 1:如何验证 CoreDNS 是否生效?
解答:
- 创建一个测试 Pod(如
busybox
):kubectl run busybox image=busybox sleep 3600
- 进入 Pod 并执行
nslookup
:kubectl exec busybox it nslookup myservice.default.svc.cluster.local
若返回正确的 Service IP,则 CoreDNS 正常工作。
问题 2:如何自定义服务域名的解析规则?
解答:
- 在 CoreDNS 的
Corefile
中添加自定义规则,将example.com
解析到某个 Service:example.com { fallthrough inaddr.arpa ip6.arpa proxy example.com 10.96.0.10 }
- 重新加载配置(CoreDNS 支持热重载)。