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
}

以下があるとしてみましょう。

  • 2つのk8sクラスター - クラスターa、クラスターb
  • 上記のクラスターの2つのゾーンクラスター-a.local、クラスター-b.local
  • クラスター外でk8s dnsを照会する機能
  • ヘッドレスサービス - デモサービスが上記クラスターに同じ名前空間(default)に展開されている

以下について問い合わせた場合

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

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アドレスはクラスターaとクラスターbの外からルーティング可能である必要があることに注意してください。

以下の構成は、使用例の例を示しています。クラスターaとクラスター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
}