### 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"] 
```



x-pack/plugin/shutdown/qa/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/shutdown/NodeShutdownIT.java
);
                if (shardMap.get("id") == null) {
                    unassignedShards++;
                } else if (nodeIdToShutdown.equals(shardMap.get("id")) == false) {
                    assertThat("all other shards should be started", shardMap.get("state"), equalTo("STARTED"));
                    startedShards++;
                }
            }
            assertThat(unassignedShards, equalTo(1));
            assertThat(startedShards, equalTo(3));
        });
    }
    private void putNodeShutdown(String nodeIdToShutdown, String type) throws IOException {
        putNodeShutdown(nodeIdToShutdown, type, null, null);
    }
    private void putNodeShutdown(String nodeIdToShutdown, String type, @Nullable String allocationDelay, @Nullable String targetNodeName)
        throws IOException {
        String reason = this.getTestName();
        
        Request putShutdown = new Request("PUT", "_nodes/" + nodeIdToShutdown + "/shutdown");
        try (XContentBuilder putBody = JsonXContent.contentBuilder()) {
            putBody.startObject();
            {
                putBody.field("type", type);
                putBody.field("reason", reason);
                if (allocationDelay != null) {
                    assertThat("allocation delay parameter is only valid for RESTART-type shutdowns", type, equalToIgnoringCase("restart"));
                    putBody.field("allocation_delay", allocationDelay);
                }
                if (targetNodeName != null) {