1. RKE2 CoreDNS自定义配置的必要性
在Kubernetes集群中,DNS解析是基础设施的核心组件之一。RKE2作为经过CNCF认证的Kubernetes发行版,其内置的CoreDNS服务承担着集群内部服务发现的关键角色。但在实际生产环境中,我们经常需要根据特定需求对CoreDNS进行定制化配置。
CoreDNS的默认配置虽然能满足基本需求,但在以下场景中往往需要进行深度定制:
- 需要添加自定义域名解析记录
- 需要配置特定的上游DNS服务器
- 需要实现基于条件的转发规则
- 需要集成企业内部的DNS服务
- 需要调整缓存策略以提高性能
2. RKE2中CoreDNS的架构解析
2.1 RKE2网络组件架构
RKE2采用了独特的网络组件架构设计:
code复制+-----------------------+
| RKE2 Node |
| |
| +-----------------+ |
| | CoreDNS Pod | |
| | (kube-system) | |
| +--------+--------+ |
| | |
| +--------v--------+ |
| | Host Network | |
| | (rke2-coredns) | |
| +-----------------+ |
+-----------------------+
这种双层的DNS架构设计确保了即使在Kubernetes控制平面不可用时,节点级别的DNS解析仍能正常工作。
2.2 CoreDNS配置文件结构
RKE2中的CoreDNS配置主要包含三个关键部分:
- Corefile:主配置文件,位于
/var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml - Custom资源:通过Kubernetes ConfigMap存储的自定义配置
- 插件配置:各种CoreDNS插件的参数设置
3. 自定义CoreDNS配置的完整流程
3.1 准备工作
在开始修改前,请确保:
- 已安装kubectl并配置好kubeconfig
- 对RKE2集群有管理员权限
- 备份现有配置:
bash复制
kubectl -n kube-system get configmap coredns -o yaml > coredns-backup.yaml
3.2 修改CoreDNS ConfigMap
-
编辑现有的ConfigMap:
bash复制
kubectl -n kube-system edit configmap coredns -
在Corefile部分添加自定义配置。例如添加自定义域名解析:
text复制
.:53 { errors health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance # 自定义域名解析 hosts { 192.168.1.100 myapp.internal fallthrough } }
3.3 高级配置示例
3.3.1 条件转发配置
实现特定域名的转发规则:
text复制example.org {
forward . 10.0.0.1 10.0.0.2
cache 60
}
3.3.2 日志记录配置
启用详细日志记录:
text复制. {
log
errors
...
}
3.3.3 缓存优化配置
调整缓存参数:
text复制. {
cache {
success 9984 30
denial 9984 5
prefetch 10 60s 10%
}
}
3.4 应用并验证配置
- 保存修改后,CoreDNS会自动重新加载配置(约30秒内)
- 验证配置是否生效:
bash复制kubectl -n kube-system logs -l k8s-app=kube-dns --tail=100 - 测试DNS解析:
bash复制kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup myapp.internal
4. 常见问题排查指南
4.1 配置未生效
症状:修改后DNS解析没有变化
排查步骤:
- 检查CoreDNS Pod是否正常运行:
bash复制
kubectl -n kube-system get pods -l k8s-app=kube-dns - 查看CoreDNS日志是否有错误:
bash复制
kubectl -n kube-system logs -l k8s-app=kube-dns - 确认ConfigMap是否被正确挂载:
bash复制
kubectl -n kube-system describe pod <coredns-pod-name>
4.2 解析性能问题
症状:DNS查询响应慢
优化建议:
- 增加缓存大小和TTL
- 调整forward超时时间:
text复制
forward . /etc/resolv.conf { max_concurrent 1000 expire 10s } - 考虑使用NodeLocal DNSCache
4.3 自定义hosts不生效
症状:添加的hosts记录无法解析
解决方案:
- 确保hosts块放在forward之前
- 检查是否有
fallthrough指令 - 确认IP地址格式正确
5. 生产环境最佳实践
5.1 配置管理策略
- 版本控制:将CoreDNS配置纳入Git版本管理
- 渐进式部署:先在小范围测试,再全集群推广
- 监控告警:设置CoreDNS性能监控
bash复制# Prometheus示例告警规则 - alert: CoreDNSHighLatency expr: rate(coredns_dns_request_duration_seconds_sum[1m]) / rate(coredns_dns_request_duration_seconds_count[1m]) > 0.5 for: 5m labels: severity: warning annotations: summary: "CoreDNS high latency detected"
5.2 性能优化技巧
- 根据集群规模调整CoreDNS副本数:
bash复制
kubectl -n kube-system scale deployment coredns --replicas=3 - 启用autopath插件优化外部域名解析:
text复制
kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified autopath @kubernetes fallthrough in-addr.arpa ip6.arpa } - 合理设置缓存参数,通常建议:
- 成功记录缓存:30-60分钟
- 否定记录缓存:1-5分钟
5.3 安全加固建议
- 限制DNS查询来源:
text复制
. { acl { allow net 10.0.0.0/8 block } } - 启用DNSSEC验证:
text复制
. { dnssec { key file /etc/coredns/keys/Kexample.org.+013+12345 } } - 定期更新CoreDNS版本:
bash复制rke2 kubectl set image -n kube-system deployment/coredns coredns=rancher/rke2-coredns:v1.8.4-build20211105
6. 高级自定义场景
6.1 集成外部DNS服务
当需要将特定域名解析转发到企业内网DNS时:
text复制corp.internal {
forward . 10.10.0.1 10.10.0.2
cache 60
errors
log
}
6.2 实现DNS分流
根据域名后缀分流到不同的上游DNS:
text复制. {
forward . /etc/resolv.conf {
except example.com
}
forward example.com 192.168.1.53
}
6.3 自定义插件开发
对于特殊需求,可以开发自定义CoreDNS插件:
- 创建Go模块实现plugin.Handler接口
- 编译自定义CoreDNS镜像:
dockerfile复制FROM coredns/coredns:1.8.3 COPY custom-plugin.so /plugins/ - 在RKE2中部署自定义镜像:
bash复制kubectl -n kube-system set image deployment/coredns coredns=myrepo/coredns-custom:latest
7. 配置备份与恢复
7.1 定期备份策略
- 备份CoreDNS ConfigMap:
bash复制kubectl -n kube-system get configmap coredns -o yaml > coredns-$(date +%Y%m%d).yaml - 备份RKE2 CoreDNS清单:
bash复制cp /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml /backup/
7.2 灾难恢复步骤
- 恢复ConfigMap:
bash复制
kubectl apply -f coredns-backup.yaml - 重启CoreDNS Pod:
bash复制
kubectl -n kube-system rollout restart deployment coredns - 验证服务恢复:
bash复制
kubectl -n kube-system get pods -l k8s-app=kube-dns
8. 版本升级注意事项
当升级RKE2版本时,CoreDNS配置可能会被重置。建议:
- 在升级前备份所有自定义配置
- 检查新版本的CoreDNS默认配置变化
- 使用kubectl diff验证配置变更:
bash复制
kubectl diff -f coredns-backup.yaml - 分阶段进行升级,先测试节点再生产节点
9. 性能监控与调优
9.1 关键监控指标
- 查询延迟:
text复制
rate(coredns_dns_request_duration_seconds_sum[1m])/rate(coredns_dns_request_duration_seconds_count[1m]) - 查询量:
text复制
sum(rate(coredns_dns_requests_total[1m])) by (pod) - 错误率:
text复制
sum(rate(coredns_dns_responses_total{rcode!="NOERROR",rcode!="NXDOMAIN"}[1m])) by (pod)/sum(rate(coredns_dns_responses_total[1m])) by (pod)
9.2 性能调优参数
根据监控数据调整以下参数:
| 参数 | 默认值 | 建议范围 | 说明 |
|---|---|---|---|
| cache.size | 9984 | 5000-30000 | 缓存条目数 |
| cache.ttl | 30s | 30-300s | 成功记录缓存时间 |
| cache.prefetch | 关闭 | 1-20 | 预取阈值 |
| max_concurrent | 0(无限制) | 500-5000 | 最大并发查询数 |
10. 故障排除工具箱
10.1 常用诊断命令
- 检查CoreDNS版本:
bash复制kubectl -n kube-system exec <coredns-pod> -- coredns -version - 测试内部域名解析:
bash复制kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes.default - 检查DNS策略配置:
bash复制kubectl get pod <pod-name> -o jsonpath='{.spec.dnsPolicy}'
10.2 日志分析技巧
- 过滤错误日志:
bash复制
kubectl -n kube-system logs -l k8s-app=kube-dns | grep -i error - 跟踪特定域名的解析过程:
bash复制kubectl -n kube-system logs -l k8s-app=kube-dns | grep "example.com" - 统计查询类型分布:
bash复制kubectl -n kube-system logs -l k8s-app=kube-dns | awk '/^[^#]/ {print $6}' | sort | uniq -c | sort -nr
在实际生产环境中,CoreDNS的配置需要根据具体业务需求不断调整优化。建议每次变更后都进行完整的测试,并建立完善的监控告警机制。对于大型集群,可以考虑部署NodeLocal DNSCache来进一步提升DNS解析性能和可靠性。
