詳解:CoreDNS作為kubernetes後端的DNS伺服器

大雄45發表於2020-06-23
coredns之所以如此名聲大噪,就是因為從kubernetes1.9開始引入,作為kubernetes內部服務發現的預設dns。毫無疑問kubernetes是coredns的後端之一,所以我們講coredns,就從kubernetes作為其後端開始。

coredns的諸多特性網上很多文章都有提及,在這裡不再贅述。簡單對比下其相對於bind和skydns的優勢:

bind可以將解析儲存到mysql或者檔案中,coredns也可以將解析儲存到etcd或者檔案中,也支援將kubernetes作為其後端,直接呼叫kubernetes的api獲取解析資料,然後快取到本地記憶體。coredns支援外掛擴充套件,目前在第三方外掛中還同時支援將powerdns及amazondns作為其後端,後續還會支援越來越來的後端。bind在kubernetes的應用場景下,基本無用武之地。

coredns本身就是skydns的繼任者,支援skydns的所有特性,而且效能更好,更易於擴充套件。其外掛式特性無論是bind還是skydns都無法比擬。

coredns官方網站地址:

coredns程式碼地址: 

coredns官方外掛地址:

coredns第三方外掛地址:

配置kubernetes後端儲存
配置說明

其實官方有kubernetes外掛的相關示例及配置說明,地址如下:

我這裡就以官方的配置示例作說明:

kubernetes [ZONES...] {
    resyncperiod DURATION
    endpoint URL [URL...]
    tls CERT KEY CACERT
    namespaces NAMESPACE...
    labels EXPRESSION
    pods POD-MODE
    endpoint_pod_names
    upstream [ADDRESS...]
    ttl TTL
    fallthrough [ZONES...]
}

下面對一些常用引數作下說明:

resyncperiod: 用於從kubernetes的api同步資料的時間間隔

endpoint: 指定kubernetes的api地址,coredns會自動對其執行健康檢查並將請求代理到健康的節點上。示例如下:

endpoint 

tls: 用於指定連線遠端kubernetes api的相關證書。示例:

tls admin.pem admin-key.pem ca.pem

pods: 指定POD-MODE,有以下三種:

disabled:預設

insecure:返回一個A記錄對應的ip,但並不會檢查這個ip對應的Pod當前是否存在。這個選項主要用於相容kube-dns

verified:推薦的方式,返回A記錄的同時會確保對應ip的pod存在。比insecure會消耗更多的記憶體。

upstream: 定義外部域名解析轉發的地址,可以是一個ip地址,也可以是一個resolv.conf檔案。示例:

upstream 8.8.8.8:53 8.8.4.4:53

ttl: 預設5s,最大3600s

示例

一個完整的配置示例:

# /opt/coredns/cfg/Corefile
.:53 {
    kubernetes wh01 {
        resyncperiod 10s
        endpoint 
        tls admin.pem admin-key.pem ca.pem
        pods verified
        endpoint_pod_names
        upstream /etc/resolv.conf
    }
    health
    log /var/log/coredns.log
    prometheus :9153
    proxy . /etc/resolv.conf
    cache 30
    reload 10s
}

也可以使用如下寫法:

wh01 {
    kubernetes {
        resyncperiod 10s
        endpoint 
        tls admin.pem admin-key.pem ca.pem
        pods verified
        endpoint_pod_names
        upstream /etc/resolv.conf
    }
    health
    log
    errors
    prometheus :9153
    proxy . /etc/resolv.conf
    cache 30
    reload 10s
}

其他配置也簡單作下說明:

health:外掛,用於檢測當前配置是否存活,預設監聽http 8080埠,可配置

log: 外掛,將日誌列印到標準輸出

errors:將錯誤列印到標準輸出

prometheus: 外掛,用於prometheus監控

proxy: wh01之外的域名解析都透過proxy指定的地址實現代理

cache: 外掛,用於在記憶體中快取dns解析,單位為s

reload: 外掛,單位為s,如果配置檔案發生變更,自動reload的間隔

啟動coredns
nohup /opt/coredns/bin/coredns -conf /opt/coredns/cfg/Corefile &
使用systemd啟動coredns
# cat /lib/systemd/system/coredns.service
[Unit]
Description=CoreDNS
Documentation=
[Service]
ExecStart=/opt/coredns/bin/coredns \
  -conf /opt/coredns/cfg/Corefile
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targe
# systemctl start coredns
# systemctl enable coredns

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2700339/,如需轉載,請註明出處,否則將追究法律責任。

相關文章