kubernetes

原始碼

kubernetes 允許從 Kubernetes 叢集中讀取區域資料。

說明

此外掛程式實作了Kubernetes 基於 DNS 的服務探索規範

執行 kubernetes 外掛程式的 CoreDNS 可用來取代 Kubernetes 叢集中的 kube-dns。有關部署儲存庫中關於如何在 Kubernetes 中部署 CoreDNS的詳細資訊。

stubDomains 和 upstreamNameservers 是透過 forward 外掛程式實作的。請參閱以下範例。

此外掛程式在每個伺服器區塊中只能使用一次。

語法

kubernetes [ZONES...]

如果僅指定外掛程式,則 kubernetes 外掛程式會預設為伺服器區塊中指定的區域。它將處理該區域中的所有查詢並連線到叢集內的 Kubernetes。它不會為服務提供 PTR 記錄,也不會為 Pod 提供 A 記錄。如果使用 ZONES,則會指定外掛程式應授權的所有區域。

kubernetes [ZONES...] {
    endpoint URL
    tls CERT KEY CACERT
    kubeconfig KUBECONFIG [CONTEXT]
    namespaces NAMESPACE...
    labels EXPRESSION
    pods POD-MODE
    endpoint_pod_names
    ttl TTL
    noendpoints
    fallthrough [ZONES...]
    ignore empty_service
}
  • endpoint 指定遠端 k8s API 端點的 URL。如果省略,它將使用叢集服務帳戶連線到叢集內的 k8s。

  • tls CERT KEY CACERT 是遠端 k8s 連線的 TLS 憑證、金鑰和 CA 憑證檔案名稱。如果在叢集內連線(即未指定端點),則會忽略此選項。

  • kubeconfig KUBECONFIG [CONTEXT] 使用 kubeconfig 檔案驗證與遠端 k8s 叢集的連線。[CONTEXT] 是可選的,如果未設定,則會使用 kubeconfig 中指定的目前內容。它支援 TLS、使用者名稱和密碼或基於 Token 的驗證。如果在叢集內連線(即未指定端點),則會忽略此選項。

  • namespaces NAMESPACE [NAMESPACE…] 僅公開列出的 k8s 命名空間。如果省略此選項,則會公開所有命名空間

  • namespace_labels EXPRESSION 僅公開符合此標籤選擇器的 Kubernetes 命名空間的記錄。標籤選擇器語法在Kubernetes 使用者指南 - 標籤中說明。一個僅公開標籤為「istio-injection=enabled」的命名空間的範例會使用:labels istio-injection=enabled

  • labels EXPRESSION 僅公開符合此標籤選擇器的 Kubernetes 物件的記錄。標籤選擇器語法在Kubernetes 使用者指南 - 標籤中說明。一個僅公開標籤為「application=nginx」在「staging」或「qa」環境中的物件的範例會使用:labels environment in (staging, qa),application=nginx

  • pods POD-MODE 設定處理基於 IP 的 Pod A 記錄的模式,例如 1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4。提供此選項是為了方便在直接連線到 Pod 時使用 SSL 憑證。POD-MODE 的有效值

    • disabled: 預設值。不處理 Pod 請求,一律傳回 NXDOMAIN
    • insecure: 一律傳回帶有請求 IP 的 A 記錄(而不檢查 k8s)。如果在搭配萬用字元 SSL 憑證的情況下惡意使用此選項,則此選項容易遭到濫用。提供此選項是為了與 kube-dns 向後相容。
    • verified: 如果在相同命名空間中存在具有相符 IP 的 Pod,則傳回 A 記錄。此選項需要比 insecure 模式多出大量的記憶體,因為它會維護對所有 Pod 的監看。
  • endpoint_pod_names 使用端點所針對的 Pod 的 Pod 名稱作為 A 記錄中的端點名稱,例如 endpoint-name.my-service.namespace.svc.cluster.local. in A 1.2.3.4。根據預設,端點名稱選擇如下:使用端點的主機名稱,如果未設定主機名稱,則使用端點 IP 位址的虛線格式(例如,1-2-3-4.my-service.namespace.svc.cluster.local.)。如果包含此指示詞,則端點的名稱選擇會如下變更:使用端點的主機名稱,如果未設定主機名稱,則使用端點所針對的 Pod 的 Pod 名稱。如果沒有端點所針對的 Pod,或 Pod 名稱的長度超過 63,則使用虛線 IP 位址格式。

  • ttl 允許您為回應設定自訂 TTL。預設值為 5 秒。允許的最小 TTL 為 0 秒,上限為 3600 秒。將 TTL 設定為 0 會防止快取記錄。

  • noendpoints 將透過停用對端點的監看來關閉端點記錄的服務。所有端點查詢和無頭服務查詢都會導致 NXDOMAIN。

  • fallthrough [ZONES…] 如果針對外掛程式具有授權的區域中的記錄的查詢導致 NXDOMAIN,則通常會是回應。但是,如果您指定此選項,則會將查詢傳遞到外掛程式鏈中,其中可能包含另一個外掛程式來處理查詢。如果省略 [ZONES…],則外掛程式具有授權的所有區域都會發生 fallthrough。如果列出特定區域(例如 in-addr.arpaip6.arpa),則只有針對這些區域的查詢才會受到 fallthrough 的影響。

  • ignore empty_service 針對沒有任何就緒端點位址(例如,就緒 Pod)的服務傳回 NXDOMAIN。這允許查詢的 Pod 繼續在搜尋路徑中搜尋服務。例如,搜尋路徑可以包含另一個 Kubernetes 叢集。

透過使用 transfer 外掛程式來完成啟用區域傳輸。

啟動

當 CoreDNS 啟動並啟用 kubernetes 外掛程式時,它將延遲最多 5 秒的 DNS 服務,直到它可以連線到 Kubernetes API 並同步所有物件監看。如果在 5 秒內無法完成此操作,則 CoreDNS 將開始提供 DNS 服務,而 kubernetes 外掛程式會繼續嘗試連線並同步所有物件監看。CoreDNS 將對尚未同步的 Kubernetes 記錄的任何請求回覆 SERVFAIL。

監控 Kubernetes 端點

kubernetes 外掛程式透過 discovery.EndpointSlices API 監看端點。

就緒

此外掛程式會向 ready 外掛程式報告就緒狀態。這會在它同步到 Kubernetes API 之後發生。

範例

處理 cluster.local 區域中的所有查詢。連線到叢集內的 Kubernetes。另外處理 10.0.0.0/17 的所有 in-addr.arpa PTR 請求。在回答 Pod 請求時驗證 Pod 的存在。

10.0.0.0/17 cluster.local {
    kubernetes {
        pods verified
    }
}

或者您可以選擇性地公開一些命名空間

kubernetes cluster.local {
    namespaces test staging
}

在叢集外部執行 CoreDNS 的情況下連線到 Kubernetes

kubernetes cluster.local {
    endpoint https://k8s-endpoint:8443
    tls cert key cacert
}

stubDomains 和 upstreamNameservers

在這裡,我們使用 forward 外掛程式來實作 stubDomain,該 stubDomain 會將 example.local 轉送到名稱伺服器 10.100.0.10:53。此外,還會設定一個 upstreamNameserver 8.8.8.8:53,該伺服器將用於解析不屬於 cluster.localexample.local 的名稱。

cluster.local:53 {
    kubernetes cluster.local
}
example.local {
    forward . 10.100.0.10:53
}

. {
    forward . 8.8.8.8:53
}

以上組態表示以下 Kube-DNS stubDomains 和 upstreamNameservers 組態。

stubDomains: |
   {“example.local”: [“10.100.0.10:53”]}
upstreamNameservers: |
   [“8.8.8.8:53”]

AutoPath

kubernetes 外掛程式可以與 autopath 外掛程式搭配使用。使用此功能可在 Kubernetes 叢集中啟用伺服器端網域搜尋路徑完成。注意:必須將 pods 設定為 verified,此功能才能正常運作。此外,CoreDNS 收到的 DNS 資料包中的遠端 IP 位址必須是傳送請求的 Pod 的 IP 位址。

cluster.local {
    autopath @kubernetes
    kubernetes {
        pods verified
    }
}

中繼資料

如果也啟用 metadata 外掛程式,kubernetes 外掛程式將發佈以下中繼資料

  • kubernetes/endpoint:查詢中的端點名稱
  • kubernetes/kind:查詢中的資源種類(pod 或 svc)
  • kubernetes/namespace:查詢中的命名空間
  • kubernetes/port-name:SRV 查詢中的埠名稱
  • kubernetes/protocol:SRV 查詢中的通訊協定
  • kubernetes/service:查詢中的服務名稱
  • kubernetes/client-namespace:用戶端 Pod 的命名空間(請參閱以下需求)
  • kubernetes/client-pod-name:用戶端 Pod 的名稱(請參閱以下需求)

kubernetes/client-namespacekubernetes/client-pod-name 中繼資料的運作方式是將 DNS 請求資料包中的用戶端 IP 位址與已知的 Pod IP 位址調和。因此,需要以下條件

  • 必須啟用 pods verified 模式
  • CoreDNS 收到的 DNS 資料包中的遠端 IP 位址必須是傳送請求的 Pod 的 IP 位址。

指標

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

  • coredns_kubernetes_dns_programming_duration_seconds{service_kind} - 匯出DNS 程式設計延遲 SLI。指標具有 service_kind 標籤,該標籤會識別kubernetes 服務的種類。它可能採用三個值之一
    • cluster_ip
    • headless_with_selector
    • headless_without_selector

以下是客戶端層級指標,用於監控 apiserver 請求延遲和狀態碼。verb 識別 apiserver 請求類型,而 host 表示 apiserver 端點。

  • coredns_kubernetes_rest_client_request_duration_seconds{verb, host} - 擷取依 verbhost 分組的客戶端感知 apiserver 請求延遲。
  • coredns_kubernetes_rest_client_rate_limiter_duration_seconds{verb, host} - 擷取依 verbhost 分組的客戶端速率限制器造成的 apiserver 請求延遲。
  • coredns_kubernetes_rest_client_requests_total{method, code, host} - 擷取依 methodstatus_codehost 分組的 apiserver 請求總數。

錯誤

持續時間指標目前僅支援「headless_with_selector」服務。

另請參閱

請參閱 autopath 外掛程式以啟用搜尋路徑最佳化。並使用 transfer 外掛程式以啟用外寄區域傳輸。