全部產品
Search
文件中心

Container Compute Service:託管CoreDNS支援自訂參數配置

更新時間:Dec 11, 2024

在將業務容器化部署到容器叢集時,除了訪問叢集內部服務外,往往還需要訪問外部相關服務或介面,因而外部網域名稱解析變得至關重要。為了最佳化解析速度,可以通過直接指定外部網域名稱對應的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及以上。具體操作,請參見管理組件

情境一:配置自訂zone

  1. 使用以下內容建立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.136100.100.2.138

      說明

      100.100.2.136100.100.2.138是系統分配的預設內網DNS解析服務地址。更多資訊,請參見服務地址

    • foo.com

      自訂a.foo.comb.foo.com靜態地址。

  2. 執行以下命令,建立CustomDNSConfig。

    kubectl apply -f default.yaml
  3. 執行以下命令,查看產生的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配置

  1. 使用以下內容建立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.136100.100.2.138

  2. 執行以下命令,建立CustomDNSConfig。

    kubectl apply -f default.yaml
  3. 執行以下命令,查看產生的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時的原因。

  1. 使用以下內容建立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
  2. 執行以下命令,建立CustomDNSConfig。

    kubectl apply -f test.yaml
  3. 執行以下命令,查看產生的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