5分钟搞定Kubespray DNS配置:从CoreDNS到自定义域名全攻略
【免费下载链接】kubespray 项目地址: https://gitcode.com/gh_mirrors/kub/kubespray
你还在为Kubernetes集群内服务发现头疼?部署了应用却无法通过域名访问?本文将带你一步解决Kubespray环境下CoreDNS配置与自定义域名解析问题,读完你将掌握:
- CoreDNS基础配置与参数优化
- 自定义域名解析的3种实用方案
- 节点本地DNS缓存加速技巧
- 常见解析故障排查方法
DNS服务发现基础
Kubernetes集群通过DNS(域名系统)实现服务发现,Kubespray默认使用CoreDNS作为集群DNS服务器。CoreDNS通过Kubernetes插件监听Service和Endpoint变化,自动维护域名解析记录,让Pod可以通过服务名访问其他服务。
Kubespray的DNS架构包含两个核心组件:
- CoreDNS:集群级DNS服务器,提供域名解析服务
- NodeLocal DNS Cache:节点本地DNS缓存代理,减少DNS查询延迟
完整DNS配置文档可参考docs/dns-stack.md。
CoreDNS配置详解
默认配置结构
Kubespray通过Ansible模板生成CoreDNS配置,主要配置文件为roles/kubernetes-apps/ansible/templates/coredns-config.yml.j2。默认配置包含:
.:{{ coredns_port }} {
errors
health {
lameduck 5s
}
ready
kubernetes {{ dns_domain }} in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
核心配置参数
| 参数 | 说明 | 默认值 |
|---|---|---|
dns_domain | 集群内部域名后缀 | cluster.local |
ndots | 域名查询最小点数量 | 5 |
upstream_dns_servers | 上游DNS服务器 | 8.8.8.8, 8.8.4.4 |
enable_nodelocaldns | 是否启用节点本地DNS缓存 | true |
修改这些参数需在Kubespray inventory文件中定义,例如:
dns_domain: "k8s.example.com"
ndots: 3
upstream_dns_servers:
- 114.114.114.114
- 223.5.5.5
自定义域名解析方案
1. 使用hosts文件
通过dns_etchosts参数添加静态DNS记录,适用于少量固定解析需求:
dns_etchosts: |
192.168.1.100 api.example.com
192.168.1.101 web.example.com
配置后,CoreDNS会自动加载这些记录,可通过roles/kubernetes-apps/ansible/templates/coredns-config.yml.j2中的hosts插件实现:
hosts /etc/coredns/hosts {
fallthrough
}
2. 配置外部域名转发
通过coredns_external_zones参数将特定域名转发到指定DNS服务器,适用于内部服务域名解析:
coredns_external_zones:
- zones:
- example.com
- example.io:1053
nameservers:
- 192.168.1.10
- 192.168.1.11
cache: 5
此配置会在CoreDNS中生成如下配置块:
example.com example.io:1053 {
log
errors
forward . 192.168.1.10 192.168.1.11
loadbalance
cache 5
reload
}
3. 配置域名重写规则
通过coredns_rewrite_block参数实现域名重写,适用于服务迁移或域名变更场景:
coredns_rewrite_block: |
rewrite name stop old-service.example.com new-service.default.svc.cluster.local
rewrite name regex (.*)\.legacy\.com {1}.new.com
NodeLocal DNS缓存配置
Kubespray默认启用NodeLocal DNS缓存,通过减少网络跳转和DNS查询延迟提升服务发现性能。配置文件位于roles/kubernetes-apps/ansible/templates/nodelocaldns-config.yml.j2。
高可用配置
启用双实例提高可用性:
enable_nodelocaldns_secondary: true
nodelocaldns_secondary_skew_seconds: 5
配置后每个节点将运行两个DNS缓存实例,避免单点故障导致的解析中断。
缓存优化
调整缓存参数优化性能:
coredns_default_zone_cache_block: |
cache 3600 {
success 3000
denial 0
prefetch 10 1m
}
常见问题排查
解析超时问题
- 检查CoreDNS Pod状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns
- 查看CoreDNS日志:
kubectl logs -n kube-system -l k8s-app=kube-dns
- 验证NodeLocal DNS缓存状态:
kubectl get pods -n kube-system -l k8s-app=nodelocaldns
自定义域名不生效
- 检查CoreDNS配置是否正确应用:
kubectl get configmap -n kube-system coredns -o yaml
-
验证DNS配置是否被Kubespray正确渲染,可查看模板文件roles/kubernetes-apps/ansible/templates/coredns-config.yml.j2。
-
使用nslookup测试解析:
kubectl run -it --rm --image=busybox:1.28.4 -- nslookup custom.domain.com
总结与最佳实践
- 性能优化:启用NodeLocal DNS缓存,合理设置缓存TTL
- 高可用配置:生产环境建议启用双实例NodeLocal DNS
- 自定义解析:少量静态记录用hosts,大量外部域名用external_zones
- 平滑迁移:使用rewrite规则和old_dns_domains实现域名无缝切换
通过本文介绍的方法,你可以轻松配置Kubespray环境下的DNS服务,实现高效稳定的服务发现。更多高级配置请参考官方文档docs/dns-stack.md。
点赞收藏本文,关注获取更多Kubespray实战技巧!下期预告:Kubespray网络插件性能对比。
【免费下载链接】kubespray 项目地址: https://gitcode.com/gh_mirrors/kub/kubespray
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



