本文永久链接: https://www.xtplayer.cn/rancher/rancher-ui-performance-optimization/

ui-sql-cache 是 Rancher 中一项通过 SQLite 数据库在服务端缓存 Kubernetes 资源数据,以实现服务端分页、排序和过滤的关键性能优化功能(代号为“Vai”项目)。

它旨在解决当集群资源数量巨大时(如数万个 ConfigMap),传统前端拉取全量数据导致浏览器内存溢出、界面卡顿及 API Server 负载过高的问题。

核心工作原理

开启后,Rancher 的内部 API 组件 Steve 会为资源类型创建 Informer,并将 Kubernetes 对象持久化到 SQLite 数据库中。

  • 数据缓存:首次请求某类资源时,从 Kubernetes API Server 获取数据并存入 SQLite,后续通过 Watch 保持同步更新。
  • 服务端处理:UI 请求列表时,Steve 会将请求(含分页、排序、过滤参数)直接转换为 SQL 查询在服务端完成,仅返回当前页面需要的数据。
  • 减轻负载:极大减少直接对 Kubernetes API Server 的 LIST 请求,有效降低其压力。

如何开启与关闭

功能开关位于全局设置中的 Feature Flags 内。

  1. 开启:点击右上角 ☰ > Global Settings > Feature Flags,找到 ui-sql-cache 并激活。
  2. 重启:激活后 Rancher Server 和所有下游集群的 Agent 会自动重启。
  3. 生效:重启完成后,刷新浏览器页面即可生效。
  4. 关闭:在上述路径中选择停用,等待重启并刷新页面即可回退。

注意:在 Rancher 2.11 及更早版本中,Vai 被视为实验性功能,默认处于关闭状态。随着 Rancher 2.12\2.13 的发布,Vai 已达到生产就绪状态,并默认启用

重要考量与限制

启用前请务必留意以下几点:

  • 磁盘空间:SQLite 缓存文件存储在 Pod 的文件系统中,会占用临时存储(Ephemeral Storage)。官方建议节点可用空间至少为 etcd 快照大小的两倍,在生产环境中需预留数 GB 空间。如果看到 database or disk is full 错误,说明需要扩容。
  • 数据加密:缓存会将资源对象明文写入磁盘。若涉及敏感数据,可通过在 Rancher Pod 和 Agent Pod 中设置环境变量 CATTLE_ENCRYPT_CACHE_ALL=true 来开启加密(密钥和安全令牌始终默认强制加密)。
  • 功能限制
    • 列表数据是每 5 秒自动刷新一次,而非实时。
    • 部分列的排序/过滤功能会受影响(如节点列表的 CPU/内存列、Pod 列表的镜像列等)。
    • Workloads 列表中原来混合展示多种资源类型的视图已被移除。

辅助优化机制

除了 ui-sql-cache,Rancher UI 还内置了其他优化逻辑:

  • 增量加载:在资源数量超过阈值时,列表会启用“增量加载”模式,优先展示部分数据并分批加载剩余内容,提升首屏渲染速度。
  • 重复请求合并:Store 层会自动识别并合并同一时间发出的相同 API 请求,避免重复调用。

总结

ui-sql-cache 是 Rancher 团队为应对大规模集群管理而设计的生产级特性,它通过“以磁盘空间换 API 压力”的策略,显著提升了 UI 在大规模环境下的流畅度。

建议在升级前预先评估 Rancher Pod 的临时存储配额,并在开启后关注节点的磁盘使用情况。如果希望关闭此功能回退到旧版模式,直接禁用 ui-sql-cache 开关即可。

注意:2.12 或者 2.13 的早期版本存在一些 BUG,可能会导致 rancher ui 无法正常显示。如果升级到 2.12 或者 2.13 系列,请更新到当前系列的最新版本。

点击右上角账户头像,选择偏好设置。在显示设置中减少每页行数数值,比如设置为 10 或者 25,默认为 100。经过调整,资源数量比较多的页面,比如 Pod、Secret 等,将实现秒级显示。

参考文档:

https://ranchermanager.docs.rancher.com/zh/v2.12/how-to-guides/advanced-user-guides/ui-server-side-pagination

https://www.suse.com/c/pt-pt/rancher_blog/lightning-fast-kubernetes-management-with-ranchers-vai-project/