Three workloads stuck in startup-probe crash-loops, each from a different private DNS gap, all proven from inside the pod
Three newly deployed services had never become Ready, and each had racked up around a thousand restarts. Their logs all said the same thing: health check failed. Testing from inside each pod, one network layer at a time, found three separate DNS problems, and a redeploy wouldn't have fixed any of them.
getent hosts <fqdn> # DNS - what does the pod resolve?
nc -zv <ip> 443 # TCP - is the port reachable?
openssl s_client -connect <fqdn>:443 </dev/null # TLS - is it the right endpoint?
wget -qO- https://<fqdn>/health # HTTP - does the app answer?
| Service | What failed | Root cause |
|---|---|---|
| Auth-dependent worker | The identity provider's hostname was NXDOMAIN inside the cluster only | The company domain lived on on-prem DNS, and the cluster VNet's resolver didn't serve that zone |
| Notifications worker | Blob hostname NXDOMAIN, yet TCP 443 to the private IP was open | The record existed, but its zone was linked to a different VNet. A missing link, not a firewall |
| Event-stream consumer | Name resolved and TCP connected, but the TLS handshake failed | Several duplicate privatelink.servicebus zones held conflicting records, and the cluster got a stale IP |
// Find duplicate privatelink zones across subscriptions
resources
| where type =~ 'microsoft.network/privatednszones'
| where name startswith 'privatelink.'
| summarize copies = count(), groups = make_set(resourceGroup) by name
| where copies > 1
One symptom hid three causes. Methodical, layer-by-layer testing separated them quickly and turned three tickets into one platform fix.
About this case study: this write-up is drawn from my hands-on platform engineering experience. Organisation names, system names, figures and timelines have been changed or generalised, and all code, configuration and queries are illustrative examples written for this page.