在將業務容器化部署到容器叢集時,除了訪問叢集內部服務外,往往還需要訪問外部相關服務或介面,因而外部網域名稱解析變得至關重要。為了最佳化解析速度,可以通過直接指定外部網域名稱對應的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串連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.252YAML中配置了兩個自訂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.138YAML中自訂上遊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