kubectl、helm 和 az 命令的复制粘贴参考,请跳转至 诊断命令。
基础设施阶段
K8sVersionNotSupported: version is LTS-only
症状
eastus 仅受 LTS 支持。标准层集群必须使用 1.33+。
修复: 将 kubernetes_version 更新为具有 KubernetesOfficial 支持的版本:
terraform.tfvars 中任何 kubernetes_version 固定版本,然后运行 make apply。现有运行 1.32 的集群将继续运行;此更改仅阻止新集群的创建。
vCPU 配额超限
症状(自动扩缩器退避,Pod 处于 Pending 状态):eastus 区域中 standardDSv3Family 的默认配额通常为 10 个核心。一个 Standard_D8s_v3 节点使用 8 个核心;仅剩 2 个。
为什么 max_pods = 30 会触发此问题: AKS 默认为每个节点 30 个 Pod。仅基础 LangSmith 安装就部署约 37 个 Pod。自动扩缩器尝试添加第二个节点,触及配额限制,进入退避状态。修复方法:在 terraform.tfvars 中设置 default_node_pool_max_pods = 60,使所有 Pod 都能在一个节点上运行。
多数据平面(3 个数据平面)的推荐配额:32 个核心。
申请配额增加:
Standard_DS4_v2(基础)+ Standard_DS5_v2(大内存)。vCPU 相同,内存略少。已验证适用于完整 LangSmith 安装及所有附加组件。
在现有节点池上,
max_pods 不可变。请在第一次 terraform apply 前设置它。不支持的 Istio 附加组件修订版
症状:terraform apply 拒绝 Istio 修订版(Revision asm-1-XX is not supported)。Azure 会定期淘汰旧的 ASM 修订版。
修复: 检查当前可用的修订版并更新 istio_addon_revision:
terraform.tfvars 中设置该值并重新应用。
启用后无法禁用 Key Vault 清除保护
症状terraform destroy 删除时,Azure 会将其软删除保留 90 天。下次使用相同名称执行 terraform apply 会静默恢复旧的 Key Vault,包括其原始的 purge_protection_enabled = true。清除保护是单向的(启用后无法禁用)。
修复(接受清除保护,适用于测试环境):
purge_protection = false):
Key Vault 密钥已存在但不在 Terraform 状态中
症状setup-env.sh 会直接将 Fernet 密钥写入 Key Vault。当前的 setup-env.sh 对 Key Vault 是只读的;Terraform 是唯一的写入者。
修复: 导入冲突的密钥:
应用阶段
dns_label 子域名无法解析:TLS 证书一直 pending
症状: nslookup langsmith-demo.eastus.cloudapp.azure.com 返回 NXDOMAIN。cert-manager ACME 验证无法完成;TLS 证书一直显示 READY: False。
原因: service.beta.kubernetes.io/azure-dns-label-name 注解必须设置在 NGINX LoadBalancer 服务上,Azure 才会为公共 IP 分配 DNS 标签。make deploy 通过 deploy.sh 自动设置它。如果您直接运行了 helm upgrade,则该注解从未被设置。
修复
istio-addon:端口 80/443 超时,TLS 握手重置
症状: 使用 ingress_controller = "istio-addon" 执行 make deploy 后网站无法访问。端口 80 超时,端口 443 重置。ACME 验证一直 pending。
原因(三个复合问题):
- 错误的网关标签。 带有
ingressClassName: istio的 Kubernetes Ingress 会定向到带有istio: ingressgateway标签的 Pod。AKS 托管的外部网关使用istio: aks-istio-ingressgateway-external。 ClusterIssuer创建时使用了class: nginx。 ACME HTTP-01 验证器 Ingress 获得了nginx类,而不是istio。- TLS 密钥存储在错误的命名空间。 Istio SDS 从网关 Pod 命名空间(
aks-istio-ingress)读取,而不是应用命名空间(langsmith)。
make deploy 在当前脚本中自动处理了所有这三个问题。如果手动部署,请创建一个 Istio Gateway,目标指向 istio: aks-istio-ingressgateway-external;将 ClusterIssuer 验证器的类修补为 ingressClassName: istio;将 langsmith-tls 同步到 aks-istio-ingress 命名空间;并创建一个路由到 LangSmith 前端的 VirtualService。完整 YAML 请参见 TROUBLESHOOTING.md 源文件。
缺少 letsencrypt-prod ClusterIssuer
症状: kubectl describe certificate langsmith-tls -n langsmith 显示 clusterissuers.cert-manager.io "letsencrypt-prod" not found。
原因: 对于 tls_certificate_source = "letsencrypt" (HTTP-01),letsencrypt-prod ClusterIssuer 由 apply-cluster-issuers.sh 创建,make deploy 通过 kubectl apply 运行它。Terraform 的 k8s-bootstrap 模块不会创建 HTTP-01 颁发机构;它只为 dns01 创建颁发机构。直接运行 helm upgrade 而不是 make deploy 会跳过创建颁发机构。
手动修复:
database "langsmith" does not exist:后端 Pod 崩溃循环
症状: 后端 Pod 立即崩溃:FATAL: database "langsmith" does not exist。
原因: Azure Database for PostgreSQL Flexible Server 不会自动创建应用程序数据库。Terraform 的 postgres 模块现在通过 azurerm_postgresql_flexible_server_database 创建数据库。此错误意味着您使用的模块版本较旧,缺少该资源。
修复
langsmith-backend-auth-bootstrap 卡在 CreateContainerConfigError
原因: 该作业使用键 initial_org_admin_password 读取管理员密码。如果 Secret 创建时使用了不同的键名(例如 admin_password),容器将无法启动。
修复
无法回滚到旧的 chart 版本
原因: LangSmith 数据库迁移是单向前进的。降级 chart 版本会使数据库停留在旧应用镜像无法定位的版本。 修复: 向前升级到您之前使用的版本(或更新版本)。在terraform.tfvars 中设置 langsmith_helm_chart_version 并重新部署。在升级生产环境之前,请始终在单独的环境中测试新的 chart 版本。
Helm 安装超时
原因:langsmith-backend-auth-bootstrap 在每次 helm upgrade 时都会运行数据库迁移;首次安装最多需要 5 分钟。没有 --timeout 20m,Helm 会在安装最终成功之前报告失败。
修复: make deploy 已经使用了 --timeout 20m。手动运行 Helm 时,请始终包含 --timeout 20m。
附加组件
Pod 保持 DEPLOYING 状态,无法达到 HEALTHY
原因: 在启用 TLS 时,config.deployment.url 为空或 config.deployment.tlsEnabled 为 false。操作员根据这些值构建代理端点 URL。
修复: init-values.sh 在从示例复制后会自动注入 url 和 tlsEnabled。如果手动部署:
Insights 附加组件:backend-ch-migrations 处于 CreateContainerConfigError
症状: 启用 enable_insights = true 后,多个 Pod 失败并显示 CreateContainerConfigError。日志:secret "langsmith-clickhouse" not found。
原因: 示例 langsmith-values-insights.yaml 设置了 clickhouse.external.enabled: true,并配置了 existingSecretName: langsmith-clickhouse。这会覆盖集群内的 ClickHouse 配置,并期望存在一个不存在的外部 Secret。
修复: 当 clickhouse_source = "in-cluster" 时,init-values.sh 现在会生成一个最小化的 Insights 文件。对于已存在此问题的部署:
Polly 显示 “Unable to connect to LangGraph server”
症状: Polly 聊天小部件显示连接错误。浏览器控制台:POST http://localhost:8123/threads net::ERR_FAILED 和 CORS 错误。
原因 A:在创建 langsmith-polly-config 之前启动了前端。 引导作业在 Polly 注册后创建包含 VITE_POLLY_DEPLOYMENT_URL 的 ConfigMap。Pod 启动时从 ConfigMap 加载环境变量,而不是动态加载。
修复
polly.agent.extraEnv 中设置了 LANGCHAIN_ENDPOINT。 LANGCHAIN_ENDPOINT 是保留变量。设置它会导致引导作业失败,报错 400 Bad Request: 'LANGCHAIN_ENDPOINT' is reserved。Polly 永远不会被创建。
修复: 完全移除 polly.agent.extraEnv 块。操作员会自动注入 LANGCHAIN_ENDPOINT。
启用 LangSmith Deployment 后,listener 和 operator Pod 始终不出现
原因: 设置了 config.deployment.url,但省略了 config.deployment.enabled: true。当 enabled 为 false(默认值)时,chart 会静默跳过创建 listener 和 operator。
修复: 在 deployment 块内添加 enabled: true:
重复的顶层 config: 键会静默丢弃值
原因: YAML 不允许重复的顶层键。第二个 config: 块会静默丢弃其中一个。
修复: 始终在现有的 config: 键内添加新的配置块。使用 helm get values langsmith -n langsmith 进行验证。
加密密钥在首次部署后不得更改
在首次使用后更改deployments_encryption_key、agent_builder_encryption_key 或 insights_encryption_key 会永久损坏它们保护的数据。无法恢复。
- 请勿轮换这些密钥。
- 请勿在
values-overrides.yaml中内联设置config.agentBuilder.encryptionKey或config.insights.encryptionKey。Chart 通过existingSecretName从langsmith-config-secret读取它们。内联设置会覆盖 Secret 引用。
agent-builder-tool-server 或 polly 处于 CrashLoopBackOff
症状: Pod 无限重启。没有回溯信息。日志反复显示 “Child process died”。
原因: lc_config.settings.SharedSettings 在 uvicorn 工作进程内的模块导入时实例化。在此处引发的 pydantic ValidationError 会使工作进程以代码 0 退出;uvicorn 的父进程打印 “Child process died” 但吞掉了回溯信息。常见触发因素:BASIC_AUTH_ENABLED = true 但 BASIC_AUTH_JWT_SECRET 为空,或者 langsmith-config 中缺少必需的功能标志键。
诊断:在调试 Pod 中运行服务器,其 envFrom 指向 langsmith-config 并设置 PYTHONUNBUFFERED=1。修复: 将缺失的键添加到 Key Vault,重新运行 make k8s-secrets,然后重启部署。
工作负载标识
Pod 崩溃:AADSTS700213: No matching federated identity record found
症状
modules/k8s-cluster/main.tf 中的 service_accounts_for_workload_identity:
拆卸和清理
先运行 make clean 再运行 make destroy 会导致基础设施孤立项
症状: 在 make clean 后运行 make destroy 失败,报错 No state file was found!。Azure 资源仍在运行,但 Terraform 已失去跟踪。
原因: make clean 会删除 terraform.tfvars 和 secrets.auto.tfvars。没有这些文件,Terraform 无法初始化后端。
正确的拆卸顺序
identifier,Azure 可能会在下次 terraform apply 时恢复软删除的 Key Vault。当 keyvault_purge_protection = false 时,请先清除:az keyvault purge --name langsmith-kv<identifier> --location <region>。
terraform destroy 在删除 VNet/子网时停滞
原因: ingress-nginx-controller 配置的 Azure Load Balancer 未被 Terraform 跟踪。当 LB 持有子网引用时,Azure 会阻止删除 VNet。
修复: 先运行 make uninstall。
langsmith-agent-bootstrap 钩子超时
症状: Helm 升级后钩子超时(context deadline exceeded)。代理进度经过 QUEUED → AWAITING_DEPLOY → DEPLOYING,但在 20 分钟内未达到 HEALTHY。
原因: 在冷集群上,三个 LGP 代理(agent-builder、clio、smith-polly)首次拉取镜像可能需要超过 20 分钟。Helm 钩子是同步等待的。
修复: 这实际上不是失败。资源已应用;代理继续部署。等待 Pod 稳定,然后重新运行 make deploy。
listener Pod 因 OOM 被杀
原因: listener 内存限制由 listener.deployment.resources 下的大小叠加层设置。在 dev 配置文件中,该限制为 2Gi,持续的部署负载可能会超过此限制。
修复: 在 listener.deployment.resources(chart 读取的键)下提高限制,可以通过切换到更大的大小配置文件,或者在大小叠加层加载之后添加覆盖值到 values 文件,然后重新运行 make init-values 和 make deploy。
Chart 读取
listener.deployment.resources 来设置容器限制,而不是扁平的 listener.resources。langsmith-values-agent-deploys.yaml 示例设置了 listener.resources,但 chart 会静默忽略它,因此该值不会改变限制。过时的 HPA 将 listener 或 host-backend 扩展到最大副本数
原因: 之前的 Helm 版本创建了一个 HPA。Helm 在失败的钩子中不会清理它。当使用 enabled: false 重新部署时,过时的 HPA 仍然存在并覆盖 replicas。
修复
AGIC(应用程序网关入口控制器)
AGIC Pod CrashLoopBackOff:AGW GET 请求返回 403
症状:ingress-appgw-deployment 处于 CrashLoopBackOff。日志:ErrorApplicationGatewayForbidden: does not have authorization to perform action Microsoft.Network/applicationGateways/read。
原因: AKS 为 AGIC 附加组件创建一个托管标识(MC_ 资源组中的 ingressapplicationgateway-<集群名>)。该标识在集群配置期间创建,但需要大约 5 分钟才能在 Azure AD 中注册,之后角色分配才会生效。
修复: k8s-cluster 模块在集群创建后等待 300 秒(time_sleep.agic_identity_propagation),并自动创建三个必需的角色分配。如果在 make apply 后 AGIC 仍然返回 403:
AGIC:ApplicationGatewayInsufficientPermissionOnSubnet
原因: AGIC 附加组件标识缺少 VNet 的网络参与者角色。
修复
AGIC:TLS 密钥显示 SecretNotFound
原因: AGIC 在 cert-manager 签发 TLS 证书之前就看到了 Ingress。
修复: 更新 Ingress 以触发重新同步:
AGIC 拒绝 ingressClassName: azure/application-gateway
原因: 旧版注解 kubernetes.io/ingress.class: azure/application-gateway(带斜杠)不是有效的 ingressClassName。AKS 创建的 IngressClass 名为 azure-application-gateway(连字符)。
修复: 使用 ingressClassName: azure-application-gateway。make init-values 会自动设置此项。
Istio(自管理 Helm)
Istio 站点返回连接被拒绝 / 无路由
症状: 连接被拒绝。pilot-agent request GET config_dump 显示 LDS: PUSH resources:0。
根本原因(必须同时修复所有三个问题):
- 未设置
meshConfig.ingressControllerMode。默认为DEFAULT,会忽略ingressClassName。必须设置为STRICT。 - 缺少
istioIngressClass 资源。 meshConfig.ingressClass未设置为istio。
meshConfig 在 istiod Helm 版本(Terraform)中设置,deploy.sh 创建 IngressClass。手动修复:创建 IngressClass 并重启 istiod。
Istio HTTPS 返回 “no peer certificate available”
原因: istiod 通过 SDS(kubernetes://langsmith-tls)读取 TLS 密钥。该密钥必须存在于 istio-system(网关 Pod 命名空间)中。cert-manager 将其签发到 langsmith 命名空间;它不会被自动复制。
修复: deploy.sh 在部署后同步该密钥。手动修复:将该密钥复制到 istio-system。
istio-addon 遗留的 CRD 阻止自管理 Helm 安装
症状: terraform apply 失败:CustomResourceDefinition "wasmplugins.extensions.istio.io" exists and cannot be imported into the current release: invalid ownership metadata。
修复
诊断命令
集群访问
Pods
Ingress 和 TLS
工作负载标识
Helm
LangSmith Deployment
Key Vault 和 Kubernetes Secrets
快速健康检查
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

