1. RKE2 CoreDNS自定义的必要性与场景
在Kubernetes集群中,DNS解析是基础设施中的关键组件。RKE2作为轻量级的Kubernetes发行版,默认使用CoreDNS作为集群内的DNS服务器。不同于标准Kubernetes的是,RKE2对CoreDNS进行了深度集成和优化,使其配置方式具有特殊性。
为什么需要自定义CoreDNS?根据我的运维经验,主要存在以下几种典型场景:
- 需要添加企业内部私有域名解析(如.company.internal)
- 需要配置特定域名的上游DNS服务器(如将.aws区域指向Route 53的DNS服务器)
- 需要修改缓存时间等性能参数
- 需要添加插件支持(如prometheus监控插件)
注意:RKE2的CoreDNS配置与原生Kubernetes不同,直接修改ConfigMap会导致配置被RKE2控制器覆盖。这是许多初学者容易踩的坑。
2. RKE2 CoreDNS架构解析
2.1 RKE2的CoreDNS部署特点
RKE2通过以下方式管理CoreDNS:
- 使用Helm Chart部署,位于rke2-coredns命名空间
- 配置通过Secret(rke2-coredns)存储而非ConfigMap
- 自动生成Corefile并挂载到Pod内
这种设计使得直接修改CoreDNS Pod内的配置文件无效,因为Pod重启后配置会被重建。理解这一点是进行自定义配置的前提。
2.2 配置持久化机制
RKE2通过两个关键组件维护CoreDNS配置:
/var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml- Helm Chart定义/var/lib/rancher/rke2/server/static/charts/rke2-coredns-X.Y.Z.tgz- Chart包
任何自定义配置都需要通过修改这些源文件实现,而非运行时修改。
3. 自定义配置实操指南
3.1 基础配置修改步骤
以下是添加自定义域名解析的标准流程:
- 登录RKE2 Server节点
- 备份原始配置:
bash复制cp /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml \ /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml.bak - 编辑配置文件:
bash复制
vim /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml - 在
data.Corefile字段添加自定义配置,例如:yaml复制data: Corefile: | .:53 { errors health ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } hosts { 192.168.1.100 myapp.internal fallthrough } forward . /etc/resolv.conf cache 30 } - 保存后等待RKE2自动应用变更(约1-2分钟)
3.2 高级配置示例:自定义上游DNS
对于需要将特定域名指向不同DNS服务器的场景,可以使用forward插件:
yaml复制data:
Corefile: |
example.com:53 {
forward . 10.0.0.1 10.0.0.2
cache 60
}
.:53 {
# 默认配置...
}
3.3 插件集成方法
以添加prometheus监控为例:
- 在配置中添加prometheus指令:
yaml复制data: Corefile: | .:53 { prometheus 0.0.0.0:9153 # 其他配置... } - 更新Helm values启用metrics:
bash复制
添加:vim /var/lib/rancher/rke2/server/values/rke2-coredns.yamlyaml复制prometheus: service: enabled: true monitor: enabled: true
4. 配置验证与问题排查
4.1 验证配置生效
- 检查Pod配置是否更新:
bash复制kubectl -n kube-system exec -it rke2-coredns-xxx -- cat /etc/coredns/Corefile - 测试DNS解析:
bash复制kubectl run -it --rm --image=alpine:latest test -- nslookup myapp.internal
4.2 常见问题解决方案
问题1:配置修改后未生效
- 检查RKE2服务日志:
journalctl -u rke2-server -f - 确认文件权限正确(应为0644)
问题2:DNS解析超时
- 检查CoreDNS Pod日志:
kubectl logs -n kube-system rke2-coredns-xxx - 验证网络策略是否允许DNS流量(UDP 53端口)
问题3:配置语法错误导致CoreDNS崩溃
- 使用
coredns -conf /path/to/Corefile -plugins测试配置文件 - 逐步回退变更定位错误位置
5. 生产环境最佳实践
根据我在多个生产集群的部署经验,推荐以下配置原则:
-
缓存策略优化:
yaml复制cache { success 9984 30 denial 9984 5 }- 成功记录缓存30秒
- 失败记录仅缓存5秒
-
资源限制设置:
yaml复制resources: limits: memory: 256Mi requests: cpu: 100m memory: 128Mi -
多副本部署:
yaml复制replicaCount: 3 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: k8s-app operator: In values: [kube-dns] topologyKey: kubernetes.io/hostname -
监控集成:
- 启用Prometheus指标
- 设置适当的告警规则(如DNS解析成功率<95%)
6. 版本升级注意事项
RKE2升级时可能会覆盖自定义配置,建议:
-
备份当前配置:
bash复制cp -r /var/lib/rancher/rke2/server/manifests/ /backup/rke2-config/ -
使用Git管理配置变更:
bash复制cd /var/lib/rancher/rke2/server/manifests git init git add . git commit -m "Pre-upgrade config snapshot" -
升级后比较并恢复必要配置:
bash复制
diff -u /backup/rke2-config/rke2-coredns-config.yaml \ /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml
在实际操作中,我发现RKE2 1.21+版本对CoreDNS的集成方式有较大变化,升级时需要特别注意Helm Chart版本的兼容性。建议先在测试环境验证配置迁移方案。
