OKE增强型集群CoreDNS自定义Hosts配置自动回滚的问题及持久化配置方案咨询
我太懂你这种郁闷了——辛辛苦苦改了CoreDNS的ConfigMap,等了半天配置生效,结果睡一觉起来又被打回原形,哪怕是增强型OKE集群也没能幸免。其实这个问题的根源很明确:OKE增强型集群的控制平面会定期执行组件reconcile(调和)操作,Oracle的运维系统会把CoreDNS的配置重置回集群默认状态,你的手动修改自然就被覆盖了。
下面给你两种经过验证的持久化方案,按官方推荐程度排序:
方案一:使用OKE官方的DNS自定义功能(最推荐)
Oracle专门为OKE集群提供了自定义DNS记录的功能,完全不需要手动修改CoreDNS的资源,配置会被集群控制平面持久化管理,绝对不会被回滚。
操作步骤很简单:
- 登录OCI控制台,找到你的增强型OKE集群
- 在集群详情页的左侧菜单里找到**"DNS Customization"**(DNS自定义)选项
- 点击**"Add Record"**,选择记录类型(你需要的是A记录,对应IP到域名的映射)
- 填写域名(比如
vm1.example.com)、对应的IP地址,然后保存
这个操作完成后,OKE会自动把这些自定义记录集成到CoreDNS的配置里,所有集群内的Pod都能正常解析这些域名,而且完全不用担心被回滚。
方案二:手动挂载自定义Hosts ConfigMap(适合需要更灵活配置的场景)
如果你需要更复杂的hosts规则(比如批量映射、自定义域后缀),可以通过挂载独立的ConfigMap来实现,避免直接修改默认的coredns ConfigMap。
具体步骤:
1. 创建存储自定义Hosts的ConfigMap
先写一个YAML文件(比如custom-coredns-hosts.yaml):
apiVersion: v1 kind: ConfigMap metadata: name: custom-coredns-hosts namespace: kube-system data: hosts: | # 这里填写你的IP-域名映射,每行一条 10.0.0.10 vm1.example.com 10.0.0.11 vm2.example.com 10.0.0.12 db.example.internal
然后执行命令创建:
kubectl apply -f custom-coredns-hosts.yaml -n kube-system
2. 修改CoreDNS的配置,引入自定义Hosts文件
编辑CoreDNS的ConfigMap:
kubectl edit cm coredns -n kube-system
在Corefile的. :53块里,添加hosts插件配置,引用我们刚才创建的文件(注意要放在kubernetes插件之前,确保自定义记录优先解析):
.:53 { errors health { lameduck 5s } ready # 新增的自定义hosts配置 hosts /etc/coredns/custom-hosts/hosts { fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # 后面的默认配置保留不变 prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance }
3. 修改CoreDNS Deployment,挂载自定义ConfigMap
编辑CoreDNS的Deployment,添加Volume和VolumeMount:
kubectl edit deployment coredns -n kube-system
在spec.template.spec.volumes下添加:
- name: custom-hosts configMap: name: custom-coredns-hosts
然后在spec.template.spec.containers[0].volumeMounts下添加:
- name: custom-hosts mountPath: /etc/coredns/custom-hosts readOnly: true
4. 重启CorePods让配置生效
kubectl rollout restart deployment coredns -n kube-system
这样操作后,你的自定义hosts配置存放在独立的ConfigMap里,OKE的控制平面不会修改这个ConfigMap,CoreDNS通过挂载的方式读取,就能避免被回滚了。
注意事项
- 绝对不要直接修改默认的
corednsConfigMap里的hosts块,不管是增强型还是基础型集群,OCI的控制平面都会定期重置这个配置 - 方案一的官方DNS自定义功能只支持标准的DNS记录类型(A、CNAME等),如果需要更复杂的规则(比如通配符、自定义域的完全接管),再用方案二
- 每次修改自定义Hosts ConfigMap后,记得重启CoreDNS Pod让配置生效
备注:内容来源于stack exchange,提问作者Sahil Aggarwal

