3-2 Containerd 安装和简单使用

更新时间:2022年12月10日

文章目录

    • 简介
    • DNF/APT 安装
      • DNF 安装
        • 准备
        • 安装
      • APT 安装
        • 准备
        • 安装
    • 二进制安装(推荐)
      • 准备
      • 安装 containerd
      • 安装 runc
      • 安装 CNI 插件
      • 验证
    • containerd 配置
    • containerd 客户端工具
      • 对比
      • `ctr`
        • 示例
      • `crictl`
        • 安装
        • 配置
        • 示例
      • `nerdctl`(推荐使用)
        • 安装
        • 示例

简介

官网:containerd

Containerd 是工业级的容器运行时,是从 Docker 中分离出来的底层容器运行时。相比较于 Docker,其设计目的主要是为了嵌入到一个更大的系统中(一般嵌入到Kubernetes),而不是直接由开发人员或终端用户使用

组件构成

Containerd 正常使用需要包含以下几个组件:

  • containerd:主体程序
  • runc:容器运行时
  • CNI pulgins:网络相关插件,提供实现了 CNI 协议的接口

安装方式

Containerd 在 Linux 上安装方式主要有以下两种

  • 二进制安装包安装
  • 包管理器安装(由 Docker 官方提供支持。目前支持 .deb.rpmcontainerd.io 包同时包含 runc ,但不包含 CNI 插件)

DNF/APT 安装

DNF 安装

安装方法参考

  • 清华源安装文档:docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
  • 官方安装文档:Install Docker Engine on CentOS | Docker Documentation

准备

主机列表

主机名 操作系统 IP
contanerd Rocky Linux release 8.7 (Green Obsidian) 192.168.111.181

清除原有的软件

如果过去安装过 docker 或者 containerd,需要先卸载

$ dnf remove -y docker-ce docker-ce-cli containerd.io

推荐安装的依赖

  • device-mapper-persistent-data:Linux 2.6 内核中支持逻辑卷管理的通用设备映射机制(RockyLinux 8 内核为 4.18,可以不安装)
  • lvm2:逻辑卷管理工具(RockyLinux 8 系统默认有安装)
$ dnf install -y device-mapper-persistent-data lvm2

下载仓库文件(CentOS/RHEL)

$ curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

替换仓库为国内源

官方源在国内访问速度较慢,可以替换为国内源(此处列举<清华源>和<阿里源>,选一即可)

# 替换软件仓库为 TUNA
$ sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 替换软件仓库为 ali
$ sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新缓存

$ dnf makecache

安装

**安装最新稳定版本 **

# 安装 containerd.io latest stable(最新稳定)版本
$ dnf install -y containerd.io

安装指定版本

# 查看版本
$ dnf list containerd.io.x86_64 --showduplicates | sort -r
Last metadata expiration check: 0:23:50 ago on Sun 11 Dec 2022 09:21:33 PM EST.
containerd.io.x86_64               1.6.9-3.1.el8                docker-ce-stable
containerd.io.x86_64               1.6.8-3.1.el8                docker-ce-stable
containerd.io.x86_64               1.6.7-3.1.el8                docker-ce-stable
containerd.io.x86_64               1.6.6-3.1.el8                docker-ce-stable
containerd.io.x86_64               1.6.4-3.1.el8                docker-ce-stable
containerd.io.x86_64               1.6.12-3.1.el8               docker-ce-stable
containerd.io.x86_64               1.6.11-3.1.el8               docker-ce-stable
containerd.io.x86_64               1.6.10-3.1.el8               docker-ce-stable
containerd.io.x86_64               1.5.11-3.1.el8               docker-ce-stable
containerd.io.x86_64               1.5.10-3.1.el8               docker-ce-stable
containerd.io.x86_64               1.4.9-3.1.el8                docker-ce-stable
.......

# 安装指定版本 dnf -y install containerd.io-[VERSION].[架构]
$ dnf -y install containerd.io-1.6.12-3.1.el8.x86_64

验证

验证安装的 containerd 版本

$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0

验证安装的 runc 版本

$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d
spec: 1.0.2-dev
go: go1.18.9
libseccomp: 2.5.2

查看 service 文件

$ cat /usr/lib/systemd/system/containerd.service 

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

APT 安装

  • 安装方法参考

    • 清华源安装文档:docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
    • 官方安装文档:Install Docker Engine on Ubuntu | Docker Documentation

准备

主机列表

主机 操作系统 IP
contanerd Ubuntu 22.04.1 LTS 192.168.111.221

清理原有的软件

如果过去安装过 docker 或者 containerd,需要先卸载

$ sudo apt remove -y docker-ce docker-ce-cli containerd.io

安装依赖

  • ca-certificates:证书管理工具(Ubuntu 22 默认已安装)
  • gnupg2:GNU Privacy Guard ( GnuPG 或 GPG ),是一种加密软件,有多个版本(Ubuntu 22 默认已安装 gnupg
  • apt-transport-https:使 apt 支持 https
  • software-properties-common:提供了 apt 的一些简便工具,例如:add-apt-repository
$ sudo apt -y install apt-transport-https ca-certificates software-properties-common gnupg2

配置仓库

此处使用了阿里云的镜像源

信任 Docker 的 GPG 公钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加软件仓库

$ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新缓存

$ apt update

安装

安装最新稳定版本

$ sudo apt install -y containerd.io

安装指定版本

# 查找 containerd 版本
$ apt-cache madison containerd.io
containerd.io |   1.6.12-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |   1.6.11-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |   1.6.10-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |    1.6.9-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |    1.6.8-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |    1.6.7-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |    1.6.6-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |    1.6.4-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |   1.5.11-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
containerd.io |   1.5.10-1 | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
......


# 安装指定版本的 containerd: sudo apt-get -y install containerd.io=[VERSION]
# (VERSION 为上面的 5:19.03.15~3-0~ubuntu-focal)
sudo apt install -y containerd.io=1.6.12-1

验证

验证安装的 containerd 版本

$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0

验证安装的 runc 版本

$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d
spec: 1.0.2-dev
go: go1.18.9
libseccomp: 2.5.3

查看 service 文件

$ cat /usr/lib/systemd/system/containerd.service 
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target


二进制安装(推荐)

参考:containerd downloads

注:

  • containerd 的二进制版本适用于 amd64、arm64、ppc64le、riscv64 架构

  • 二进制安装 containerd 还需要手动安装 runc 和 cni 插件

准备

主机列表

主机 操作系统 IP
contanerd Rocky Linux release 8.7 (Green Obsidian) 192.168.111.221

安装 containerd

从官方 github 地址(https://github.com/containerd/containerd/releases)下载二进制安装包,格式: containerd---.tar.gz。校验 sha256sum 无误后,解压到 /usr/local 目录

# 下载 containerd 二进制包
$ curl -LO https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz

# 解压
$ tar Cxzvf /usr/local containerd-1.6.12-linux-amd64.tar.gz
bin/
bin/ctr
bin/containerd
bin/containerd-shim
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/containerd-shim-runc-v1

containerd 二进制文件是为基于 glibc 的 Linux 发行版(例如 Ubuntu 和 Rocky Linux)动态构建的。所以此二进制文件可能无法在基于 musl 的发行版(如 Alpine Linux)上运行。此类发行版必须从源代码编译或第三方软件包安装 containerd

FAQ:对于 Kubernetes,需要下载 cri-containerd-(cni-)-.tar.gz 吗?

Answer:不需要

由于 Kubernetes CRI 功能已经包含在 containerd---.tar.gz 中,所以不需要额外下载 cri-containerd-(cni-)-.tar.gz 也可以使用 CRI 接口功能

cri-containerd-... 将在 containerd 2.0 中删除

配置 systemd

如果打算通过 systemd 启动 containerd,还需要下载 containerd.service 文件(https://raw.githubusercontent.com/containerd/containerd/main/containerd.service),放置到 /usr/local/lib/systemd/system/containerd.service

# 创建目录
$ mkdir -p /usr/local/lib/systemd/system/

# 下载 service 文件
$ curl -o /usr/local/lib/systemd/system/containerd.service  https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

# 重新加载 service 文件
$ systemctl daemon-reload

安装 runc

从 runc 的官方 github (https://github.com/opencontainers/runc/releases)下载 runc 二进制文件,格式:runc.。校验 sha256sum 无误后,安装到 /usr/local/sbin/runc

# 下载 runc
$ curl -LO https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64

# 安装 runc
$ install -m 755 runc.amd64 /usr/local/sbin/runc

runc 二进制文件是静态构建的,应该可以在任何 Linux 发行版上运行

安装 CNI 插件

从官方 github 地址(https://github.com/containernetworking/plugins/releases)下载 CNI 插件,格式:cni-plugins---.tgz。校验 sha256sum 无误后,解压到目录 /opt/cni/bin

# 下载
$ curl -LO https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz

# 创建目录
$ mkdir -p /opt/cni/bin
# 解压
$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

cni 插件的二进制文件是静态构建的,应该可以在任何 Linux 发行版上运行

验证

# 启动 containerd 并设置开机启动 
$ systemctl enable --now containerd

验证安装的 containerd 版本

$ containerd -v
containerd containerd.io 1.6.12 a05d175400b1145e5e6a735a6710579d181e7fb0

验证安装的 runc 版本

$ runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.17.10
libseccomp: 2.5.4

containerd 配置

配置文件路径:/etc/containerd/config.toml

包管理器安装时,默认会生成配置文件,二进制安装则需要手动生成文件

生成配置文件

# 生成默认配置
$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml


# 设置 sandbox_image 镜像源为阿里云的 google_containers 镜像源
$ sed -ri "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g"  /etc/containerd/config.toml

# 修改 Systemdcgroup
$ sed -ri 's#(SystemdCgroup )= false#\1 = true#g' /etc/containerd/config.toml

# 添加镜像加速配置
$ sed -ri '/registry.mirrors]/a\        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]' /etc/containerd/config.toml
$ sed -ri '/registry.mirrors."docker.io"]/a\          endpoint = ["https://sqr9a2ic.mirror.aliyuncs.com"]' /etc/containerd/config.toml

containerd 客户端工具

对比

Name Community API Target Web site
ctr containerd Native For debugging only (None, see ctr --help to learn the usage)
nerdctl containerd (non-core) Native General-purpose https://github.com/containerd/nerdctl
crictl Kubernetes SIG-node CRI For debugging only https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md

ctr

ctr作为 containerd 项目的一部分,是安装 containerd 时默认提供的命令行客户端,具有镜像和容器管理的简单功能

注:ctr 操作镜像时,需填写完整路径

示例

下载镜像

$ ctr images pull docker.io/library/redis:alpine

查看镜像

$ ctr images ls | awk -F' ' '{print $1,$2}'
REF TYPE
docker.io/library/redis:alpine application/vnd.docker.distribution.manifest.list.v2+json

运行容器

$ ctr run -d docker.io/library/redis:alpine redis

查看运行的容器

$ ctr containers ls
CONTAINER    IMAGE                             RUNTIME                  
redis        docker.io/library/redis:alpine    io.containerd.runc.v2 

$ ctr task ls
TASK     PID      STATUS    
redis    11908    RUNNING

crictl

参考:使用 crictl 对 Kubernetes 节点进行调试 | Kubernetes

工具下载地址:kubernetes-sigs/cri-tools

文档:cri-tools/crictl.md

crictl是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理 kubernetes 节点上的容器运行时和镜像

注:crictl的所有操作均在 k8s.io 这个 namespace 下

安装

# 选择版本下载
$ export VERSION="v1.24.2"
$ curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz

# 解压
$ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
$ rm -f crictl-$VERSION-linux-amd64.tar.gz

配置

连接信息配置

Linux 下,crictl 默认会根据以下顺序来连接容器运行时,如果 sock 配置在其他路径或连接顺序有变化,可以通过 /etc/crictl.yaml 进行配置

  • unix:///var/run/dockershim.sock
  • unix:///run/containerd/containerd.sock
  • unix:///run/crio/crio.sock
  • unix:///var/run/cri-dockerd.sock
$ cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: true
EOF

示例

下载镜像

$ crictl pull alpine:3.17.0

查看镜像

$ crictl images
IMAGE                      TAG                 IMAGE ID            SIZE
docker.io/library/alpine   3.17.0              49176f190c7e9       3.37MB

nerdctl(推荐使用)

官方 github 地址:containerd/nerdctl

nerdctl是一个相对较新的containerd命令行客户端。与ctr不同,nerdctl的目标是对用户友好并且和 docker兼容

依赖的插件

  • CNI plugins:nerdctl v1.1.0 或更高的版本需要通过 CNI 插件来控制网络(nerdctl network create
  • BuildKit (OPTIONAL):需要构建镜像功能时安装(nerdctl build)。参考: the document about setting up BuildKit
  • RootlessKit and slirp4netns (OPTIONAL):以非 root 用户运行容器时安装

安装

# 下载
$ curl -LO https://github.com/containerd/nerdctl/releases/download/v1.1.0/nerdctl-1.1.0-linux-amd64.tar.gz

# 解压
$ tar Cxzvf /usr/local/bin/ nerdctl-1.1.0-linux-amd64.tar.gz

示例

下载镜像

$ nerdctl pull busybox:1.34.1-glibc

查看镜像

$ nerdctl -n "default" images
REPOSITORY    TAG             IMAGE ID        CREATED           PLATFORM       SIZE       BLOB SIZE
busybox       1.34.1-glibc    898fba644d17    22 minutes ago    linux/amd64    4.7 MiB    2.5 MiB

运行容器

$ nerdctl run -it --name busybox busybox:1.34.1-glibc 
/ # 

查看正在运行的容器

$ nerdctl ps
CONTAINER ID    IMAGE                                     COMMAND    CREATED          STATUS    PORTS    NAMES
cea05bf4a6a5    docker.io/library/busybox:1.34.1-glibc    "sh"       1 minutes ago    Up                 busyboxS

你可能感兴趣的:(Containerd,linux,docker,运维)