主要观点:介绍了可“冻结”运行容器的功能及相关实现,包括在 mirrord 开发中遇到的问题及解决方案,如与队列和 gRPC 服务相关的问题,以及从使用暂停 API 到采用“复制 pod”功能的转变等。
关键信息:
- mirrord 可让开发者在远程 Kubernetes pod 环境中运行本地代码,测试代码无需 CI 和部署。
- 有 Docker API 可暂停容器,其他主要容器运行时也有类似功能。
- 暂停容器用于读取队列时存在问题,如等待时间长、连接难断开等。
- 迁移到使用临时容器时失去访问容器运行时 API 的权限,需自行实现暂停功能。
- systemd 在 cgroup V2 中不喜欢对 cgroups 的操作,导致行为不稳定。
- 最终决定放弃暂停 API 方法,采用“复制 pod”功能,其有优缺点。
重要细节: - 使用 Docker API 暂停容器时需考虑 cgroup 的 V1 和 V2 版本,且运行 mirrord 代理的 pod 需有特权。
- 在 cgroup V1 中,通过打开目标 pod 的 cgroup,找到 freezer cgroup 条目,挂载 cgroup 文件系统等步骤实现暂停和解除暂停。
- 在 cgroup V2 中,遇到 nsdelegate 标志导致的问题及相应解决方法。
- “复制 pod”功能创建新的 pod 副本,通过 Operator 进行缩放等操作。
- 新解决方案的优点是对队列和传入流量效果立即生效,使用稳定的高级 k8s API;缺点是不使用原始基础镜像,不运行原始 Docker 入口点,有工作around但仍麻烦。
- 即将弃用暂停功能,可尝试 mirrord for Teams 的复制/缩放功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。