关于暂停容器 - 我们如何构建以及为何弃用我们的容器暂停功能

主要观点:介绍了可“冻结”运行容器的功能及相关实现,包括在 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 的复制/缩放功能。
阅读 19
0 条评论