Skip to content

Kubernetes 安装部署

🎯 系统要求

资源最低要求推荐配置
CPU4 核8 核
内存16 GiB64 GiB
磁盘100 GiB200 GiB
架构x86_64 / ARM64
软件Kubernetes 1.24+, Helm 3+, kubectl 已配置Kubernetes 1.28+

💡 注意:推荐的 8 核 64 GiB 内存 配置可确保生产环境下的最佳性能。

🚀 快速开始

1. 准备 Kubernetes 集群

确保 Kubernetes 集群正常运行,且 kubectl 已配置好集群访问权限:

bash
kubectl cluster-info
kubectl get nodes

2. 克隆并进入目录

bash
git clone https://github.com/ModelEngine-Group/nexent.git
cd nexent

3. 部署

运行部署脚本:

bash
bash deploy.sh k8s

执行此命令后,系统会通过 Bash TUI 选择配置选项。可使用方向键或 j/k 移动,空格切换多选项,回车确认,b/Backspace 返回上一步,q 退出。

组件组合:

  • infrastructure(必选): Elasticsearch、PostgreSQL、Redis、MinIO
  • application(默认选中,可取消): config、runtime、mcp、northbound、web
  • data-process(默认选中,可选): 数据处理服务
  • supabase(默认选中,可选): 启用用户、租户和认证能力
  • terminal(可选): 启用 OpenSSH 终端工具
  • monitoring(可选): 启用观测组件,选择后会继续选择 provider

端口策略:

  • development(默认): 使用 NodePort 暴露 Web 和调试/内部服务
  • production: 内部服务使用 ClusterIP,仅暴露生产入口

镜像来源:

  • general(默认): 使用标准公开镜像仓库
  • mainland: 使用中国大陆镜像源
  • local-latest: 使用本地 latest 镜像,并将 Nexent 应用镜像的拉取策略设为本地优先

Kubernetes 使用与 Docker 相同的 deploy/env/.env。已有 deploy/env/.env 会原样保留;如果不存在,部署脚本会优先复用 docker/.env,再回退到 deploy/env/.env.example

部署成功后,非敏感部署选项会保存到 deploy/k8s/deploy.options。下次交互部署时可选择复用本地配置或重新全量配置。

⚠️ 重要提示

1️⃣ 首次部署 v1.8.0 及以上版本时,部署过程中系统会提示您设置 suadmin 超级管理员账号的密码。该账号为系统最高权限账户,请输入您想要的密码并妥善保存——密码创建后无法再次找回。

2️⃣ 忘记记录 suadmin 账号密码?请按照以下步骤操作:

bash
# Step 1: 在 Supabase 数据库中删除 su 账号记录
kubectl exec -it -n nexent deploy/nexent-supabase-db -- psql -U postgres -c \
  "SELECT id, email FROM auth.users WHERE email='suadmin@nexent.com';"
# 获取 user_id 后执行删除
kubectl exec -it -n nexent deploy/nexent-supabase-db -- psql -U postgres -c \
  "DELETE FROM auth.identities WHERE user_id='your_user_id';"
kubectl exec -it -n nexent deploy/nexent-supabase-db -- psql -U postgres -c \
  "DELETE FROM auth.users WHERE id='your_user_id';"

# Step 2: 在 nexent 数据库中删除 su 账号记录
kubectl exec -it -n nexent deploy/nexent-postgresql -- psql -U root -d nexent -c \
  "DELETE FROM nexent.user_tenant_t WHERE user_id='your_user_id';"

# Step 3: 重新部署并记录 su 账号密码
bash deploy.sh k8s

4. 访问您的安装

部署成功完成后:

服务默认地址
Web 应用http://localhost:30000
SSH 终端localhost:30022(已启用时)

访问步骤:

  1. 在浏览器中打开 http://localhost:30000
  2. 登录超级管理员账号
  3. 访问租户资源 → 创建租户及租户管理员
  4. 登录租户管理员账号
  5. 参考 用户指南 进行智能体的开发

🏗️ 服务架构

Nexent 采用微服务架构,通过 Helm Chart 进行部署:

应用服务:

服务描述默认端口
nexent-config配置服务5010
nexent-runtime运行时服务5014
nexent-mcpMCP 容器服务5011
nexent-northbound北向 API 服务5013
nexent-webWeb 前端3000
nexent-data-process数据处理服务5012

基础设施服务:

服务描述
nexent-elasticsearch搜索引擎和索引服务
nexent-postgresql关系型数据库
nexent-redis缓存层
nexent-minioS3 兼容对象存储

Supabase 服务(选择 supabase 组件时):

服务描述
nexent-supabase-kongAPI 网关
nexent-supabase-auth认证服务
nexent-supabase-db数据库服务

可选服务:

服务描述
nexent-openssh-serverAI 智能体 SSH 终端
nexent-monitoring可选观测组件

🔌 端口映射

服务内部端口NodePort描述
Web 界面300030000主应用程序访问
Northbound API501330013北向 API 服务
SSH 服务器2230022终端工具访问

内部服务通信使用 Kubernetes 内部 DNS(例如 http://nexent-config:5010)。

💾 数据持久化

Nexent 使用 PersistentVolume 进行数据持久化:

数据类型PersistentVolume默认宿主机路径
Elasticsearchnexent-elasticsearch-pv/var/lib/nexent-data/nexent-elasticsearch
PostgreSQLnexent-postgresql-pv/var/lib/nexent-data/nexent-postgresql
Redisnexent-redis-pv/var/lib/nexent-data/nexent-redis
MinIOnexent-minio-pv/var/lib/nexent-data/nexent-minio
Supabase DB(选择 supabase 时)nexent-supabase-db-pv/var/lib/nexent-data/nexent-supabase-db
共享工作区nexent-workspace-pv/var/lib/nexent
共享技能目录nexent-skills-pv/var/lib/nexent-data/skills

卸载 Helm release 默认不会删除本地 hostPath 数据。可使用 bash uninstall.sh k8s --delete-local-data true 删除 /var/lib/nexent/var/lib/nexent-data/skills/var/lib/nexent-data/nexent-* 下的 Nexent 本地卷内容,使用 --keep-local-data 显式保留。

卸载 Kubernetes 部署

请在仓库根目录使用统一卸载入口:

bash
# 删除 Helm release;交互模式会询问是否删除 namespace 和本地数据
bash uninstall.sh k8s

# 仅清理 Helm release 状态,适合修复卡住的发布
bash uninstall.sh k8s clean

# 删除 Helm release 和 namespace,但保留本地 hostPath 数据
bash uninstall.sh k8s delete --keep-local-data

# 卸载后删除已知本地 hostPath 数据
bash uninstall.sh k8s --delete-local-data true

# 完整清理:Helm release、namespace 和本地 hostPath 数据都会删除
bash uninstall.sh k8s delete-all

--delete-data--delete-volumes 是兼容 Helm 管理资源的参数;本地盘数据请使用 --delete-local-data--keep-local-data 控制。delete-all --keep-local-data 会删除 namespace,但保留本地卷内容。

离线镜像包

可在仓库根目录构建 Kubernetes 离线包:

bash
bash deploy/offline/build_offline_package.sh \
  --target k8s \
  --version v2.2.1 \
  --platform amd64 \
  --components infrastructure,application,data-process,supabase \
  --image-source general \
  --compress true \
  --output-dir offline-package

包内包含镜像 tar、load-images.sh、根目录部署/卸载入口、Kubernetes Helm 资源、SQL 文件、manifest.yamlchecksums.txt。使用 --compress true 时,会在输出目录的父目录生成 nexent-offline-<target>-<platform>-<version>.zip。如果是单节点、Docker 作为容器运行时的集群,可以直接加载并部署:

bash
cd offline-package
bash deploy.sh --load-images k8s

多节点集群需要在每个可能运行 Nexent Pod 的节点上加载镜像,或将镜像推送到集群可访问的内部镜像仓库,再使用匹配的镜像参数部署。

🔧 部署命令

bash
# 交互式部署
bash deploy.sh k8s

# 非交互式部署默认组件
bash deploy.sh k8s --components infrastructure,application,data-process,supabase --port-policy development --image-source general

# 启用用户/租户能力、数据处理和终端工具
bash deploy.sh k8s --components infrastructure,application,data-process,supabase,terminal

# 使用中国大陆镜像源部署
bash deploy.sh k8s --image-source mainland

# 使用本地 latest 镜像
bash deploy.sh k8s --image-source local-latest

# 使用 --sc 简写指定 StorageClass
bash deploy.sh k8s --sc fast-storage

# 仅清理 Helm 状态(修复卡住的发布)
bash uninstall.sh k8s clean

# 卸载,默认保留本地数据;交互确认是否删除 namespace 和本地数据
bash uninstall.sh k8s

# 卸载并删除 namespace
bash uninstall.sh k8s --delete-namespace true

# 卸载并删除本地 hostPath 数据
bash uninstall.sh k8s --delete-local-data true

# 完全卸载,包括 namespace 和本地 hostPath 数据
bash uninstall.sh k8s delete-all

# 完全卸载但保留本地 hostPath 数据
bash uninstall.sh k8s delete-all --keep-local-data

🔧 高级配置

监控配置

Kubernetes 部署通过脚本交互界面中的 monitoring 组件启用监控。部署脚本会生成运行时 Helm values,设置 global.monitoring.enabledglobal.monitoring.providerglobal.monitoring.dashboardUrl,并启用 nexent-monitoring 子 Chart。

bash
cd nexent
bash deploy.sh k8s

如果本地已有 deploy/k8s/deploy.options,脚本会询问是否复用本地配置。请选择重新配置/覆盖本地配置,然后在组件选择界面勾选 monitoring,再在 provider 选择界面手动选择 grafanaphoenixlangfuselangsmithzipkinotlp

支持的 provider:

Provider用途默认访问地址
otlp仅启动 OpenTelemetry Collector,适合转发到外部平台无 Dashboard
phoenix本地 Phoenix 追踪分析http://localhost:30006
langfuse本地 Langfuse 观测栈http://localhost:30001
langsmith转发到托管 LangSmithhttps://smith.langchain.com/
grafana本地 Grafana + Tempohttp://localhost:30002/d/nexent-llm-agent/nexent-agent-trace-monitoring?orgId=1
zipkin本地 Zipkinhttp://localhost:30011

选择 langsmith provider 前,请先在 deploy/deploy/k8s/helm/nexent/values.yaml 中配置 global.monitoring.langsmithApiKeyglobal.monitoring.langsmithProject。如需修改本地 Grafana、Langfuse 或各 Dashboard 的端口,也建议先在 values 文件中调整,再通过部署脚本重新配置并手动选择 monitoring

常用 Helm values:

Values说明
global.monitoring.enabled是否让 Nexent 后端开启 OpenTelemetry 上报
global.monitoring.provider后端 provider 标识:otlpphoenixlangfuselangsmithgrafanazipkin
global.monitoring.otlpEndpoint后端 OTLP HTTP 上报地址,默认 http://nexent-otel-collector:4318
global.monitoring.dashboardUrl前端监控入口地址,留空则隐藏入口
global.monitoring.traceContentModeTrace 内容采集模式:summarymetricsfull
nexent-monitoring.<provider>.service.nodePort调整各 Dashboard 的 NodePort
nexent-monitoring.langfuse.init.*本地 Langfuse 初始组织、项目和管理员账号
nexent-monitoring.grafana.adminUser / adminPassword本地 Grafana 管理员账号

查看监控组件状态:

bash
kubectl get pods -n nexent | grep -E 'otel|phoenix|grafana|tempo|zipkin|langfuse'
kubectl get svc -n nexent | grep -E 'otel|phoenix|grafana|zipkin|langfuse'

生产建议:请替换默认密码、密钥和 Langfuse encryptionKey,并将 Dashboard Service 改为 ClusterIP 或通过受控 Ingress 暴露。

OAuth 登录配置

OAuth 登录依赖 supabase 组件。启用第三方登录时,请同时部署 supabase,并将 config.oauth.callbackBaseUrl 设置为浏览器可访问的 Nexent Web 地址。

bash
bash deploy.sh k8s --components infrastructure,application,supabase

Kubernetes 部署通过 nexent-commonconfig.oauth.* values 写入后端环境变量:

bash
helm upgrade --install nexent nexent \
  --namespace nexent --create-namespace \
  --set global.deploymentComponents.supabase=true \
  --set nexent-supabase-kong.enabled=true \
  --set nexent-supabase-auth.enabled=true \
  --set nexent-supabase-db.enabled=true \
  --set nexent-common.config.oauth.callbackBaseUrl=https://nexent.example.com \
  --set nexent-common.config.oauth.githubClientId=your_github_client_id \
  --set nexent-common.config.oauth.githubClientSecret=your_github_client_secret

可配置的 OAuth values:

Values对应环境变量说明
nexent-common.config.oauth.callbackBaseUrlOAUTH_CALLBACK_BASE_URLWeb 入口地址,回调路径会自动拼接
nexent-common.config.oauth.githubClientIdGITHUB_OAUTH_CLIENT_IDGitHub OAuth Client ID
nexent-common.config.oauth.githubClientSecretGITHUB_OAUTH_CLIENT_SECRETGitHub OAuth Client Secret
nexent-common.config.oauth.gdeUrlGDE_URLGDE OAuth 服务地址
nexent-common.config.oauth.gdeClientIdGDE_OAUTH_CLIENT_IDGDE OAuth Client ID
nexent-common.config.oauth.gdeClientSecretGDE_OAUTH_CLIENT_SECRETGDE OAuth Client Secret
nexent-common.config.oauth.enableWechatENABLE_WECHAT_OAUTH是否启用 WeChat OAuth
nexent-common.config.oauth.wechatClientIdWECHAT_OAUTH_APP_IDWeChat App ID
nexent-common.config.oauth.wechatClientSecretWECHAT_OAUTH_APP_SECRETWeChat App Secret
nexent-common.config.oauth.sslVerifyOAUTH_SSL_VERIFY访问 OAuth provider 时是否校验证书
nexent-common.config.oauth.caBundleOAUTH_CA_BUNDLE自定义 CA bundle 路径

Provider 回调地址:

Provider回调地址
GitHub{OAUTH_CALLBACK_BASE_URL}/api/user/oauth/callback?provider=github
GDE{OAUTH_CALLBACK_BASE_URL}/api/user/oauth/callback?provider=gde
WeChat{OAUTH_CALLBACK_BASE_URL}/api/user/oauth/callback?provider=wechat

本地 NodePort 默认回调示例为 http://localhost:30000/api/user/oauth/callback?provider=github。生产环境应改为公网 HTTPS 域名,并在 OAuth provider 控制台中登记相同地址。

CAS 登录配置

CAS SSO 不依赖 supabase。启用 CAS 时,请将 nexent-common.config.cas.callbackBaseUrl 设置为浏览器可访问的 Nexent Web 地址,且不要带结尾 /nexent-common.config.cas.serverUrl 是 CAS Server 根地址,也不要带结尾 /

Kubernetes 部署通过 nexent-commonconfig.cas.* values 写入后端环境变量:

bash
helm upgrade --install nexent nexent \
  --namespace nexent --create-namespace \
  --set nexent-common.config.cas.enabled=true \
  --set nexent-common.config.cas.serverUrl=https://cas.example.com/cas \
  --set nexent-common.config.cas.callbackBaseUrl=https://nexent.example.com \
  --set nexent-common.config.cas.loginMode=force \
  --set nexent-common.config.cas.logoutUrl=/logout

可配置的 CAS values:

Values对应环境变量说明
nexent-common.config.cas.enabledCAS_ENABLED是否启用 CAS
nexent-common.config.cas.serverUrlCAS_SERVER_URLCAS Server 根地址
nexent-common.config.cas.validatePathCAS_VALIDATE_PATHserviceValidate 路径,默认 /p3/serviceValidate
nexent-common.config.cas.callbackBaseUrlCAS_CALLBACK_BASE_URLWeb 入口地址,CAS 回调路径会自动拼接
nexent-common.config.cas.loginModeCAS_LOGIN_MODEdisabledbuttonforce
nexent-common.config.cas.userAttributeCAS_USER_ATTRIBUTE用户标识属性。为空时使用 <cas:user>
nexent-common.config.cas.emailAttributeCAS_EMAIL_ATTRIBUTE邮箱属性
nexent-common.config.cas.roleAttributeCAS_ROLE_ATTRIBUTE角色属性
nexent-common.config.cas.tenantAttributeCAS_TENANT_ATTRIBUTE租户属性
nexent-common.config.cas.roleMapJsonCAS_ROLE_MAP_JSONCAS 角色到 Nexent 角色的 JSON 映射
nexent-common.config.cas.sessionMaxAgeSecondsCAS_SESSION_MAX_AGE_SECONDSCAS 本地会话最长有效期
nexent-common.config.cas.localSessionMaxAgeSecondsLOCAL_SESSION_MAX_AGE_SECONDSNexent 本地会话有效期
nexent-common.config.cas.renewBeforeSecondsCAS_RENEW_BEFORE_SECONDS距离过期多少秒内触发无感续期
nexent-common.config.cas.renewTimeoutSecondsCAS_RENEW_TIMEOUT_SECONDS无感续期等待超时时间
nexent-common.config.cas.syntheticEmailDomainCAS_SYNTHETIC_EMAIL_DOMAINCAS 未返回邮箱时生成邮箱使用的域名
nexent-common.config.cas.logoutUrlCAS_LOGOUT_URLCAS 登出地址。为空时 Nexent 主动退出不调用 CAS Server 登出接口
nexent-common.config.cas.sslVerifyCAS_SSL_VERIFY访问 CAS Server 时是否校验证书
nexent-common.config.cas.caBundleCAS_CA_BUNDLE自定义 CA bundle 路径

常用 CAS 地址:

用途地址
Nexent 登录入口{CAS_CALLBACK_BASE_URL}/api/user/cas/login?redirect=/
CAS service 回调{CAS_CALLBACK_BASE_URL}/api/user/cas/callback
CAS 无感续期回调{CAS_CALLBACK_BASE_URL}/api/user/cas/renew_callback
CAS 单点登出回调POST {CAS_CALLBACK_BASE_URL}/api/user/cas/logout_callback

Apereo CAS 使用 JSON Service Registry 时,可以新增一个服务注册文件,例如 Nexent-10001.json。文件需要放到 CAS 部署配置的 service registry 目录中,id 必须全局唯一。本地 NodePort 示例:

json
{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId": "http://localhost:30000.*",
  "name": "Nexent CAS Client",
  "id": 10001,
  "description": "Nexent CAS SSO client",
  "evaluationOrder": 1,
  "logoutType": "BACK_CHANNEL",
  "logoutUrl": "http://localhost:30000/api/user/cas/logout_callback"
}

生产环境建议保持 CAS_SSL_VERIFY=true;自签名证书优先配置 CAS_CA_BUNDLE,仅本地验证时再临时设置 CAS_SSL_VERIFY=false

CAS 对接 ModelEngine

当使用 CAS 协议对接 ModelEngine 时,建议通过 values 文件配置 Nexent,避免 CAS_ROLE_MAP_JSON 在命令行中转义复杂。

创建 cas-modelengine-values.yaml

yaml
nexent-common:
  config:
    cas:
      enabled: true
      serverUrl: "https://<ModelEngine IP>:5443/SSOSvr"
      validatePath: "/p3/serviceValidate"
      callbackBaseUrl: "http://<Nexent IP>:30000"
      loginMode: "force"
      userAttribute: "userName"
      emailAttribute: "email"
      roleAttribute: "userType"
      tenantAttribute: "tenant_id"
      roleMapJson: '{"1":"ADMIN","3":"DEV"}'
      sessionMaxAgeSeconds: 3600
      localSessionMaxAgeSeconds: 3600
      renewBeforeSeconds: 300
      renewTimeoutSeconds: 10
      syntheticEmailDomain: "cas.local"
      logoutUrl: "/logout?service=http://<Nexent IP>:30000"
      sslVerify: false
      caBundle: ""

同时,需要进入 OMS 容器添加 CAS client 的注册配置文件,参考如下步骤:

bash
# 创建注册配置文件,将 JSON 部分输入文件并保存
vim Nexent-10000001.json
{
  "@class": "org.apereo.cas.services.CasRegisteredService",
  "serviceId": "http://<Nexent IP>:30000.*",
  "name": "Nexent CAS Client",
  "id": 1000001,
  "description": "Nexent CAS SSO client",
  "evaluationOrder": 1,
  "logoutType": "BACK_CHANNEL",
  "logoutUrl": "http://<Nexent IP>:30000/api/user/cas/logout_callback"
}

# 执行如下命令,将配置文件拷贝到容器中
kubectl cp Nexent-10000001.json model-engine/$(kubectl get pods -n model-engine -l app=oms --no-headers | awk '{print $1}'):/opt/huawei/fce/apps/platform/webapps/SSOSvr/WEB-INF/classes/services/Nexent-10000001.json
kubectl exec -i -n model-engine $(kubectl get pods -n model-engine -l app=oms --no-headers | awk '{print $1}') -- chown tomcat:fusioncube /opt/huawei/fce/apps/platform/webapps/SSOSvr/WEB-INF/classes/services/Nexent-10000001.json

🔍 故障排查

查看 Pod 状态

bash
kubectl get pods -n nexent
kubectl describe pod <pod-name> -n nexent

查看日志

bash
kubectl logs -n nexent -l app=nexent-config
kubectl logs -n nexent -l app=nexent-web
kubectl logs -n nexent -l app=nexent-elasticsearch

重启服务

bash
kubectl rollout restart deployment/nexent-config -n nexent
kubectl rollout restart deployment/nexent-runtime -n nexent

重新初始化 Elasticsearch

如果 Elasticsearch 初始化失败:

bash
bash init-elasticsearch.sh

清理过期的 PersistentVolume

bash
kubectl delete pv nexent-elasticsearch-pv nexent-postgresql-pv nexent-redis-pv nexent-minio-pv

💡 需要帮助