背景
由于kubernetes在1.20版本对docker支持力度比较少, 1.24彻底抛弃docker,需要寻找其他容器运行时替换docker,由于这些运行时提供标准ORI接口,使用上和k8s相同,先创建pod,再创建容器。
安装crio
安装相关
$ export VERSION=1.22$ sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo$ sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo$ yum install cri-o cri-tools
启动相关
$ systemctl start crio
配置私有仓库自签名证书
以前docker自签名证书存放在/etc/docker/certs.d/, cri-o存放在/etc/containers/certs.d/。如果证书域名在CN,可能需要加下面环境变量:
创建目录
$ sudo mkdir /usr/lib/systemd/system/crio.service.d$ sudo touch /usr/lib/systemd/system/crio.service.d/x509.conf
x509.conf 填入
[Service]# 添加此项支持x509CN的证书Environment="GODEBUG=x509ignoreCN=0"
安装Nvidia容器运行时
安装容器运行时, 不用安装nvidia-docker2
$ sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/centos7/x86_64/nvidia-container-runtime.repo | sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo$ sudo yum -y install nvidia-container-toolkit
安装容器运行时/usr/share/containers/oci/hooks.d/oci-nvidia-hook.json在目录有nvidia-hook钩子, 所以除docker以外所用容器运行时都通用的,例如containerd, cri-o都是通过这个钩子。只要环境变量包含环境变量NVIDIA_VISIBLE_DEVICES, 根据环境变量,如果把驱动,以及对应的显卡映射到容器里面。
测试创建容器
cri-o 只是容器运行时服务,控制台使用crictl-tools 进行控制。crictl和k8s类似,需要先创建POD,再创建容器的
创建POD
为了测试方便,使用hostnetwork, sandbox-config.json 配置如下:
{"metadata": {"name": "busybox-sandbox","namespace": "default","attempt": 1,"uid": "hdishd83djaidwnduwk28bcsb"},"linux": {"security_context": {"namespace_options": {"network": 2}}}}
提交配置
$ crictl runp sandbox-config.json$ crictl podsPOD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME4cb8955f9356d 16 hours ago Ready busybox-sandbox default 1 (default)
创建container
使用nvidia/cuda 镜像因为里面包含ENV NVIDIA_VISIBLE_DEVICES=all所以在容器可以显示所有显卡. container-config.yaml 如下:
metadata:name: busyboximage:image: nvidia/cuda:11.4.0-base-centos7command:- sleepargs:- 600log_path: busybox.0.log
$ circtl create
存储路径
ciro 存储路径分别有两个部分组成: 容器存储路径和容器运行时候路径
容器存储配置
建议在这两个默认路径挂载大磁盘,支持容器运行
[crio]# CRI-O stores all of its data, including containers images, in this directory.# root="/var/lib/containers/storage"# Path to the "run directory". CRI-O stores all of its state in this directory.#runroot = "/var/run/containers/storage"
日志配置
日志配置,新的容器运行时都是通过kubelet的参数进行配置, 通过kubespray可以通过下面两个变量进行配置
# Maximum number of container log files that can be present for a container.# 保留最近文件数目: default 5kubelet_logfiles_max_nr: 5# Maximum size of the container log file before it is rotated# 每个文件最大尺寸kubelet_logfiles_max_size: 10Mi
