如何在 Ubuntu 22.04 上安装 CRI-O 容器运行时
CRI-O 是 Docker for Kubernetes 的轻量级容器运行时替代方案。它是 Kubernetes CRI(容器运行时接口)的实现,并符合 OCI 运行时(开放容器计划)。 CRI-O 允许 Kubernetes 直接执行容器,无需任何额外的工具或对代码进行调整。
CRI-O 支持多种镜像格式,包括 Docker 镜像格式。还提供管理容器镜像的功能,例如管理镜像层、覆盖文件系统、管理容器进程生命周期、容器的监控和日志记录,还提供资源隔离。
本教程将指导您在 Ubuntu 22.04 服务器上安装 CRI-O 容器运行时。这还包括如何使用 CRI-O 设置 CNI 插件,以及 \cri-tools\ 管理 Pod 和容器的基本用法。
先决条件
在开始之前,您必须满足以下要求:
- Ubuntu 22.04 服务器 - 本指南使用 Ubuntu 服务器,主机名为“server-ubuntu”,服务器 IP 地址为“192.168.5.10”。
- 具有根/管理员权限的非根用户。
安装 CRI-O 容器运行时
CRI-O 可以通过不同的方式安装,通过 APT 命令安装或从源构建和安装 CRI-O。在此示例中,您将通过第三方存储库安装 CRI-O Container Runtime。
在开始安装之前,运行以下命令来设置环境变量“$OS\”和“$CRIO_VERSION\”。对于此示例,我们将为 Ubuntu 22.04 安装 CRI-O v1.24.0。
export OS=xUbuntu_22.04
export CRIO_VERSION=1.24
现在运行以下命令为 Ubuntu 22.04 服务器添加 CRI-O 存储库。
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$CRIO_VERSION/$OS/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION.list
使用以下命令为 CRI-O 存储库添加 GPG 密钥。
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION/$OS/Release.key | sudo apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key add -

现在更新您的 Ubuntu 存储库并刷新包索引。您应该会看到 CRI-O 存储库已添加到您的包索引列表中。
sudo apt update

之后,使用以下命令检查 CRI-O 包版本。如您所见,您将安装最新版本的 CRI-O 软件包 v1.24。
sudo apt info cri-o

现在使用下面的 apt 命令安装 CRI-O 容器运行时。输入Y确认安装并按ENTER继续,安装将开始。
sudo apt install cri-o cri-o-runc

安装完成后,启动 CRI-O 服务并使用下面的 \systemctl\ 命令启用它。
sudo systemctl start crio
sudo systemctl enable crio
最后,使用以下命令检查并验证 CRI-O 服务。您应该会看到 CRI-O 服务已启用并将在系统启动时自动运行。而CRI-O服务的当前状态是运行。
sudo systemctl status crio

安装 CNI(容器网络接口)插件
CRI-O 容器运行时需要 CNI(容器网络接口)。 CNI 插件允许您在容器和 Pod 上设置网络。您将从官方 ubuntu 存储库安装 CNI 插件,并使用 CRI-O 容器运行时对其进行设置。
软件包\containernetworking-plugins\ 主要在 Linux 发行版上可用。要安装它,请运行下面的 apt 命令,安装将开始。
sudo apt install containernetworking-plugins

安装完成后,使用以下命令编辑 CRI-O 配置文件“/etc/crio/crio.conf”。
sudo nano /etc/crio/crio.conf
在“[crio.network]”部分,取消注释“network_dir”和“plugin_dirs”选项。另外,请务必将 CNI 插件目录\/usr/lib/cni/\ 添加到\plugin_dirs\ 选项中。
# The crio.network table containers settings pertaining to the management of
# CNI plugins.
[crio.network]
# The default CNI network name to be selected. If not set or "", then
# CRI-O will pick-up the first one found in network_dir.
# cni_default_network = ""
# Path to the directory where CNI configuration files are located.
network_dir = "/etc/cni/net.d/"
# Paths to directories where CNI plugin binaries are located.
plugin_dirs = [
"/opt/cni/bin/",
"/usr/lib/cni/",
]
完成后,保存并关闭文件。
接下来,删除默认网桥 CNI 配置\/etc/cni/net.d/100-crio-bridge.conf\。然后,将新的网桥 CNI 配置下载到 \/etc/cni/net.d/11-crio-ipv4-bridge.conf\。
新的网桥 CNI 配置将为 Pod 和容器仅启用 IPv4。
rm -f /etc/cni/net.d/100-crio-bridge.conf
sudo curl -fsSLo /etc/cni/net.d/11-crio-ipv4-bridge.conf https://raw.githubusercontent.com/cri-o/cri-o/main/contrib/cni/11-crio-ipv4-bridge.conf

现在重新启动 CRI-O 服务以将新更改应用于 CNI 插件设置。
sudo systemctl restart crio
最后,使用以下命令再次检查并验证 CRI-O 服务。您应该看到 CRI-O 服务正在使用新的网桥 CNI 配置运行。
sudo systemctl status crio

安装 CRI-Tools 包
您已经完成了 CRI-O 容器运行时的安装,现在它使用正确的 CNI 插件运行。现在您将安装 \cri-tools\ 包,其中包含可用于与 CRI-O 容器运行时交互的命令行实用程序 \crictl\。
\cri-tools\ 可与多个容器运行时一起使用,例如 containerd、dockershim、CRI-O 和 cri-dockerd。
运行下面的 apt 命令来安装 \cri-tools\ 包。安装将自动开始。
sudo apt install cri-tools

安装完成后,运行下面的“crictl”命令查看当前的运行时版本。您会看到您当前使用的容器运行时是 CRI-O v1.24。
crictl version
接下来,运行下面的“crictl”命令来检查当前容器运行时和 CNI 网络插件的状态。您应该会看到 CRI-O 容器运行时为“RuntimeReady\”,CNI 插件为“NetworkReady\”。
crictl info

crictl 命令为您的 shell 提供自动完成功能,可以手动生成。在下面运行以下 crictl 命令,将 Bash shell 的命令完成生成到 \/etc/bash_completion.d/crictl\。然后,通过获取 ~/.bashrc 配置文件重新加载当前 Bash 会话。
crictl completion > /etc/bash_completion.d/crictl
source ~/.bashrc
现在运行 \crictl\ 命令并按 TAB 键查看所有可用的命令补全。
crictl TAB

使用 crictl 创建 Pod 和容器
现在 cri-tools 已安装在您的系统上,是时候使用 \crictl\ 命令创建 Pod 沙箱和容器了。在这个例子中,我们将为 Nginx 容器创建一个 Pod。
使用以下命令创建一个新目录 \~/demo\。
mkdir ~/demo/
现在运行以下命令来创建一个新的 JSON 配置文件并为容器定义 Pod 沙箱。
cat <<EOF | tee ~/demo/sandbox_nginx.json
{
"metadata": {
"name": "nginx-sandbox",
"namespace": "default",
"attempt": 1,
"uid": "hdishd83djaidwnduwk28bcsb"
},
"linux": {
},
"log_directory": "/tmp"
}
EOF
使用下面的“crictl”命令运行 Pod 沙箱。您应该会看到 Pod 的随机字符串。
sudo crictl runp ~/demo/sandbox_nginx.json
使用以下命令检查并验证正在运行的 Pod。您应该看到 Pod 沙盒“nginx-sandbox\”,Pod id 为“7b0618800e251\”,状态为“Ready\” ”。
sudo crictl pods

要检查 Pod 的详细信息,请运行下面的“crictl”命令,并确保更改 Pod id。在此示例中,\nginx_sandbox\ pod 的 IP 地址为\10.85.0.3\。
sudo crictl inspectp --output table 7b0618800e251

现在 Pod 沙箱已准备就绪,是时候创建 Nginx 容器了。但首先,您将下载 Nginx 映像。
在下面运行以下 crictl 命令以下载 Nginx 映像。然后,检查并验证可用图像列表。
sudo crictl pull nginx
sudo crictl images

现在运行以下命令创建一个新的 JSON 文件来定义 Nginx 容器。
cat <<EOF | tee ~/demo/container_nginx.json
{
"metadata": {
"name": "nginx"
},
"image":{
"image": "nginx"
},
"log_path":"nginx.0.log",
"linux": {
}
}
EOF
使用下面的 crictl 命令为 Pod 沙箱“7b0618800e251\”创建一个新容器。您应该会看到新 Nginx 容器 ID 的随机字符串。
sudo crictl create 7b0618800e251 ~/demo/container_nginx.json ~/demo/sandbox_nginx.json
使用以下命令启动 Nginx 容器,并确保更改容器 ID。
sudo crictl start 1100498979ee5d3a9cbdb7b8b8f18529a01298f2bb57f7fcd01f54dd5a0f8746
之后,使用以下命令检查并验证正在运行的容器。您应该看到 Nginx 容器在 Pod \7b0618800e251\ 中\Running\。
sudo crictl ps

最后,您可以通过 Pod 沙箱“nginx_sandbox”的 IP 地址访问 Nginx 容器。对\nginx_sandbox\ IP 地址\10.85.0.3\ 运行curl 命令,您将看到您的Nginx 容器的默认index.html 页面。
curl 10.85.0.3

结论
您现在已经在 Ubuntu 22.04 服务器上完成了带有 CNI 插件的 CRI-O 容器运行时的安装和配置。您现在可以将其用作 Kubernetes 集群的容器运行时。您还了解了使用 CRI-O 容器运行时创建 Pod 和容器的“crictl”命令的基本用法。