ecr-runtime block-volume hot-plug --sandbox <sid> --container <cid> --block-volume <block path on host> --device-path <block path in container>
- 关于 kubelet --> CRI --> containerd 的调用路径参照
CRI调用机制
- 对比 runC容器, kata的实现分为两段: host部分的实现、guest部分的实现, host部分的VM涉及到了虚拟化相关的领域知识
- guest里面主要是 kata-agent组件, 这部分可以理解为一个rust 版本的runC. 代码分析可以对比runC的实现[1][2]做比较和参照
- 阅读agent部分的代码, 有助于理解 oci runtime spec的定义, 例如 devices、mounts、hook 这些内容在 create container中是如何工作的
- kata-runtime --> kata-shim, 复用了
shim-monitor.sock
, 环境上可以通过netstat -ap --unix
找到shim 监听的unix socket. - kata里多处用到了 UNIX domain socket 来实现本地IPC, 分别在
/run/vc/sbs/<id>/
和/run/vc/vm/<id>/
下面 - kata-shim --> kata-agent, 使用了vhost-sock-pci qemu 提供的一种host和guest的通信机制. vsock, 这个也就是很多文章里提到的"打洞"
-
why grpc,为什么grpc被广泛使用, 优势在哪里?[3][4]
- transport protocl(传输部分): http/2,multiplexing(多个http streams on one tcp)、header encoding(binary messages and trailers.)
- playload protocal(编解码部分): protobuf,size,encode/decode 的速度
-
why ttrpc, ttrpc 又是个啥东西?
GRPC for low-memory environments. We do this by eliding the net/http, net/http2 and grpc package used by grpc replacing it with a lightweight framing protocol.
- containerd --> containerd-shim 只涉及单机交互,不涉及走网络,且单机container数量较多,有节省资源的需求,优化出了 ttrpc
- kata-container 借鉴了containerd 的ttrpc, 实现了ttrpc-rust, 推动技术迭代向好, 点赞
-
host to guest,复用 qmp.sock, 复用createsandbox的代码
- 坑,scsi_scan_mod. 有效帮助: dmesg, 求助系统工程同事(找对人, 事半功倍)
-
agent in guest
setns(mnt_fd, 0); mknod_dev(&dev, path)
- 坑1,rust unsafe,有效帮助: strace 有助于发现系统调用的问题.
- 坑2,setns 不能associate mnt_namespace [5], 有效帮助 manual page 内容详实.
-
好物推荐: manual page 很好用