在將業務容器化部署到容器集群時,除了訪問集群內部服務外,往往還需要訪問外部相關服務或接口,因而外部域名解析變得至關重要。為了優化解析速度,可以通過直接指定外部域名對應的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及以上。具體操作,請參見服務發現DNS。
已通過kubectl工具連接Kubernetes集群。具體操作,請參見獲取集群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