- 基础设施:Terraform 配置 AKS、PostgreSQL、Redis、Blob 存储、Key Vault、cert-manager、KEDA 和入口控制器。
- 应用程序:Helm 在集群上安装 LangSmith chart。
前提条件
所需工具
所需的 Azure RBAC
运行 Terraform 的身份在订阅上需要以下角色:Owner 角色包含以上两者。仅拥有 Contributor 权限是不够的,因为角色分配需要 User Access Administrator。
身份验证
dns_label(Azure 子域名,无需 DNS 配置)或自定义的 langsmith_domain。
快速入门
从零开始到运行 LangSmith 实例的最快路径:配置基础设施
Terraform 配置以下 Azure 资源:克隆并配置
modules/azure/ 目录下运行。运行 make help 可查看完整目标列表。
使用交互式向导生成 terraform.tfvars:
无论部署层级如何,Blob 存储始终是必需的。跟踪数据负载必须存储到 Azure Blob,绝不能存储到 ClickHouse。
引导密钥
setup-env.sh 会将内容写入 infra/secrets.auto.tfvars(已加入 gitignore,权限为 chmod 600)。Terraform 会自动读取此文件;无需在 shell 中导出。
- 首次运行: 会提示输入 PostgreSQL 密码、LangSmith 许可证密钥、管理员密码和管理员电子邮件。会在本地生成
api_key_salt、jwt_secret和四个 Fernet 加密密钥。 - 后续运行: 会从 Azure Key Vault 读取六个生成的密钥(
api_key_salt、jwt_secret和四个 Fernet 密钥)。除非环境中设置了LANGSMITH_PG_PASSWORD、LANGSMITH_LICENSE_KEY、LANGSMITH_ADMIN_PASSWORD和LANGSMITH_ADMIN_EMAIL,否则会重新提示输入 PostgreSQL 密码、许可证密钥、管理员密码和管理员电子邮件。
预检
terraform.tfvars 和 secrets.auto.tfvars 是否存在,以及 terraform/kubectl/helm 是否在 PATH 中。
应用
在新的订阅上配置 Azure 云基础需要 15 到 20 分钟。请勿中断应用过程。
首次部署时跳过
make plan。kubernetes_manifest 资源在 plan 阶段需要活动的集群 API,但该 API 尚不存在。make apply 会通过三个内部阶段处理资源顺序:Azure 基础设施(包括 AKS)→ Kubernetes 引导(命名空间、密钥、cert-manager、KEDA)→ ClusterIssuer 和其余清单。集群凭据和 Kubernetes 密钥
make apply 完成后,获取集群凭据并将密钥推送到集群:
make k8s-secrets 从 Key Vault 读取 8 个密钥,并创建或更新 langsmith-config-secret。可以安全地重新运行;它使用 --dry-run=client | kubectl apply 来原地更新。
验证基础设施
部署 LangSmith
使用两种受支持的部署路径之一:Helm 路径(推荐)
生成 Helm 值
make init-values 读取 terraform output 和 terraform.tfvars,并生成包含所有已填充字段的 helm/values/values-overrides.yaml:
config.hostname,您的 FQDN(来自dns_label或langsmith_domain)。config.initialOrgAdminEmail,第一个组织管理员账户。config.existingSecretName: langsmith-config-secret,密钥引用。config.blobStorage,存储账户名称 + 容器 + 工作负载标识客户端 ID。- 8 个 ServiceAccount 的工作负载标识注解(backend, platform-backend, queue, ingest-queue, host-backend, listener, agent-builder-tool-server, agent-builder-trigger-server)。
- Ingress + TLS 配置块(cert-manager 注解、TLS 密钥名称)。
- PostgreSQL 和 Redis 外部密钥引用(当
postgres_source = "external"/redis_source = "external"时)。
helm/values/examples/ 复制到 helm/values/。
管理员电子邮件读取自
terraform.tfvars 中的 langsmith_admin_email(在 make setup-env 期间设置),并自动写入 values-overrides.yaml。无需手动编辑。部署
make deploy 执行以下操作:
- 验证
values-overrides.yaml是否存在。 - 通过
az aks get-credentials刷新 kubeconfig。 - 使用
service.beta.kubernetes.io/azure-dns-label-name对 LoadBalancer 服务进行注解,这是 Azure 将 DNS 标签分配给公共 IP 所必需的。 - 如果
tls_certificate_source = "letsencrypt",则创建letsencrypt-prodcert-managerClusterIssuer(幂等操作)。 - 运行预检(工具、集群连接性、Helm 仓库)。
- 验证
langsmith-config-secret是否存在;如果缺失,则从 Key Vault 自动创建。 - 构建并记录值链。
- 在继续之前,自动恢复任何卡在
pending-upgrade状态的 Helm 发布。 - 运行
helm upgrade --install langsmith langchain/langsmith --timeout 20m。 - 等待核心部署完成滚动更新。
- 使用工作负载标识客户端 ID 对
langsmith-ksaServiceAccount 进行注解。 - 打印访问 URL 和登录凭据位置。
为什么是
--timeout 20m?langsmith-backend-auth-bootstrap Job 作为安装后钩子运行数据库迁移和组织初始化。首次安装时最多需要 5 分钟。如果没有较长的超时时间,即使安装最终成功,Helm 也可能报告失败。Terraform 路径
当您希望 Helm 发布、Kubernetes 密钥和工作负载标识 ServiceAccount 由 Terraform 状态管理时,使用此路径。app/terraform.tfvars 中的功能标志:
验证部署
https://<HOSTNAME> 并使用来自 Key Vault 的管理员电子邮件和密码登录:
值链
make deploy 按以下顺序应用 Helm 值文件(最后的文件在冲突时生效):
helm/values/ 中的所有文件都已加入 gitignore(是生成的或包含实时密钥)。源模板位于 helm/values/examples/ 中,由 make init-values 复制。
日常运维
启用附加组件
每个附加组件都受infra/terraform.tfvars 中的一个标志控制。设置该标志,重新运行 make init-values 以重新生成值,然后重新运行 make deploy。
LangSmith 部署
启用 LangSmith 部署,这使您可以直接从 LangSmith UI 部署和管理代理作为 API 服务器。这会增加三个新的 Pod。先扩展节点池
在启用之前,将default_node_pool_min_count 至少增加到 5。operator 会按需生成代理部署 Pod,并需要节点余量:
应用、重新生成值、部署
make init-values 将 LangSmith 部署附加组件覆盖 (langsmith-values-agent-deploys.yaml) 追加到值链中。它会自动注入:
验证
langsmith-host-backend、langsmith-listener 和 langsmith-operator 全部为 Running。Pod 总数:约 20 个 Running + 3 个 Completed 的 Job。
KEDA 已随基础设施一同安装。启用 enable_deployments = true 后,operator 会为每个代理部署的工作队列创建 KEDA ScaledObject 资源。工作 Pod 在空闲时缩放至零,并根据 Redis 队列深度进行扩展。
Agent Builder
提供从 LangSmith UI 对 LangGraph 代理进行可视化的 AI 辅助创建和管理。无需运行terraform apply;只需执行 make init-values && make deploy。
前提条件: 已启用 LangSmith 部署(enable_deployments = true)。在未启用的情况下启用 Agent Builder 会导致预检错误。
启用:
make init-values 将 Agent Builder 附加组件覆盖 (langsmith-values-agent-builder.yaml) 追加到值链中。该覆盖启用 Agent Builder UI 及其支持服务,设置 backend.agentBootstrap.enabled: true(注册 Agent Builder 为 LangSmith 部署并创建所需 ConfigMap 的安装后 Job),并设置保守的代理工作 Pod 资源(1 到 2 CPU,512 MiB 到 1 GiB 内存),而不是 chart 默认的 4 到 8 GiB 内存。
验证:
make deploy 后,LangSmith UI 导航中会出现 Agent Builder 部分。
langsmith-agent-builder-tool-server 和 langsmith-agent-builder-trigger-server 都需要工作负载标识来访问 Azure Blob 存储。它们的联合凭据已在 modules/k8s-cluster/main.tf 中预注册;无需额外设置。
Insights 和 Polly
两个功能,都需要 LangSmith 部署。它们彼此独立;可以只启用其中一个。- Insights: AI 驱动的跟踪分析(Clio)。揭示 LangSmith 跟踪中的模式和异常。Clio 在首次 UI 调用时通过 operator 部署为动态的 LangGraph 部署。不添加新的静态 Pod。
- Polly: AI 驱动的评估和监控代理。作为动态的 LangGraph 部署运行,由 operator 管理。该覆盖启用 Polly(顶层
polly.enabled: true);operator 管理其资源。
terraform apply;只需执行 make init-values && make deploy。
make init-values 根据 terraform.tfvars 中的 clickhouse_source 追加附加组件覆盖:
clickhouse_source = "in-cluster",生成一个最小覆盖(仅顶层insights.enabled: true)。Helm chart 在内部管理 ClickHouse。clickhouse_source = "external",生成一个包含clickhouse.external.enabled: true和langsmith-clickhouse密钥引用的完整覆盖。部署前请使用 ClickHouse 主机和凭据创建此密钥。
附加组件摘要
入口控制器
在make apply 之前,在 terraform.tfvars 中设置 ingress_controller。完整的 TLS 兼容性矩阵,请参见 Azure 模块仓库 中的 INGRESS_CONTROLLERS.md。
DNS 和 TLS
dns_label 为您提供一个免费的 Azure 子域名 <label>.<region>.cloudapp.azure.com,无需域名注册或 DNS 区域。deploy.sh 会自动对正确的 LoadBalancer 服务进行注解。
快速入门默认值(HTTP,零配置):
make apply创建 Azure DNS 区域并输出 4 个名称服务器。- 在您的域名注册商处,为子域名添加指向这 4 个名称服务器的 NS 记录。
- 验证:
dig NS langsmith.mycompany.com @8.8.8.8。 make deploy通过 DNS-01 自动颁发证书(工作负载标识将 TXT 记录写入 Azure DNS)。- 获取负载均衡器 IP,将
ingress_ip = "<ip>"添加到terraform.tfvars,然后运行make apply(创建 A 记录)。 make status会准确显示每个阶段需要添加的 NS 和 A 记录。
为什么是 NS 记录而不是 CNAME: cert-manager 必须向区域写入 TXT 记录以证明所有权。这要求 Azure DNS 对该子域具有权威性,而 NS 授权授予了该权限。CNAME 只是对流量的别名,不转移 DNS 权限;DNS-01 挑战会失败。
后续步骤
- 参考 Azure 变量 和 快速参考。
- 查阅 Azure 架构 了解模块结构、流量和工作负载标识。
- 当出现问题时,请查看 Azure 故障排除指南。
- 通过 LangSmith 部署 在 UI 中启用代理部署。
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

