isula、containerd 基本功能测试
测试环境
- 树莓派 4B
- CPU: Cortex-A72 4C
- RAM: 8G
- SD卡: 128G C10 A1 U3
- OS: openEuler-22.03
- Docker: 20.10.17
- iSula: 2.0.7
- Containerd: 1.6.6
除 Docker 外没有集成网络组件,isula 与 containerd 均使用 host 网络测试。
测试情况
containerd openEuler 源均为 1.2 版本太低.
- 从 docker 官方源安装 containerd.io 1.6.6-3.1.el7 涉及依赖:container-selinux policycoreutils selinux-policy selinux-policy-targeted
- 安装 container networking-plugins , oe源版本 0.8.6-5 版本太低, network 组件不可用, 使用来自 nerdctl 仓库源 https://github.com/containerd/nerdctl/releases/download/v0.21.0/nerdctl-full-0.21.0-linux-arm64.tar.gz
- 安装 iptables
问题与可能解决方法:
- 日志:由于 containerd 不支持 docker plugins loki 日志收集服务不可用, 可替换为使用 promtail 直接从本地收集日志.
- 启动方式:nerdctl compose 代替 docker-compose .
nerdctl compose up -d 启动之后, 基本服务可用(只测试了上传下载)
使用 containerd 替换 docker 需要进行以下操作:
- containerd 高版本 rpm 打包并推入仓库
- container networking-plugins 高版本 rpm 打包并推入仓库
- nerdctl 打包为 rpm 并推入仓库
- nerdctl iptables container-selinux policycoreutils selinux-policy selinux-policy-targeted containerd containernetworking-plugins 加入 os 构建
- system-agent 中调整 docker network create 为 nerdctl network create
- system-agent 中调整 docker-compose 相关操作为 nerdctl compose
- system-agent 中检测 docker 服务是否启动的相关操作更换为检测 containerd 是否启动
- system-agent 中监听的 docker0 Ip 需要修改为 nerdctl ip
资源占用:
- containerd 本身资源占用比 docker 小,但为了兼容 docker-compose 的模式,引入 nerdctl 做 containerd 兼容 docker-compose.yml 文件的解析方式,每个容器都会启动一个 nerdctl 的子进程来存储配置、存储日志、调用 cni 创建网络等,导致实际占用的总体内存稍高于 dockerd + docker-driver + docker-proxy 所占用的内存。
- containerd 共计 490-510MB,isulad 共计 450-480MB,docker 共计 380M-420M。(如使用 ctr/isula 直接创建 host 模式 containerd/isula 的容器,containerd 守护进程共约 70-80MB,isulad 共计 30-40MB,期中 containerd 和 isula 均无网络等相关配置,仅能使用 host 网络,或使用 cni 接入 bridge 网络。)
启动速度:
- nerdctl 不支持 healthcheck 和 loki 日志插件,启动速度对比中将 docker-compoase.yml 中引用的 loki 插件和 healthcheck 相关配置去除
- containerd 使用 nerdctl 启动 docker-compose.yml 速度较快,10s 内
- docker-compose 启动 docker-compose.yml 速度较快,20s 内,大致差距在与解析 docker-compose.yml 的速度
- nerdctl 调用链 nerdctl -> containerd + cni -> shim-runc -> runc
- docker-compose 调用链接 docker-compose -> dockerd -> containerd -> shim-runc -> runc
使用 host 问题与可能解决方法:
- 使用 ctr 直接创建容器,host 本机网络模式启动,需修改 gateway 转发地址,与各模块容器端口,启动方式无法使用 compose 文件,需要执行命令启动。
- 端口暴露的问题需要用防火墙处理。
- 需要考虑端口冲突。
其他遗留问题:
- isula、containerd、cri-o 不支持 docker-compose
- redhat-podman openEuler 兼容性目前有问题,依赖库版本太低。