Implement trying to **TO** address

Signed-off-by: Miek Gieben <miek@miek.nl>
This commit is contained in:
Miek Gieben
2020-03-05 11:02:54 +01:00
parent 2d67767764
commit 50184d718b
3 changed files with 32 additions and 11 deletions

View File

@@ -179,24 +179,36 @@ This will load balance any names under `lb.example.org` using the data from the
localhost on port 18000. The node ID will be `test-id` and no TLS will be used. Assuming a localhost on port 18000. The node ID will be `test-id` and no TLS will be used. Assuming a
management server returns config for `web` cluster, you can query CoreDNS for it, below we do an management server returns config for `web` cluster, you can query CoreDNS for it, below we do an
address lookup, which returns an address for the endpoint. The second example shows a SRV lookup address lookup, which returns an address for the endpoint. The second example shows a SRV lookup
which returns all endpoints. which returns all endpoints. The third shows what gRPC will ask for when looking for load balancers.
~~~ sh ~~~ sh
$ dig @localhost web.lb.example.org +noall +answer $ dig web.lb.example.org +noall +answer
web.lb.example.org. 5 IN A 127.0.1.1 web.lb.example.org. 5 IN A 127.0.1.1
$ dig @localhost web.lb.example.org SRV +noall +answer +additional
$ dig web.lb.example.org SRV +noall +answer +additional
web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-0.web.lb.example.org. web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-0.web.lb.example.org.
web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-1.web.lb.example.org. web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-1.web.lb.example.org.
web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-2.web.lb.example.org. web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-2.web.lb.example.org.
endpoint-0.web.lb.example.org. 5 IN A 127.0.1.1 endpoint-0.web.lb.example.org. 5 IN A 127.0.1.1
endpoint-1.web.lb.example.org. 5 IN A 127.0.1.2 endpoint-1.web.lb.example.org. 5 IN A 127.0.1.2
endpoint-2.web.lb.example.org. 5 IN A 127.0.2.1 endpoint-2.web.lb.example.org. 5 IN A 127.0.2.1
$ dig _grpclb._tcp.web.lb.example.org SRV +noall +answer +additional
_grpclb._tcp.web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-0.xds.lb.example.org.
_grpclb._tcp.web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-1.xds.lb.example.org.
_grpclb._tcp.web.lb.example.org. 5 IN SRV 100 100 18008 endpoint-2.xds.lb.example.org.
endpoint-0.xds.lb.example.org. 5 IN A 10.0.1.1
endpoint-1.xds.lb.example.org. 5 IN A 10.0.1.2
endpoint-2.xds.lb.example.org. 5 IN A 10.0.2.1
~~~ ~~~
## Bugs ## Bugs
Priority and locality information from ClusterLoadAssignments is not used. Multiple **TO** addresses Priority and locality information from ClusterLoadAssignments is not used. Credentials are not
is not implemented. Credentials are not implemented. implemented.
Load reporting is not supported for the following reason: A DNS query is done by a resolver. Load reporting is not supported for the following reason: A DNS query is done by a resolver.
Behind this resolver (which can also cache) there may be many clients that will use this reply. The Behind this resolver (which can also cache) there may be many clients that will use this reply. The
@@ -204,6 +216,8 @@ responding server (CoreDNS) has no idea how many clients use this resolver. So r
+1 on the CoreDNS side can results in anything from 1 to 1000+ of queries on the endpoint, making +1 on the CoreDNS side can results in anything from 1 to 1000+ of queries on the endpoint, making
the load reporting from *traffic* highly inaccurate. the load reporting from *traffic* highly inaccurate.
Bootstrapping is not fully implemented, *traffic* will connect to the first working **TO** addresss,
but then stops short of re-connecting to he endpoints is received for the management **CLUSTER**.
## Also See ## Also See

View File

@@ -45,16 +45,23 @@ func setup(c *caddy.Controller) error {
opts = []grpc.DialOption{grpc.WithTransportCredentials(credentials.NewTLS(t.tlsConfig))} opts = []grpc.DialOption{grpc.WithTransportCredentials(credentials.NewTLS(t.tlsConfig))}
} }
i := 0
redo: redo:
i = i % len(t.hosts)
t.c, err = xds.New(t.hosts[0], t.node, opts...) if t.c, err = xds.New(t.hosts[i], t.node, opts...); err != nil {
err := t.c.Run()
if err != nil {
log.Warning(err) log.Warning(err)
time.Sleep(2 * time.Second) // back off foo time.Sleep(2 * time.Second) // back off foo
i++
goto redo goto redo
} }
// err == nil
if err := t.c.Run(); err != nil {
log.Warning(err)
time.Sleep(2 * time.Second) // back off foo
i++
goto redo
}
// err == nil, we are connected
break break
} }
}() }()

View File

@@ -96,7 +96,7 @@ func (c *Client) Run() error {
if first { if first {
// send first request, to create stream, then wait for ADS to send us updates. // send first request, to create stream, then wait for ADS to send us updates.
if err := c.clusterDiscovery(stream, c.Version(cdsURL), c.Nonce(cdsURL), []string{}); err != nil { if err := c.clusterDiscovery(stream, c.Version(cdsURL), c.Nonce(cdsURL), []string{}); err != nil {
log.Debug(err) return err
} }
log.Infof("gRPC stream established to %q", c.to) // might fail?? log.Infof("gRPC stream established to %q", c.to) // might fail??
c.setSynced() c.setSynced()