描述
這個外掛程式對於邏輯上分散在多個 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
}