前言
刚开始用cri工具时,一直被配置文件绕得云里雾里,因为一直找不到相关教程,就搁置下来了。
结果在调了几个月CRI的接口后,昨天才反应过来,crictl工具要求配置文件参数都在API里:
https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1alpha2/api.pb.go
照着源码中的json字段编写json配置文件就可以运行容器组了,操作逻辑和调接口是一样的,下面用containerd-cri代替docker/docker-ce来运行wordpress。
测试环境
系统配置
- 系统:CentOS 7.9.2009 64位
- CRI:containerd-cri v1.4.3
软件配置
原有的docker/docker-ce/containerd等,需要全部删除,避免和接下来安装的containerd-cri文件夹、数据产生冲突。
|
|
containerd-cri可以直接在release页面下载到:
https://github.com/containerd/containerd/tags
这里使用整合了cri工具和cni插件的v1.4.3版本:
|
|
解压到根目录直接安装
|
|
启动服务
|
|
压缩包内文件占用的目录如下,若需要卸载时,关闭containerd服务后,删除相关文件即可:
|
|
crictl命令
|
|
crictl命令代替了常用docker命令,以容器组的形式运行容器,默认读取 /etc/crictl.yaml 配置文件,可以添加debug参数输出详细信息:
|
|
运行包含一个容器的容器组
|
|
假设有两个编写好容器配置文件 container-config.json 和沙箱配置文件 pod-config.json,执行命令:
|
|
crictl工具将顺序执行:
- 创建沙箱
- 拉取容器镜像
- 创建容器
- 启动容器
若镜像需要用户密码拉取,可以在命令行中使用auth或creds标志位传入。
运行包含多个容器的容器组
这里需要拆解步骤,逐一手动执行:
- 创建沙箱:crictl runp pod-config.json,在输出信息中,取得沙箱ID,假设为64e44d802c1c5
- 拉取容器镜像:crictl pull 镜像名,拉取所需镜像
- 创建容器:crictl create 沙箱ID container-config.json pod-config.json,在输出信息中,取得容器ID,假设为c677fe6a45e20
- 启动容器:crictl start 容器ID
重复2~4步骤,启动所有容器
容器及沙箱配置文件
这里以配置wordpress容器组为例,由于编写配置文件时,需要从源码参考字段,最好先配代码跳转方便查看。
默认配置下,使用runc作为runtime,使用bridge和portmap插件提供内网地址和端口映射功能。
沙箱配置文件
沙箱配置文件的json字段对应结构体 PodSandboxConfig 的tag,如下:
|
|
参考字段编写一个用于wordpress的沙箱配置文件
|
|
字段含义如下:
- metadata:包含沙箱基本信息,需要确保name、uid在同一个namespace下唯一
- hostname:沙箱主机名称
- log_directory:日志目录,所有容器日志都会存放在该目录下,这里使用/root/blog/log作为根目录
- dns_config:DNS配置,这里只设置了DNS服务器
- port_mappings:端口映射,根据需求开启宿主机到容器的端口映射,每个配置最终对应一套iptables规则实现流量转发
容器配置文件
容器配置文件的json字段对应结构体 ContainerConfig 的tag,如下:
|
|
参考字段分别编写wordpress和mysql容器配置文件
container-wordpress.json
|
|
container-mysql.json
|
|
字段含义如下:
- metadata:包含容器基本信息
- image:镜像配置
- envs:环境变量
- mounts:挂载路径,这里在/root/blog下分别创建wordpress和mysql目录存放容器数据
- log_path:相对日志路径,和沙箱中的日志目录/root/blog/log组合起来为容器日志文件绝对路径
安装上一个章节的流程,就可以运行wordpress了:
|
|
cri与docker
- cri是k8s的接口设计,并不是面向docker用户的,因此缺乏也很多预期的docker功能,如镜像管理、日志切割、自动重启、resetful接口、docker-compose等等
- cri工具只能使用配置文件运行容器组(运行单一容器使用ctr命令),与常用的docker-compose运行多个容器不同,所有容器运行在同一个网络命名空间下,因此使用环回地址即可访问同一沙箱下的容器
- 在k8s外,使用cri来代替docker,目前看来不是可行的方案