diff --git a/.changelog/18584.txt b/.changelog/18584.txt new file mode 100644 index 000000000..2a9f693a5 --- /dev/null +++ b/.changelog/18584.txt @@ -0,0 +1,3 @@ +```release-note:bug +services: use interpolated address when performing nomad service health checks +``` diff --git a/client/allocrunner/alloc_runner_hooks.go b/client/allocrunner/alloc_runner_hooks.go index d72e5aba2..39d8e5a69 100644 --- a/client/allocrunner/alloc_runner_hooks.go +++ b/client/allocrunner/alloc_runner_hooks.go @@ -110,7 +110,7 @@ func (ar *allocRunner) initRunnerHooks(config *clientconfig.Config) error { } // Create a taskenv.TaskEnv which is used for read only purposes by the - // newNetworkHook. + // newNetworkHook and newChecksHook. builtTaskEnv := newEnvBuilder().Build() // Create the alloc directory hook. This is run first to ensure the @@ -139,7 +139,7 @@ func (ar *allocRunner) initRunnerHooks(config *clientconfig.Config) error { newConsulGRPCSocketHook(hookLogger, alloc, ar.allocDir, config.ConsulConfig, config.Node.Attributes), newConsulHTTPSocketHook(hookLogger, alloc, ar.allocDir, config.ConsulConfig), newCSIHook(alloc, hookLogger, ar.csiManager, ar.rpcClient, ar, ar.hookResources, ar.clientConfig.Node.SecretID), - newChecksHook(hookLogger, alloc, ar.checkStore, ar), + newChecksHook(hookLogger, alloc, ar.checkStore, ar, builtTaskEnv), } if config.ExtraAllocHooks != nil { ar.runnerHooks = append(ar.runnerHooks, config.ExtraAllocHooks...) diff --git a/client/allocrunner/checks_hook.go b/client/allocrunner/checks_hook.go index 23d6dff79..39da47832 100644 --- a/client/allocrunner/checks_hook.go +++ b/client/allocrunner/checks_hook.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/nomad/client/allocrunner/interfaces" "github.com/hashicorp/nomad/client/serviceregistration/checks" "github.com/hashicorp/nomad/client/serviceregistration/checks/checkstore" + "github.com/hashicorp/nomad/client/taskenv" "github.com/hashicorp/nomad/helper" "github.com/hashicorp/nomad/nomad/structs" ) @@ -82,6 +83,7 @@ type checksHook struct { shim checkstore.Shim checker checks.Checker allocID string + taskEnv *taskenv.TaskEnv // fields that get re-initialized on allocation update lock sync.RWMutex @@ -96,6 +98,7 @@ func newChecksHook( alloc *structs.Allocation, shim checkstore.Shim, network structs.NetworkStatus, + taskEnv *taskenv.TaskEnv, ) *checksHook { h := &checksHook{ logger: logger.Named(checksHookName), @@ -104,6 +107,7 @@ func newChecksHook( shim: shim, network: network, checker: checks.New(logger), + taskEnv: taskEnv, } h.initialize(alloc) return h @@ -208,8 +212,10 @@ func (h *checksHook) Prerun() error { return nil } + interpolatedServices := taskenv.InterpolateServices(h.taskEnv, group.NomadServices()) + // create and start observers of nomad service checks in alloc - h.observe(h.alloc, group.NomadServices()) + h.observe(h.alloc, interpolatedServices) return nil } diff --git a/client/allocrunner/checks_hook_test.go b/client/allocrunner/checks_hook_test.go index cae98d6e0..581311933 100644 --- a/client/allocrunner/checks_hook_test.go +++ b/client/allocrunner/checks_hook_test.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/nomad/client/allocrunner/interfaces" "github.com/hashicorp/nomad/client/serviceregistration/checks/checkstore" "github.com/hashicorp/nomad/client/state" + "github.com/hashicorp/nomad/client/taskenv" "github.com/hashicorp/nomad/helper/testlog" "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" @@ -169,7 +170,9 @@ func TestCheckHook_Checks_ResultsSet(t *testing.T) { alloc := allocWithNomadChecks(addr, port, tc.onGroup) - h := newChecksHook(logger, alloc, checkStore, network) + envBuilder := taskenv.NewBuilder(mock.Node(), alloc, nil, alloc.Job.Region) + + h := newChecksHook(logger, alloc, checkStore, network, envBuilder.Build()) // initialize is called; observers are created but not started yet must.MapEmpty(t, h.observers) @@ -234,7 +237,9 @@ func TestCheckHook_Checks_UpdateSet(t *testing.T) { alloc := allocWithNomadChecks(addr, port, true) - h := newChecksHook(logger, alloc, shim, network) + envBuilder := taskenv.NewBuilder(mock.Node(), alloc, nil, alloc.Job.Region) + + h := newChecksHook(logger, alloc, shim, network, envBuilder.Build()) // calling pre-run starts the observers err := h.Prerun()