在将业务容器化部署到容器集群时,除了访问集群内部服务外,往往还需要访问外部相关服务或接口,因而外部域名解析变得至关重要。为了优化解析速度,可以通过直接指定外部域名对应的DNS Server,以改善DNS外部域名解析路径。同时,对于一些已经配置了静态IP服务域名,可以考虑通过类似本地hosts文件方式来进行配置。本文介绍如何通过定义CustomDNSConfig CR来配置托管版CoreDNS的DNS配置来满足这些类似的场景需求。
自定义CoreDNS配置功能说明
以下为自定义CoreDNS配置示例。
apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
name: default
namespace: default
spec:
zones:
- name: example.com
forward:
protocolStrategy: ""
transportConfig: {}
upstreams:
- xxx.xxx.xxx.xxx # IP address
- xxx.xxx.xxx.xxx:53 # IP:port
hosts:
- hostName: "a.example.com"
ipAddress: xxx.xxx.xxx.xxx
自定义zone,zone格式需要符合FQDN标准,默认值为
"."
。.forward.protocolStrategy
默认值为"",表示采用UDP协议转发,如有需要可以配置为tcp
。.forward.transportConfig
默认值为{},可以不配置,当前未开放支持。单个zone下可以自定义配置
.forward.upstreams
,即上游DNS server地址,可以是IP或者IP: PORT的形式,仅支持IPv4协议。若不定义
.forward.upstreams
,则默认使用阿里云云解析 ,即PrivateZone。.forward.upstreams
下可定义多个上游DNS Server地址,最多15个。
单个zone下可以自定义配置hosts插件,支持定义静态域名地址。
hostName
参数用于定义具体的域名,域名格式需要符合DNS规范。ipAddress
参数用于定义具体域名对应的IP地址,需要是有效的IPv4地址。同一个
hostName
可以定义多个不同的ipAddress
,例如:... hosts: - hostName: "a.example.com" ipAddress: 10.0.0.123 - hostName: "a.example.com" ipAddress: 10.0.0.124 ...
CustomDNSConfig
是一个非namespace级别的CRD资源,当前仅支持创建名为default的CustomDNSConfig CR。
前提条件
已安装CoreDNS托管版组件,组件版本为v1.9.3.20及以上。具体操作,请参见管理组件。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
场景一:配置自定义zone
使用以下内容创建default.yaml。
apiVersion: networking.alibabacloud.com/v1beta1 kind: CustomDNSConfig metadata: name: default spec: zones: - name: example.com forward: upstreams: - 100.100.2.136 #自定义example.com的上游DNSServer为100.100.2.136和100.100.2.138 - 100.100.2.138 - name: foo.com hosts: - hostName: "a.foo.com"#自定义foo.com zone下的a.foo.com和b.foo.com静态地址 ipAddress: 192.168.0.251 - hostName: "b.foo.com" ipAddress: 192.168.0.252
YAML中配置了两个自定义zone:
example.com
自定义上游DNS Server为
100.100.2.136
和100.100.2.138
。说明100.100.2.136
和100.100.2.138
是系统分配的默认内网DNS解析服务地址。更多信息,请参见服务地址。foo.com
自定义
a.foo.com
和b.foo.com
静态地址。
执行以下命令,创建CustomDNSConfig。
kubectl apply -f default.yaml
执行以下命令,查看生成的corefile。
kubectl get customdnsconfig default -o yaml |grep corefile -A 35 -B 1
预期输出:
status: corefile: | example.com:53 { prometheus :9153 forward . 100.100.2.136 100.100.2.138 { policy random prefer_udp } ... } foo.com:53 { prometheus :9153 hosts { 192.168.0.251 a.foo.com 192.168.0.252 b.foo.com fallthrough } forward . /etc/resolv.conf { policy random prefer_udp } ... } ... -- corefileHash: 41f7be21cf3022c305091665ed33b1e5 lastTransitionTime: "2024-09-13T09:07:37Z" phase: GenerateSuccess
可以看到名为default的CustomDNSConfig已经创建成功,对应的
corefile
内容可以在status
下可见。
场景二:修改默认zone配置
使用以下内容创建default.yaml。
apiVersion: networking.alibabacloud.com/v1beta1 kind: CustomDNSConfig metadata: name: default spec: zones: - name: . forward: upstreams: - 100.100.2.136 #自定义默认zone "." 的上游DnsServer 为100.100.2.136 和 100.100.2.138 - 100.100.2.138
YAML中自定义上游DNS Server为
100.100.2.136
和100.100.2.138
。执行以下命令,创建CustomDNSConfig。
kubectl apply -f default.yaml
执行以下命令,查看生成的corefile。
kubectl get customdnsconfig default -o yaml |grep corefile -A 35 -B 1
预期输出:
status: corefile: | .:53 { errors health { lameduck 20s } ready kubeapi { kubeconfig /etc/kubernetes/config/managed-coredns.conf } k8s_event { level error warning } ... prometheus :9153 forward . 100.100.2.136 100.100.2.138 { policy random prefer_udp } ... } corefileHash: 847bf69cc4c97cee965945f45d17c661 lastTransitionTime: "2024-09-13T09:54:22Z" phase: GenerateSuccess
可以看到名为default的CustomDNSConfig已经创建成功,corefile已经生成。
说明CustomDNSConfig
创建或修改后,CoreDNS需要进行一次配置的reload,过程大约20s。您可以通过修改corefile
中的lamduck
值(默认20秒)来调整CoreDNS的reload时长。
错误排查方式
由于当前仅支持创建名为default的CustomDNSConfig CR,本节通过创建其他命名的CustomDNSConfig CR演示CustomDNSConfig状态为NotSupported
时的原因。
使用以下内容创建test.yaml。
apiVersion: networking.alibabacloud.com/v1beta1 kind: CustomDNSConfig metadata: name: test ##仅支持名为default 的CR, 不支持其他 spec: zones: - name: example.com forward: upstreams: - 100.100.2.138 - name: foo.com hosts: - hostName: "ah.foo.com" ipAddress: 1.1.xx.251 - hostName: "aha.foo.com" ipAddress: 1.1.xx.252
执行以下命令,创建CustomDNSConfig。
kubectl apply -f test.yaml
执行以下命令,查看生成的corefile。
kubectl get customdnsconfig
预期输出:
NAME PHASE VERSION AGE default GenerateSuccess 847bf69cc4c97cee96xxxxxxxxxxx 89m test NotSupported 9s
可以看到命名为test的CustomDNSConfig无法创建成功,显示为
NotSupported
。
Event相关信息
自定义CoreDNS配置的Controller会同步相关Event信息到default Namespace下。
执行以下命令,查看Events。
kubectl get events
预期输出:
LAST SEEN TYPE REASON OBJECT MESSAGE
45m Normal CustomDNSConfigSyncOk customdnsconfig/default custom dns config sync to coredns configmap success