kubectl, helm, and gcloud calls used throughout this page, skip to Diagnostic commands.
Automated diagnostics
Before running individual commands, try the bundled scripts:Known issues
terraform apply fails: GCP APIs not enabled
Symptomgoogle_project_service, but cloudresourcemanager.googleapis.com must already be enabled for Terraform to enable the others.
Fix
GKE cluster API server not accessible after apply
SymptomRUNNING then adds a 90-second buffer. Cold-start API activation on slow projects can exceed the window.
Fix: Wait for RUNNING, then re-run:
GKE nodes not joining (NotReady)
Symptom:kubectl get nodes shows no nodes or nodes stuck in NotReady.
Cause: Node pool service account lacks roles/container.nodeServiceAccount, or VPC firewall rules block node-to-control-plane communication.
Fix
Cloud SQL connection refused from GKE pods
Symptom: Backend logs showconnection refused or no route to host for the Cloud SQL private IP.
Cause: The private service connection (VPC peering) is not established, or the allocated IP range is too small. Often happens when servicenetworking.googleapis.com was not enabled before the networking module ran.
Fix
enable_private_service_connection = true and re-apply:
Memorystore Redis connection timeout
Symptom: Pods cannot connect to Redis. Logs showdial tcp: connection timed out or redis: connection refused.
Cause: The Memorystore authorized_network does not match the GKE VPC, or the Redis private IP is on a range not routable from the GKE subnet.
Fix
cert-manager fails to issue Let’s Encrypt certificate
Symptom:kubectl get certificate -n langsmith shows READY=False. HTTP01 challenge failing.
Cause: The DNS A record does not point to the Envoy Gateway IP, or port 80 is blocked on the load balancer.
Fix
GCS bucket access denied from LangSmith pods
Symptom: Backend logs showAccessDeniedException: 403 Insufficient Permission or 403 Forbidden when writing to GCS.
Cause: In native GCS mode (the shipped default), the GCP service account bound through Workload Identity lacks roles/storage.objectAdmin on the bucket, or the pod’s Kubernetes ServiceAccount is missing the iam.gke.io/gcp-service-account annotation. In the optional S3-compatible mode, the HMAC credentials passed to Helm are incorrect or their service account lacks roles/storage.objectAdmin.
Fix
roles/storage.objectAdmin on the bucket. If the annotation itself is missing, apply the fix in the Workload Identity section below. For S3-compatible mode, create an HMAC key under Cloud Storage → Settings → Interoperability; its service account also needs roles/storage.objectAdmin on the bucket.
Envoy Gateway webhook blocking GKE operations
SymptomcaBundle is stale.
Fix
Envoy Gateway external IP changed after re-apply
Symptom: DNS no longer resolves to the correct IP after Terraform re-apply, or existing firewall allowlists stop working. Cause: The Envoy Gateway external IP is tied to theGateway Kubernetes resource managed by Terraform. If the resource is deleted and recreated (terraform taint, a module change that forces replacement, or terraform destroy + re-apply), GCP issues a new IP. There is no way to reserve the original IP without pre-allocating a static regional address.
Prevention
- Do not
terraform taintor manually delete theGatewayresource. - Use
make destroy+make applyonly for full teardown and rebuild. - Before any operation that might recreate the Gateway, note the current IP.
terraform destroy fails: deletion protection enabled
Symptomgke_deletion_protection = true (default) or postgres_deletion_protection = true prevents Terraform from destroying the resources.
Fix
Workload Identity not working (GCS permission denied)
Symptomlangsmith-ksa missing Workload Identity annotation
Symptom: Operator-spawned agent pods fail to start or get stuck in Pending. Logs show permission errors or the agent bootstrap job hangs.
Cause: langsmith-ksa is created by the LangSmith operator (not Helm) and does not survive namespace teardowns or fresh cluster rebuilds. deploy.sh re-annotates it post-deploy; if a previous deploy was interrupted, the annotation may be missing.
Diagnosis
Helm release stuck in pending-upgrade
Symptom
helm upgrade was interrupted (Ctrl+C during --wait). Helm left the release locked.
Fix: deploy.sh detects and auto-recovers this state. If running manually:
Secret Manager access denied
Symptomsecretmanager.googleapis.com is not enabled, or the operator account lacks roles/secretmanager.admin.
Fix
langsmith-postgres-credentials or langsmith-redis-credentials Secret missing
Symptom: Pods crash with database connection errors immediately after deploy, or kubectl get secrets -n langsmith does not list langsmith-postgres-credentials / langsmith-redis-credentials.
Cause: The k8s-bootstrap module creates these Secrets. They are absent if terraform apply was not run, failed partway through, or the namespace was deleted out-of-band.
Fix
Diagnostic commands
Cluster access
Pods
TLS and certificates
Gateway and load balancer
Helm
LangSmith Deployment
Workload Identity and IAM
Secrets and bootstrap
Quick health check
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

