cri-dockerd的作用:
在k8s1.24之前。k8s会通过dockershim来调用docker进行容器运行时containerd,并且会自动安装dockershim,但是从1.24版本之前k8s为了降低容器运行时的调用的复杂度和效率,直接调用containerd了,并且不会在安装dockershim,也不在维护升级了。由于docker并没有完全遵守cri的规范,那么k8s想继续使用docker做为容器运行时的话,就要单独在用一个接口,且这个接口遵守了相关的cri接口规范,然后就有了cri-dockerd【下载地址:Releases · Mirantis/cri-dockerd · GitHub】。所有在k8s1.24之后如果还想继续用docker做为容器运行时的话,就要安装这个cri-dockerd了。
安装步骤1
下载安装文件,可以直接下载二进制文件 或者 安装包,由于我系统是arm的,发布里面之后二进制文件: cri-dockerd-0.2.6.arm64.tgz ,解压之后是一个二进制文件cri-dockerd
把文件放到正确的目录
然后把上面的执行文件 放到 /usr/bin/ 目录中,并给于可执行权限
chmod +x cri-dockerd
当然也可以放在/usr/local/bin. 自己根据习惯放,这个存放目录下面会用到
/usr/bin/ 和 /usr/local/bin/目录区别
下面解释下两个目录的基本区别:/usr/bin/ 和 /usr/local/bin/ 都是 Unix 和 Linux 系统中用于存放可执行文件的目录,但它们之间有一些关键的区别,主要体现在用途和管理上:
/usr/bin/
用途上:这是系统默认安装的大多数用户命令的存放位置。通常由包管理系统(如 Debian/Ubuntu 的 APT 或 Red Hat/CentOS 的 YUM/DNF)来管理。
内容:这里存放的是操作系统自带的或通过官方软件仓库安装的程序。
权限:一般情况下,普通用户没有权限直接向这个目录写入文件,需要超级用户权限才能修改。
/usr/local/bin/
用途:
这个目录主要用于存放本地编译安装的软件、脚本或第三方应用程序,这些通常不是通过系统的包管理器安装的。
内容:
这里可以存放你自己编译的软件、从源代码安装的程序、或者你手动下载并解压的二进制文件等。
权限:
虽然默认情况下也需要超级用户权限来修改此目录,但是它被设计为供管理员用来放置不在标准发行版中的软件,因此更灵活。
主要区别
维护方式:
/usr/bin/ 中的内容通常是通过包管理器维护,更新时会被覆盖。
/usr/local/bin/ 里的内容不会被系统更新影响,适合存放自定义或第三方工具。
安全性与稳定性:
使用 /usr/local/bin/ 可以避免因系统升级导致的手动安装软件被意外删除或覆盖。
将个人添加的软件放在 /usr/local/bin/ 而不是 /usr/bin/,有助于保持系统的整洁,并且更容易区分哪些是系统自带的,哪些是你自己安装的。
环境变量:
在许多Linux发行版中,/usr/local/bin 通常位于 PATH 环境变量的前面,这意味着如果两个目录中存在同名的可执行文件,那么 /usr/local/bin 中的版本会优先被使用。
总结来说,如果你安装的是来自官方渠道的软件,它通常会被放置在 /usr/bin/;而如果你手动编译了某个软件,或者安装了一个不在官方仓库中的第三方应用,则推荐将其放置在 /usr/local/bin/ 中。这样做的好处是可以更好地管理和维护你的系统。
编写相关的配置文件
由于只是一个二进制文件,现在需要把cri-dockerd作为一个系统启动服务的话,就需要编写cri-docker.service 文件,以便cri-dockerd能被纳入systemd维护中,以及 cri-docker.socket文件,此cri-docker.socket
文件实际上是一个 systemd socket unit 文件,这个文件定义了 systemd 如何管理一个特定的 Unix 域套接字,以便在有连接请求时启动相应的服务.
/usr/lib/systemd/system/cri-docker.service 文件内容
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket #注意这个
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd[这个就是你放cri-dockerd执行文件的地方] --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6[自己根据实际情况填写] --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
/usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=/run/cri-dockerd.sock [这个路径告诉了 系统systemd cri-dockerd的通信地址]
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
这个几个步骤就把准备工作做好了,然后执行
执行
1、systemctl daemon-reload
2、 启动docker
3、systemctl enable cri-docker
systemctl start cri-docker
4、查看状态
systemctl status cri-docker
最后
最后这个cri-docker 是要被k8s使用的,而k8s中和容器调度相关的进程就是kubelet了,那么就要告诉kubelet,用这个cri-docker来和docker进行交互了,需要修改配置文件中的内容: 把参数container-runtime-endpoint 的值改成:
--container-runtime-endpoint unix:///run/crio-docker.sock 如果不用cri-docker,而直接用containerd的话,这个参数就配置成: /run/containerd/containerd.sock。这个sock就是真正的容器运行时嵌套字通信接口文件。