扇出 (fanout)

原始碼 首頁

啟用方式
fanout:github.com/networkservicemesh/fanout

fanout - 平行代理 DNS 訊息至上游解析器。

描述

每個進入 CoreDNS fanout 外掛程式的 DNS 查詢,都會被平行複製到每個列出的 IP (即 DNS 伺服器)。任何被查詢的 DNS 伺服器回傳的第一個非負回應,將會作為應用程式 DNS 請求的回應轉發。

語法

  • tls CERT KEY CA 定義 TLS 連線的屬性。可以提供 0 到 3 個參數,其含義如下所述

    • tls - 不使用客戶端驗證,並使用系統 CA 來驗證伺服器憑證。
    • tls CA - 不使用客戶端驗證,並使用檔案 CA 來驗證伺服器憑證。
    • tls CERT KEY - 使用指定的憑證/金鑰對進行客戶端驗證。伺服器憑證會使用系統 CA 進行驗證。
    • tls CERT KEY CA - 使用指定的憑證/金鑰對進行客戶端驗證。伺服器憑證會使用指定的 CA 檔案進行驗證。
  • tls_servername NAME 允許您在 TLS 配置中設定伺服器名稱;例如,9.9.9.9 需要將此設定為 dns.quad9.net。在此情況下,仍然允許使用多個上游伺服器,但它們必須使用相同的 tls_servername。例如,將 9.9.9.9 (QuadDNS) 與 1.1.1.1 (Cloudflare) 混合使用將無法運作。

  • worker-count 是每個請求的平行查詢數量。預設值等於 IP 清單的數量。僅在減少每個請求的平行查詢時使用。

  • policy - 指定 DNS 伺服器選擇機制的策略。預設值為 sequential

    • sequential - 根據 DNS 伺服器的順序依序選擇。
    • weighted-random - 根據 weighted-random-server-countweighted-random-load-factor 參數隨機選擇 DNS 伺服器。
  • weighted-random-server-count 是要請求的 DNS 伺服器數量。預設值等於指定的 IP 數量。僅在 weighted-random 策略下使用。

  • weighted-random-load-factor - 選擇伺服器的機率。這會依照 IP 位址清單的順序指定,並取 1 到 100 之間的值。預設情況下,所有伺服器的機率均為 100。僅在 weighted-random 策略下使用。

  • network 是一種特定的網路協定。可以是 tcpudptcp-tls

  • except 是一個以空格分隔的網域清單,用於排除代理。

  • except-file 是包含以換行符號分隔的網域清單的檔案路徑,用於排除代理。

  • attempt-count 是在將上游伺服器視為關閉之前,需要連線到上游伺服器的嘗試次數。如果為 0,則永遠不會將上游伺服器標記為關閉,且請求將在 timeout 後結束。預設值為 3

  • timeout 是請求的逾時時間。在此時間段之後,將停止嘗試從上游伺服器接收回應。預設值為 30s

  • race 會優先處理第一個結果,無論它是否定結果還是標準 DNS 結果。

指標

如果已啟用監控 (透過 prometheus 外掛程式),則會匯出以下指標

  • coredns_fanout_request_duration_seconds{to} - 每次上游互動的持續時間。
  • coredns_fanout_request_count_total{to} - 每次上游的查詢計數。
  • coredns_fanout_response_rcode_count_total{to, rcode} - 每次上游的 RCODE 計數。

其中 to 是上游伺服器之一 (來自組態的 TO),rcode 是從上游傳回的 RCODE。

範例

example.org. 內的所有請求代理到在不同埠上執行的名稱伺服器。從代理傳回的第一個肯定回應將作為結果提供。

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 127.0.0.1:9008
}

透過 TCP 在三個解析器之間傳送平行請求,其中一個解析器具有 IPv6 位址。從代理傳回的第一個回應將作為結果提供。

. {
    fanout . 10.0.0.10:53 10.0.0.11:1053 [2003::1]:53 {
        network TCP
    }
}

代理所有內容,但排除對 example.org 的請求

. {
    fanout . 10.0.0.10:1234 {
        except example.org
    }
}

代理所有內容,但使用主機 resolv.conf 的名稱伺服器排除 example.org

. {
    fanout . /etc/resolv.conf {
        except example.org
    }
}

使用 DNS-over-TLS 協定將所有請求代理到 9.9.9.9。請注意,如果想要運作的設定,tls-server 是強制性的,因為 9.9.9.9 無法在 TLS 協商中使用。

. {
    fanout . tls://9.9.9.9 {
       tls-server dns.quad9.net
    }
}

透過 UDP 在五個解析器之間傳送平行請求,使用兩個工作程式,並且不嘗試重新連線。從代理傳回的第一個肯定回應將作為結果提供。

. {
    fanout . 10.0.0.10:53 10.0.0.11:53 10.0.0.12:53 10.0.0.13:1053 10.0.0.14:1053 {
        worker-count 2
    }
}

已設定多個上游伺服器,但其中一個伺服器已關閉,查詢 non-existent 網域。如果啟用 race,我們會快速收到 NXDOMAIN 結果,否則會在幾秒鐘後收到 "connection timed out" 結果。

. {
    fanout . 10.0.0.10:53 10.0.0.11:53 10.0.0.12:53 10.0.0.13:1053 10.0.0.14:1053 {
        race
    }
}

在兩個隨機選擇的解析器之間傳送平行請求。請注意,127.0.0.1:9007 會被更頻繁地選擇,因為它具有最高的 weighted-random-load-factor

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 {
      policy weighted-random
      weighted-random-server-count 2
      weighted-random-load-factor 50 70 100
    }
}

依序 (預設模式) 在三個解析器之間傳送平行請求。

example.org {
    fanout . 127.0.0.1:9005 127.0.0.1:9006 127.0.0.1:9007 {
        policy sequential
    }
}

另請參閱

請參閱 fanout