Skip to main content
This page documents common issues, fixes, and diagnostic commands for LangSmith deployments provisioned with the GCP Terraform modules.
Before upgrading, review the LangSmith self-hosted changelog for breaking changes and required variable updates. Run gcloud container clusters get-credentials <cluster-name> --region <region> --project <project-id> before running any kubectl commands.
For a copy-paste reference of the 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

Symptom
Cause: Required GCP APIs are not enabled. Terraform enables them via google_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

Symptom
Cause: The GKE control plane takes 10 to 15 minutes to become fully operational. Terraform waits for RUNNING 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 show connection 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
If peering is missing, ensure enable_private_service_connection = true and re-apply:

Memorystore Redis connection timeout

Symptom: Pods cannot connect to Redis. Logs show dial 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
The DNS A record must resolve to the Gateway IP before the certificate can be issued. cert-manager’s HTTP01 solver needs port 80 to be reachable from the internet.

GCS bucket access denied from LangSmith pods

Symptom: Backend logs show AccessDeniedException: 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
The GCP service account must have 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

Symptom
Cause: The Envoy Gateway admission webhook is not ready or its caBundle 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 the Gateway 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 taint or manually delete the Gateway resource.
  • Use make destroy + make apply only for full teardown and rebuild.
  • Before any operation that might recreate the Gateway, note the current IP.
Recovery: Update your DNS A record to the new IP:

terraform destroy fails: deletion protection enabled

Symptom
Cause: gke_deletion_protection = true (default) or postgres_deletion_protection = true prevents Terraform from destroying the resources. Fix

Workload Identity not working (GCS permission denied)

Symptom
Cause: The Kubernetes ServiceAccount used by LangSmith pods is missing the Workload Identity annotation, or the GCP SA is missing the GCS IAM binding. Diagnosis
Fix

langsmith-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
Fix

Helm release stuck in pending-upgrade

Symptom
Cause: A previous 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

Symptom
Cause: Either secretmanager.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