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

将 gathersrv 插件与 coredns 一起使用,我们可以对其进行配置以在单个域(本例中为 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
}