5分钟搞定Kubespray DNS配置:从CoreDNS到自定义域名全攻略

5分钟搞定Kubespray DNS配置:从CoreDNS到自定义域名全攻略

【免费下载链接】kubespray 【免费下载链接】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
  }

常见问题排查

解析超时问题

  1. 检查CoreDNS Pod状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns
  1. 查看CoreDNS日志:
kubectl logs -n kube-system -l k8s-app=kube-dns
  1. 验证NodeLocal DNS缓存状态:
kubectl get pods -n kube-system -l k8s-app=nodelocaldns

自定义域名不生效

  1. 检查CoreDNS配置是否正确应用:
kubectl get configmap -n kube-system coredns -o yaml
  1. 验证DNS配置是否被Kubespray正确渲染,可查看模板文件roles/kubernetes-apps/ansible/templates/coredns-config.yml.j2

  2. 使用nslookup测试解析:

kubectl run -it --rm --image=busybox:1.28.4 -- nslookup custom.domain.com

总结与最佳实践

  1. 性能优化:启用NodeLocal DNS缓存,合理设置缓存TTL
  2. 高可用配置:生产环境建议启用双实例NodeLocal DNS
  3. 自定义解析:少量静态记录用hosts,大量外部域名用external_zones
  4. 平滑迁移:使用rewrite规则和old_dns_domains实现域名无缝切换

通过本文介绍的方法,你可以轻松配置Kubespray环境下的DNS服务,实现高效稳定的服务发现。更多高级配置请参考官方文档docs/dns-stack.md

点赞收藏本文,关注获取更多Kubespray实战技巧!下期预告:Kubespray网络插件性能对比。

【免费下载链接】kubespray 【免费下载链接】kubespray 项目地址: https://gitcode.com/gh_mirrors/kub/kubespray

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值