全部產品
Search
文件中心

Container Compute Service:非託管CoreDNS配置說明

更新時間:Dec 11, 2024

ACS預設推薦使用CoreDNS作為DNS伺服器,CoreDNS是一種高效的DNS伺服器,為Kubernetes叢集提供服務發現功能。您可以通過自行安裝並營運非託管版本CoreDNS來定製CoreDNS相關功能的需求。本文介紹ACS叢集中非託管版本的CoreDNS在各應用情境下配置說明。

情境說明

說明

本文檔的內容僅適用於非託管版本的CoreDNS,託管版本的CoreDNS相關配置對使用者不可見,也不支援使用者自行配置。有關託管版CoreDNS的詳細使用,請參見DNS策略配置和網域名稱解析說明。關於如何安裝非託管版本CoreDNS,請參見在ACS叢集內使用非託管CoreDNS

本文示範使用ACS叢集提供的CoreDNS來做網域名稱解析,即使用dnsPolicy: ClusterFirst策略。樣本配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alinux3
  namespace: default
spec:
  containers:
  - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alinux3
  dnsPolicy: ClusterFirst

關於dnsPolicy配置和情境說明,請參見DNS原理和配置說明

CoreDNS的預設配置

在ACS叢集命名空間kube-system下,有一個CoreDNS配置項。CoreDNS會基於該配置項啟用和配置外掛程式。不同CoreDNS版本的配置項有略微差異,修改配置前請仔細閱讀CoreDNS官方文檔。以下是1.6.2版本CoreDNS預設採用的設定檔:

  Corefile: |
    .:53 {
        errors
        log
        health {
           lameduck 15s
        }
        ready
        kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
              prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }
說明

設定檔中的ClusterDomain指叢集建立過程中填寫的叢集本地區名,預設值為cluster.local

參數

描述

errors

將錯誤資訊輸出到標準輸出。

health

CoreDNS自身健康狀態報表,預設監聽連接埠8080,一般用來做健全狀態檢查。可以通過http://localhost:8080/health擷取健康狀態。

ready

CoreDNS外掛程式狀態報表,預設監聽連接埠8181,一般用來做可讀性檢查。可以通過http://localhost:8181/ready擷取可讀狀態。當所有外掛程式都運行後,ready狀態為200。

kubernetes

CoreDNS Kubernetes外掛程式,提供叢集內服務解析能力。

prometheus

CoreDNS自身metrics資料介面。可以通過http://localhost:9153/metrics擷取Prometheus格式的監控資料。

forward(或proxy

將網域名稱查詢請求轉到預定義的DNS伺服器。預設配置中,當網域名稱不在Kubernetes域時,將請求轉寄到預定義的解析器(/etc/resolv.conf)中。預設使用宿主機的/etc/resolv.conf配置。

cache

DNS緩衝。

loop

環路檢測,如果檢測到環路,則停止CoreDNS。

reload

允許自動重新載入已更改的Corefile。編輯ConfigMap配置後,請等待兩分鐘以使更改生效。

loadbalance

開啟DNS負載平衡,對響應報文中的A、AAAA和MX解析記錄進行隨機排序,達成負載平衡的效果。

CoreDNS的擴充配置

針對以下不同情境,您可以擴充CoreDNS的配置:

  • 情境一:開啟Log Service

    如果需將CoreDNS每次網域名稱解析的日誌列印出來,您可以開啟Log外掛程式,在Corefile裡加上log。樣本配置如下:

      Corefile: |
        .:53 {
            errors
            log
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                  prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • 情境二:特定網域名稱使用自訂DNS伺服器

    如果example.com類型尾碼網域名稱需要通過自建DNS伺服器(IP為10.10.0.10)進行解析,您可為網域名稱配置一個單獨的服務塊。樣本配置如下:

    example.com:53 {
      errors
      cache 30
      forward . 10.10.0.10 {
      prefer_udp
      }
    }

    完整配置如下:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
        example.com:53 {
            errors
            cache 30
            forward . 10.10.0.10 {
            prefer_udp
            }
        }
  • 情境三:外部網域名稱完全使用自建DNS伺服器

    如果您需要使用的自建DNS服務的網域名稱沒有統一的網域名稱尾碼,您可以選擇所有叢集外部網域名稱都使用自建DNS伺服器。例如,您自建的DNS伺服器IP為10.10.0.10和10.10.0.20,可以更改forward參數進行配置。樣本配置如下:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . 10.10.0.10 10.10.0.20 {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • 情境四:自訂Hosts

    如果您需要為特定網域名稱指定靜態IP地址,類似於/etc/hosts效果,如為www.example.com指定IP為127.0.0.1,可以使用Hosts外掛程式來配置。樣本配置如下:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            
            hosts {
              127.0.0.1 www.example.com
              fallthrough
            }
          
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
    重要

    請在hosts配置中添加fallthrough參數fallthrough,否則會造成非定製Hosts網域名稱解析失敗。

  • 情境五:叢集外部存取叢集內服務

    如果您希望運行在叢集ECS上的進程能夠訪問到叢集內的服務,雖然可以通過將ECS的/etc/resolv.conf檔案內nameserver配置為叢集kube-dns的ClusterIP地址來達到目的,但不推薦您直接更改ECS的/etc/resolv.conf檔案的方式來達到任何目的。

    內網情境下,您可以將叢集內的服務通過內網CLB進行暴露,然後在雲解析PrivateZone控制台通過添加該服務的A記錄指向到其CLB內網IP。

  • 情境六:統一網域名稱訪問服務或是在叢集內對網域名稱做CNAME解析

    您可以實現在公網、內網和叢集內部通過統一網域名稱foo.example.com訪問您的服務,原理如下:

    • 叢集內的服務foo.default.svc.cluster.local通過公網CLB進行了暴露,且有網域名稱foo.example.com解析到該公網CLB的IP。

    • 叢集內服務foo.default.svc.cluster.local通過內網CLB進行了暴露,且通過雲解析PrivateZone在VPC內網中將foo.example.com解析到該內網CLB的IP。具體步驟,請參見上述CoreDNS配置說明

    • 在叢集內部,您可以通過Rewrite外掛程式將foo.example.comCNAME到foo.default.svc.cluster.local。樣本配置如下:

        Corefile: |
          .:53 {
              errors
              health {
                 lameduck 15s
              }
              ready
              
              rewrite stop {
                name exact foo.example.com foo.default.svc.cluster.local
                answer name foo.default.svc.cluster.local foo.example.com 
              }
      
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
                ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                prefer_udp
              }
              cache 30
              loop
              reload
              loadbalance
          }
  • 情境七:禁止CoreDNS對IPv6類型的AAAA記錄查詢返回

    當業務容器不需要AAAA記錄類型時,可以在CoreDNS中將AAAA記錄類型攔截並返回空值(NODATA),以減少不必要的網路通訊。樣本配置如下:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            #新增以下一行Template外掛程式,其它資料請保持不變。
            template IN AAAA .
        }