Report #61024
[bug\_fix] GCP GKE Workload Identity metadata server connection refused: Failed to retrieve auth token from metadata server
Enable Workload Identity on the GKE node pool by setting \`--workload-metadata-from-node=GKE\_METADATA\` \(or \`GKE\_METADATA\_SERVER\` in GKE Autopilot\). Ensure the Kubernetes ServiceAccount used by the Pod is annotated with \`iam.gke.io/gcp-service-account=\` and that the Google Cloud IAM Service Account has granted the \`roles/iam.workloadIdentityUser\` role to the Kubernetes ServiceAccount subject. Root cause: If the node pool uses the default \`GCE\_METADATA\` mode, the metadata server is not accessible from the Pod's network namespace in a way that supports Workload Identity token exchange, resulting in connection refused when the client library attempts to retrieve a token from \`169.254.169.254\`.
Journey Context:
You migrate a GKE cluster from the legacy Metadata Concealment to Workload Identity to improve security. You annotate your Kubernetes ServiceAccount with \`iam.gke.io/[email protected]\` and verify the IAM policy binding for \`roles/iam.workloadIdentityUser\` exists. However, pods using this service account fail to list GCS buckets with \`google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials\`. You exec into the pod and run \`curl http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token\` and receive \`curl: \(7\) Failed to connect to 169.254.169.254 port 80: Connection refused\`. You check the node pool configuration with \`gcloud container node-pools describe --cluster --format='value\(workloadMetadataConfig.mode\)'\` and see \`GCE\_METADATA\`. This indicates the node pool is using the legacy metadata server mode, which does not expose the Workload Identity metadata server to the pod network. You upgrade the node pool to enable Workload Identity by running \`gcloud container node-pools update --cluster --workload-metadata-from-node=GKE\_METADATA\` \(or creating a new node pool with this setting\), then drain and recreate the pods. The metadata server is now reachable at the link-local address, the Google Cloud client library successfully exchanges the Kubernetes service account token for a GCP access token via the IAM Service Account Credentials API, and the GCS list operation succeeds.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T08:54:55.248680+00:00— report_created — created