consul/connect: remove sidecar proxy before removing parent service

This PR will have Nomad de-register a sidecar proxy service before
attempting to de-register the parent service. Otherwise, Consul will
emit a warning and an error.

Fixes #10845
This commit is contained in:
Seth Hoenig 2021-07-08 09:18:59 -05:00
parent 2607853a26
commit 7c3db812fd
2 changed files with 19 additions and 1 deletions

3
.changelog/10873.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
consul/connect: Fixed a bug where service deregistered before connect sidecar
```

View File

@ -821,8 +821,23 @@ func (c *ServiceClient) sync(reason syncReason) error {
continue continue
} }
// Unknown Nomad managed service; kill // Get the Consul namespace this service is in.
ns := servicesInConsul[id].Namespace ns := servicesInConsul[id].Namespace
// If this service has a sidecar, we need to remove the sidecar first,
// otherwise Consul will produce a warning and an error when removing
// the parent service.
//
// The sidecar is not tracked on the Nomad side; it was registered
// implicitly through the parent service.
if sidecar := getNomadSidecar(id, servicesInConsul); sidecar != nil {
if err := c.agentAPI.ServiceDeregisterOpts(sidecar.ID, &api.QueryOptions{Namespace: ns}); err != nil {
metrics.IncrCounter([]string{"client", "consul", "sync_failure"}, 1)
return err
}
}
// Remove the unwanted service.
if err := c.agentAPI.ServiceDeregisterOpts(id, &api.QueryOptions{Namespace: ns}); err != nil { if err := c.agentAPI.ServiceDeregisterOpts(id, &api.QueryOptions{Namespace: ns}); err != nil {
if isOldNomadService(id) { if isOldNomadService(id) {
// Don't hard-fail on old entries. See #3620 // Don't hard-fail on old entries. See #3620