labels 与 annotations
labels 与 annotations 是你保存在 Workspace、Volume、Egress 与 Resolver 上的自有键值数据。本页介绍怎样设置和修改它们,以及怎样按 label 查找资源。
概述
这几种资源各有两组字符串到字符串的映射,给上层调用方存自己的数据。ctrl 不解释它们,不据此调度、授权或计费。规则沿用 Kubernetes。
| labels调用方附在 Workspace、Volume 等对象上的键值对,可以按 label 筛选列表。 | annotations调用方保存在 Workspace、Volume 等对象上的键值对。Kibotos 只保存 annotation;要筛选列表,用 label。 | |
|---|---|---|
| 用途 | 需要按它筛选的短值 | 原样存取的任意值 |
| 可筛选 | 是 | 否 |
警告
labels 与 annotations 不是秘密。能读到资源的调用方和 kibo 都能看到它们。不要放 token、密钥或由它们推出的值,也不要把某个 label 当作访问控制。
创建时给出
创建 Workspace、Volume、Egress 或 Resolver 时传 --label 与 --annotation:
kibo workspace create --template "$template_id" --label team=infra --annotation note='nightly build'
kibo volume create --capacity 10G --label team=infra
kibo egress create --address proxy.example.com:1080 --label team=infra
kibo resolver create --https https://dns.example.com/dns-query --label team=infra- 两个参数都可重复,格式
key=value。 - 只在第一个
=处切分,所以 annotation 的值可以含=;key=表示值为空。 - 同一个 key 重复给出时,在发请求前就被拒绝。
- labels 与 annotations 与创建命令在同一个事务里写入,也参与幂等比较:同一个幂等键换一份数据重放会冲突。
按 label 筛选
在 kibo workspace list、volume list、egress list 或 resolver list 上传 -l 或 --label:
kibo workspace list --label team=infra --label tier=gold
kibo volume list --include-deleted -l team=infra
kibo egress list -l team=infra- 每个条目要求 label 存在且值逐字节相等,多个条目须同时满足。
- annotations 不参与筛选。
- 在 Workspace 与 Volume 的列表上,可以与其他过滤条件、
--include-deleted组合。已删除的 Workspace 与 Volume 仍返回两组数据,也能被选中。 kibo的下一页提示里带着同样的筛选条件。
修改
set 替换资源的 labels 或 annotations,clear 删除全部:
kibo workspace labels set "$workspace_id" team=infra tier=gold
kibo workspace labels clear "$workspace_id"
kibo workspace annotations set "$workspace_id" note='nightly build'
kibo volume labels set "$volume_id" team=infra
kibo volume annotations clear "$volume_id"
kibo egress labels set "$egress_id" team=infra
kibo resolver labels set "$resolver_id" team=infra警告
修改整体替换映射,没写到的 key 被删除,不做合并。要加一个 label,把已有的 label 与新的一起传入。
- 内容与当前相同时,修改成功且版本不变。
- 已删除的 Workspace 与 Volume 不接受修改,返回
failed_precondition。
版本
每次修改都带期望版本,与当前版本不符时返回 aborted,内容不变。
- labels 与 annotations 各有自己的版本,互不影响,也不影响资源的其他版本,例如 Workspace 的资源版本与绑定版本。
- 不传
--expected-revision时,kibo先读取当前版本再提交;提交时版本已变化则返回冲突,不自动重试。 - 脚本需要重放修改时,把
--command-id与--expected-revision一起传入。
kibo 的输出
| 命令 | 显示内容 |
|---|---|
get | Labels 与 Annotations 两项,每行一个条目,为空时省略。含不可打印字符的 annotation 值加引号显示 |
get --wide | 另有两个版本,在 Revisions 一节 |
list | 默认不显示 labels。--wide 加上 LABELS 一列,-L key 把一个 label 显示成单独的一列,没有这个 label 的行显示 - |
--json | labels、annotations、labels_revision、annotations_revision 字段,为空的 map 不输出 |
哪些列表命令接受 --wide 与 -L、-L 的列怎样命名,见命令自带的通用参数。
key 与 value
| labels | annotations | |
|---|---|---|
| key | [前缀/]名字:前缀是小写 DNS 子域名,最长 253;名字 1–63 字符,首尾是字母或数字,中间可以有 -、_、. | 同左 |
| value | 空,或最长 63 字符,字符规则同名字 | 任意不含 U+0000 的 UTF-8 |
| 合计上限(全部 key 与 value 的字节数) | 65536 | 262144 |
| 版本 | labels_revision | annotations_revision |
- 违反字符规则或上限时返回
invalid_argument,并指出字段与 key。 kibotos.app及其子域名形式的前缀留给 Kibotos 自己的组件使用,ctrl 不据此拒绝请求。例如 E2B 兼容网关使用e2b.kibotos.app/。
用 API
| 操作 | API |
|---|---|
| 创建时给出 | CreateWorkspace、CreateVolume、CreateEgress、CreateResolver 的 labels、annotations |
| 按 label 筛选 | ListWorkspaces、ListVolumes、ListEgresses、ListResolvers 的 label_selector,前两者可与 include_deleted 组合 |
| 修改 | 各资源上的 Update…Labels 与 Update…Annotations,例如 UpdateWorkspaceLabels。传空映射删除全部 |
- 翻页时,
label_selector必须与取得游标的那次请求相同。 - 能力名是
workspace.labels、workspace.annotations、volume.labels、volume.annotations。老版本的服务端会静默丢掉未知字段,写入前先确认能力名存在;缺少时kibo以退出码14失败,不会创建一个丢了字段的资源。 - Egress 与 Resolver 的 labels、annotations 没有单独的能力名,随资源本身的能力
workspace.network_policy.egress.socks5与workspace.network_policy.resolver提供。
下一步
- 创建与列表:
create的其他参数与列表过滤。 - kibo 命令行:幂等键与怎样安全地重放命令。
- Egress 与 DNS 与 Resolver:其他带 labels 的资源。
生命周期
用 Go SDK、E2B SDK 或 kibo 停止、启动和删除 Workspace。Go 示例里的 settleOptions 在 ctrl 回答仍在执行时重发命令,写法见 examples/go/quickstart。本页还介绍强制停止、怎样查看停止或删除释放了什么、FAILED 的 Workspace 怎样恢复,以及服务端在哪些情况下自己停止或重启 Workspace。
接入 Agent 平台
本页介绍怎样把 Agent 平台接入 Kibotos:Operator 身份放在哪里、Agent 会话怎样对应到 Workspace 与 Volume,以及平台怎样处理失败。代码使用 Go SDK,其他语言的程序经原生 API 做同样的调用。