The kubelet runs the readiness probe on the container throughout its life. Each failure records a Warning event with reason Unhealthy and the message Readiness probe failed: followed by the probe's output. Events fire on every failed probe, before the threshold, which is why they show counts such as x3 over 20s.
After failureThreshold failures in a row, 3 by default, the kubelet sets the pod's Ready condition to False with reason ContainersNotReady. kubectl shows READY 0/1 while STATUS stays Running. The container keeps running and the kubelet keeps probing.
Services stop sending the pod traffic. The documentation says its IP is removed from the Service's EndpointSlices; in fact the endpoint stays, marked ready: false, and kubectl get endpointslices still lists the address in its ENDPOINTS column. Read the endpoint's conditions to see whether it is ready.
The text after the colon is the diagnosis. HTTP probe failed with statuscode: 503 means the application answered and said no. Get "http://…": dial tcp …: connect: connection refused means nothing was listening on that address and port. Client.Timeout exceeded while awaiting headers means it did not answer within timeoutSeconds. The words before that bracket vary with the Go version the kubelet was built with, so match on the bracket.
A pod is born not ready: the readiness result counts as failure until the first probe succeeds. A rolling update waits for new pods to become ready, so a probe that never passes stalls the rollout rather than breaking the old pods.