### Description

The new [readiness port](https://www.elastic.co/guide/en/elasticsearch/reference/8.4/advanced-configuration.html#readiness-tcp-port) makes readiness checks on Kubernetes much easier. However the current implementation only allows connections through localhost. TCP probes on Kubernetes are run by the kubelet which is a process running on the Kubernetes node (and not from within the container or the Pod). The [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#tcp-probes) mentions it, but it is kind of subtle: 

> For a TCP probe, the kubelet makes the probe connection at the node, not in the pod, which means that you can not use a service name in the host parameter since the kubelet is unable to resolve it.


That means a standard Kubernetes readiness probe cannot be used for Elasticsearch:
```
          readinessProbe:
            tcpSocket:
              port: 8080
```

Instead, only an `exec` probe that runs a shell command inside the container can be used that relies in this case on the presence of the `nc` command in the container image:

```
    readinessProbe:
      exec:
        command: ["nc", "-z", "-v", "-w5", "127.0.0.1", "8080"] 
```



server/src/main/java/org/elasticsearch/readiness/ReadinessService.java
* Side Public License, v 1.
 */
package org.elasticsearch.readiness;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.cluster.ClusterChangedEvent;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.ClusterStateListener;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.component.AbstractLifecycleComponent;
import org.elasticsearch.common.network.NetworkAddress;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.transport.BoundTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.env.Environment;
import org.elasticsearch.shutdown.PluginShutdownService;
import org.elasticsearch.transport.BindTransportException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
public class ReadinessService extends AbstractLifecycleComponent implements ClusterStateListener {