KCE集群中默认部署了CoreDNS,工作负载后端是分别部署在两个节点上的Pod,以 coredns 服务名暴露。集群会根据Pod内的配置,将域名请求转发至集群的DNS服务器获取结果。Pod内的DNS域名解析配置文件为/etc/resolv.conf
。
容器集群支持 dnsPolicy
字段为每个 Pod 配置不同的 DNS 策略。目前容器集群支持四种策略:
ClusterFirst
:通过 CoreDNS 来做域名解析,Pod 内/etc/resolv.conf
配置的 DNS 服务地址是集群 DNS 服务的 KubeDNS 地址。该策略是集群工作负载的默认策略。None
:忽略集群 DNS 策略,需要您提供 dnsConfig
字段来指定 DNS 配置信息。Default
:Pod 直接继承集群节点的域名解析配置。即在容器集群直接使用云服务的/etc/resolv.conf
文件(文件内配置的是金山云DNS服务)。ClusterFirstWithHostNet
:强制在 hostNetWork 网络模式下使用 ClusterFirst 策略(默认使用 Default 策略)。Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
# hosts can add hosts's item into dns, see https://coredns.io/plugins/hosts/
hosts {
198.18.96.191 hub.kce.ksyun.com
fallthrough
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
配置说明:
198.18.96.191
。/etc/resolv.conf
上去。由于KCE默认的 CoreDNS Deployment 中,将 CoreDNS 的 Pod 中的 dnsPolicy 设置成了 default,Pod 直接继承集群节点的域名解析配置。即在容器集群直接使用云服务的
/etc/resolv.conf
文件(文件内配置的是金山云DNS服务)。
如果业务 Pod 采用的 dnsPolicy 为 ClusterFirst 。那么按照这个默认配置情况下,业务 Pod 访问 dns 的请求流程如下:
/etc/resolv.conf
中的配置,将 dns 请求转发到 coreDNS clusterIP 上去。/etc/resolv.conf
继续处理,文件内默认配置的是金山云DNS服务(无法解析业务方内部域名以及其他友商的内部域名)。基于上述原理,此处列举一种场景介绍如何进行相关配置。
在使用KCE时,可能会出现有解析自定义内部域名的需求,例如:
1.执行以下命令,修改 CoreDNS 的 configmap。
$ kubectl edit configmap coredns -n kube-system
2.修改 hosts 配置,将域名加入到 hosts,示例如下:
hosts {
198.18.96.191 hub.kce.ksyun.com
# 新增 hosts 域名
172.2.1.33 nfs-prod.example.com
172.2.2.133 oa-prod.example.com
fallthrough
}
3.完整配置如下
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
# hosts can add hosts's item into dns, see https://coredns.io/plugins/hosts/
hosts {
198.18.96.191 hub.kce.ksyun.com
# 新增 hosts 域名
172.2.1.33 nfs-prod.example.com
172.2.2.133 oa-prod.example.com
fallthrough
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
修改完成后,等待 coreDNS pod 自动加载配置即可。
可以在 coreDNS 中单独配置一个服务块,示例完整配置如下:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
# hosts can add hosts's item into dns, see https://coredns.io/plugins/hosts/
hosts {
198.18.96.191 hub.kce.ksyun.com
fallthrough
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
# 新增服务块
example.com:53 {
errors
cache 30
forward . 10.10.0.10
}
修改完成后,等待 coreDNS pod 自动加载配置即可。
上述两个解决办法的好处:
也有潜在问题:
/etc/resolv.conf
文件(文件内配置的是金山云DNS服务)未同步修改。直接修改集群所有节点的/etc/resolv.conf
,将其 nameserver 改成一个分发域名的 DNS 服务,具体分发策略如下:
修改完节点上的/etc/resolv.conf
配置后,需要重启一下 coreDNS Pod才能生效。
这种方法的好处:
相应问题:
/etc/resolv.conf
配置,新增节点时,也需要有这个操作。文档内容是否对您有帮助?
评价建议不能为空
非常感谢您的反馈,我们会继续努力做到更好!