gathersrv

原始碼 首頁

啟用方式
gathersrv:github.com/ziollek/gathersrv

gathersrv 外掛程式允許從多個網域(例如 k8s 叢集)收集具有 SRV 記錄的 DNS 回應,並將它們隱藏在單一的通用/分散式網域之後。

描述

這個外掛程式對於邏輯上分散在多個 k8s 叢集上並使用無頭服務來公開自己的服務來說很有幫助。這個外掛程式的目的是提供一種方法,透過單一服務網域來探索所有服務實例。查詢分散式服務網域的結果包含從多個叢集收集的偽裝結果。與 multicluster 外掛程式 不同,它不要求 k8s 叢集必須共享相同的叢集區域。這個外掛程式作為一個代理,生成對已設定叢集的請求,然後在將它們返回給客戶端之前重寫它們。因此,它更具彈性(它可以被使用/在 k8s 外部執行)。

語法

gathersrv DISTRIBUTED_ZONE {
    CLUSTER_DOMAIN_ONE HOSTNAME_PREFIX_ONE
    ...
    CLUSTER_DOMAIN_N HOSTNAME_PREFIX_N
}

範例

假設有

  • 兩個 k8s 叢集 - cluster-a、cluster-b
  • 上述叢集的兩個區域 cluster-a.local、cluster-b.local
  • 可以在叢集外部查詢 k8s DNS
  • 在上述叢集上的相同命名空間(預設)中部署的無頭服務 - demo-service

如果我們詢問

dig -t SRV _demo._tcp.demo-service.default.svc.cluster-a.local

我們將看到如下結果

;; ANSWER SECTION:
_demo._tcp.demo-service.default.svc.cluster-a.local. 30 IN SRV 0 50 8080 demo-service-0.default.svc.cluster-a.local.
_demo._tcp.demo-service.default.svc.cluster-a.local. 30 IN SRV 0 50 8080 demo-service-1.default.svc.cluster-a.local.

;; ADDITIONAL SECTION:
demo-service-0.default.svc.cluster-a.local. 30 IN A 10.8.1.2
demo-service-1.default.svc.cluster-a.local. 30 IN A 10.8.1.2

分別針對第二個叢集

dig -t SRV _demo._tcp.demo-service.default.svc.cluster-a.local

...

;; ANSWER SECTION:
_demo._tcp.demo-service.default.svc.cluster-b.local. 30 IN SRV 0 50 8080 demo-service-0.default.svc.cluster-b.local.
_demo._tcp.demo-service.default.svc.cluster-b.local. 30 IN SRV 0 50 8080 demo-service-1.default.svc.cluster-b.local.

;; ADDITIONAL SECTION:
demo-service-0.default.svc.cluster-b.local. 30 IN A 10.9.1.2
demo-service-1.default.svc.cluster-b.local. 30 IN A 10.9.1.2

使用 coredns 的 gathersrv 外掛程式,我們可以將其設定為在單一網域(在此案例中為 distributed.local)背後提供合併的資訊

dig -t SRV _demo._tcp.demo-service.default.svc.distributed.local

...

;; ANSWER SECTION:
_demo._tcp.demo-service.default.svc.distributed.local. 30 IN SRV 0 50 8080 a-demo-service-0.default.svc.distributed.local.
_demo._tcp.demo-service.default.svc.distributed.local. 30 IN SRV 0 50 8080 a-demo-service-1.default.svc.distributed.local.
_demo._tcp.demo-service.default.svc.distributed.local. 30 IN SRV 0 50 8080 b-demo-service-0.default.svc.distributed.local.
_demo._tcp.demo-service.default.svc.distributed.local. 30 IN SRV 0 50 8080 b-demo-service-1.default.svc.distributed.local.

;; ADDITIONAL SECTION:
a-demo-service-0.default.svc.distributed.local. 30 IN A 10.8.1.2
a-demo-service-1.default.svc.distributed.local. 30 IN A 10.8.1.2
b-demo-service-0.default.svc.distributed.local. 30 IN A 10.9.1.2
b-demo-service-1.default.svc.distributed.local. 30 IN A 10.9.1.2

如上所示,結果回應不僅包含正確的 IP 位址,還包含已轉換的主機名稱。此轉換會新增一些字首,指示原始叢集,並將叢集網域(.cluster-a.local.、.cluster-b.local.)取代為分散式網域。因此,服務主機名稱與服務共享其父網域 - a-demo-service-0.default.svc.distributed.local.。由於這個原因,結果可以被受限的服務驅動程式使用,例如 mongodb+srv

值得一提的是,如果您想要連線到 POD 的 IP 位址,則它們需要在 cluster-a 和 cluster-b 外部可路由。

以下設定反映了用例中的範例。cluster-a 和 cluster-b 的 DNS 服務位址分別為 10.8.0.1 和 10.9.0.1。

distributed.local. {
  gathersrv distribiuted.local. {
	cluster-a.local. a-
	cluster-b.local. b-
  }
  forward . 127.0.0.1:5300
}

cluster-a.local.:5300 {
  forward . 10.8.0.1:53
}

cluster-b.local.:5300 {
  forward . 10.9.0.1:53
}