Kibotos

安装 ctrl

本页介绍如何在宿主机上安装并初始化 ctrl、签发第一个 Operator 注册密钥。

以下命令在已校验的发布包目录中执行,版本号按实际修改。

1. 安装包并填写配置

sudo apt-get install ./kibotos-ctrl_1.2.3_amd64.deb
sudo install -o kibotos-ctrl -g kibotos-ctrl -m 0600 \
  /usr/share/doc/kibotos-ctrl/ctrl.example.toml /etc/kibotos/ctrl/config.toml
sudoedit /etc/kibotos/ctrl/config.toml

在配置中填写数据库、artifact store、identity.host 和数据面的名称。全部表与键见 ctrl 配置。

注意:

  • 配置文件只允许 kibotos-ctrl 读取。使用 dsn_file 时,该文件也要能被这个账户读取。
  • 要提供 E2B sandbox 指标时,在这里一并填写 [metrics] 段,见ctrl 的配置。
  • 要导出 ctrl 自己的指标与集群状态时,填写 [telemetry] 段,见集群与服务指标。它与 [metrics] 无关。
  • 状态目录固定为 /var/lib/kibotos/ctrl,服务只能写这个目录。
  • 安装包只创建账户与目录并重载 systemd。初始化、迁移、启用和启动都由下面的步骤完成。

数据库的连接方式

database.dsn 可以指向主库自己,也可以指向连接代理或连接池,条件是全部读写都发到主库。

地址能否使用要注意什么
主库自己,或故障切换时指向新主库的高可用地址能
云数据库的连接代理,例如 Amazon RDS Proxy能
云数据库的读写分离地址,例如阿里云 RDS 的数据库代理地址(主机名通常含 rwlb)只读实例的读权重为 0 时能读流量发往只读实例时不能用:ctrl 要读到自己刚写的数据,只读实例落后时它会按旧状态判断
PgBouncer 会话模式能
PgBouncer 事务模式能要 1.21 或更新的版本,max_prepared_statements 大于 0;DSN 不能带 search_path 这类连接参数
只读副本不能

经过代理或连接池时,影响的只是性能:只有一个 ctrl 执行,由数据库里的执行权保证,与连接和数据库会话无关;连同一个数据库的第二个 ctrl 只应答读请求,见执行权。

kibotos-ctrl migrate 要直连主库。迁移工具用会话级锁防止两次迁移同时进行,事务级连接池会把这把锁留在别的客户端使用的会话上。迁移时用一份 database.dsn 指向主库的配置文件,其余命令不受这条限制。

数据库的切换会让连接上已准备的语句失效。经过代理时 ctrl 的连接不会断开,每条连接最多失败一次就换新,调用方看到的是可重试的错误。

判断 DSN 连到的是不是主库,多查几次,每次的第一列都要是 f:

psql "$DSN" -Atc 'select pg_is_in_recovery()'

数据库连接数

ctrl 运行时最多占用 database.max_connections 条 PostgreSQL 连接,默认 32。PostgreSQL 的 max_connections 要容得下这个数,再加上其他客户端,以及 kibotos-ctrl 一次性命令(迁移、签发注册密钥等)的少量短连接。

配置项默认值含义
workspace.execution_concurrency16全部 node 上同时执行的 Workspace 命令数,创建、启动与 Transfer 恢复一组、停止、删除与数据面撤销一组,两组各自按这个数计算;Transfer 的导出与导入一组、存储对象的搬迁一组,各按这个数的一半(至少 1)计算
database.max_connections32ctrl 占用的连接总数,不能小于 8
  • 执行中的命令只在读写数据库时占连接,所以调高 execution_concurrency 不要求调高连接数。
  • kibotos_ctrl_db_acquire_waits_total 持续增长、请求变慢时,调高 max_connections。
  • 连接上限只能写在 database.max_connections,DSN 里写 pool_max_conns 会被拒绝。
  • ctrl 启动时在日志里记录一行 database connections,给出实际的并发与连接上限。

2. 准备 bucket 与权限

在启动 ctrl 之前,由存储管理员创建配置中的 bucket,并给 ctrl 的运行身份授权。

  • 所需权限(对象读写、删除、multipart 上传、按前缀列举)见示例 policy,部署时把资源替换成实际的 bucket 和 namespace。自动回收对象存储要用到其中的删除权限。
  • 权限覆盖两个前缀:kibotos-template/v1/<namespace>/ 存放 Template 产物,kibotos-transfer/v1/<namespace>/ 存放 Transfer 归档。
  • 创建 bucket 使用单独的管理身份。管理凭证不要写进 ctrl 配置。
  • Transfer 归档是用户 Volume 里的数据。给 bucket 打开静态加密和访问审计,并把能读这个 bucket 的身份限制在 ctrl 的运行身份。

ctrl 每次启动都会检查存储是否可用:在开放 API 和启动后台任务之前,用运行身份先后在 kibotos-template/v1/<namespace>/staging/ 和 kibotos-transfer/v1/<namespace>/ 下各写入一个随机的小对象,读回校验后删除。整个检查限时 10 秒。

  • 任何一步失败,ctrl 都不会启动。journal 中的 operation 字段说明失败在写入、读取、校验还是删除,reason 字段区分 bucket 不存在、权限不足、配置错误和存储不可达,并给出修复建议。
  • 检查只使用这两个前缀的对象权限,不创建 bucket,也不发起 multipart 上传。
  • 检查失败时会尽量删除已写入的对象。超时或没有删除权限时可能留下小对象,需要为 staging 前缀配置生命周期规则来回收。
  • 这个检查只证明基本读写可用。multipart 上传等能力在第一次发布 Template 时验证。
  • 运行期间的发布失败会在 journal 中记录阶段和 command/session 标识。存储的短暂故障不会让运行中的 ctrl 退出。

不支持 S3 条件写或附加校验和的存储(例如阿里云 OSS)同样可用:ctrl 改用 OSS 的禁止覆盖头,并把发布的每个 blob 读回校验,代价是每个 blob 在存储与 ctrl 之间多传一次。

阿里云 OSS 只支持 virtual-hosted 寻址,配置里写 path_style = false,endpoint 用不带 bucket 的地域域名(如 oss-cn-shenzhen.aliyuncs.com),bucket 单独填写。

3. 初始化、签发第一个 Operator 密钥并启动

umask 077
sudo -u kibotos-ctrl kibotos-ctrl init --config /etc/kibotos/ctrl/config.toml
sudo -u kibotos-ctrl kibotos-ctrl migrate --config /etc/kibotos/ctrl/config.toml
sudo -u kibotos-ctrl kibotos-ctrl enrollment create \
  --config /etc/kibotos/ctrl/config.toml --operator operator-a \
  --output /var/lib/kibotos/ctrl/operator-enrollment.key
sudo systemctl enable --now kibotos-ctrl.service
sudo journalctl -u kibotos-ctrl.service --no-pager -n 50
  • 三条 kibotos-ctrl 命令都必须用 sudo -u kibotos-ctrl 以服务账号执行。直接 sudo 会以 root 建出 pki/,服务账号进不去,服务启动时报 load managed PKI state: ... permission denied。init 发现状态目录不属于当前账号会直接拒绝,提示用哪个账号重跑。已经用 root 建过的,用 sudo chown -R kibotos-ctrl:kibotos-ctrl /var/lib/kibotos/ctrl/pki 交还后再以服务账号跑一次 init。
  • init 可以重复执行,已初始化时输出 unchanged。任何一步失败都先处理错误再继续。
  • 开机时 PostgreSQL 可能比 ctrl 晚就绪,例如数据库跑在本机容器里。ctrl 连不上数据库时退出,systemd 每 5 秒重启一次,直到数据库可用;这个间隔不会触发 systemd 默认的启动次数上限(10 秒内 5 次),不需要手工 reset-failed。日志里会反复出现 connect ctrl PostgreSQL: ... connection refused,数据库就绪后自行消失。
  • 数据库长期不可用时 ctrl 会一直重试。想让 ctrl 等数据库的服务就绪后再启动,可以用 systemctl edit kibotos-ctrl.service 加上对该服务的 After= 与 Wants=。
  • 注册密钥(enrollment key)由 kibotos-ctrl 账户写入自己的状态目录,权限 0600。管理员读取后通过安全渠道交给 Operator,不需要放宽文件权限。
  • PKI 的续期与恢复见身份、配置与连接。

警告

serve 第一次启动时在 storage.root 下生成 credential-keys/,里面的密钥加密数据库中保存的调用方凭证(如 Egress 的用户名与口令)。它不进数据库,要和 pki/ 一起备份:丢失后这些凭证无法解密,只能由调用方重新写入。

自动回收对象存储

ctrl 启动 10 分钟后开始自动回收对象存储,之后每 24 小时一次。它只删除满足全部条件的 manifest 与 blob:撤回超过 7 天,并且目录中没有任何 Workspace、保留期或未撤回的 revision 还引用它。

回收记录、手工计划与执行,以及把某个 Launch 排除在回收之外,见 artifact 回收。

下一步:注册 Operator

Operator 在自己的工作机上用这把密钥建立 kibo 的连接配置,然后为每个 node 签发一把注册密钥。步骤见安装 Operator 并注册 node。 安装 node 用到的 node-enrollment.key 就来自那一步。

本页内容