containerd中文翻译系列(十)镜像验证
下面将介绍默认的 "bindir"ImageVerifier
插件实现。
要启用图像验证,请在 containerd 配置中添加类似下面的一段:
[plugins]
[plugins."io.containerd.image-verifier.v1.bindir"]
bin_dir = "/opt/containerd/image-verifier/bin"
max_verifiers = 10
per_verifier_timeout = "10s"
如果存在,bin_dir
中的所有文件都必须是符合以下 API 的验证器可执行文件。
镜像校验器二进制 API
CLI 参数
-name
: 可提取的镜像的给定引用。-digest
: 可提取镜像的解析摘要。-stdin-media-type
: 传入 stdin 的 JSON 数据的媒体类型。
标准输入
经过 JSON 编码的有效载体会传入验证程序二进制文件的标准输入。该有效载体的
媒体类型由 -stdin-media-type
CLI参数指定,并可能在 containerd 的未来版本中发生变化。目前有效载体的媒体类型是 application/vnd.oci.descriptor.v1+json
代表可能被提取的镜像的 OCI 内容描述符。参见OCI 规范了解更多详情。
镜像提取判断
向标准输出端打印镜像提取判断的原因。
返回 0 的退出代码表示允许调出镜像,返回任何其他退出代码表示阻止调出镜像。
镜像校验器调用者合约
- 如果
bin_dir
不存在或不包含任何文件,则镜像校验器不会阻止镜像提取。 - 只有当所有被调用的校验器都返回
ok
判断(以状态代码 0 退出)时,才会提取镜像。换句话说,镜像提取判断是由AND
运算符组合而成的。 - 如果任何验证器超过了
per_verifier_timeout
或执行失败,则验证失败并显示错误,同时返回nil
判断。 - 如果
max_verifiers < 0
,则对调用的镜像校验器数量没有限制。 - 如果
max_verifiers >= 0
,则对调用的镜像校验器数量有限制。bin_dir
中的条目按名称的词序排序,第一个n=max_verifiers
的校验器将被调用,其余的将被跳过。 - 无法保证验证程序二进制文件的执行顺序。
- 验证程序二进制文件的标准错误输出会被 containerd 记录在调试级别,但会被截断。
- 校验二进制文件的标准输出(判断的 “reason”)会被截断。
- 验证程序二进制文件使用的系统资源目前在 containerd 自己的 cgroup 中进行核算和限制,但这一情况可能会发生变化