一、Containerd简介
containerd 是一个开源的容器运行时工具,用于管理和运行容器。它被设计为一个轻量级的容器执行引擎,用于在操作系统层面创建、运行和管理容器。containerd 提供了容器的核心功能,例如容器的生命周期管理、镜像管理、文件系统挂载等,同时也可以与其他容器编排工具(如 Kubernetes、Docker)结合使用。
以下是 containerd 的一些关键特点和功能:
- 轻量级:
containerd被设计为一个相对轻量级的容器运行时,专注于容器的核心功能。它可以作为容器的基础执行引擎,为容器编排工具提供基本的容器管理功能。 - 容器生命周期管理:
containerd负责管理容器的生命周期,包括创建、启动、暂停、恢复、停止和销毁容器等操作。它提供了对容器状态的完整控制。 - 镜像管理:
containerd可以管理容器镜像,包括拉取、保存、上传、删除等操作。它支持 OCI(Open Container Initiative)规范定义的容器镜像格式。 - 文件系统挂载:
containerd允许容器在运行时挂载文件系统,以便容器可以访问宿主机上的文件或目录。 - 事件通知:
containerd支持发布和订阅容器事件,允许用户监控容器状态的变化并采取相应的操作。 - 扩展性:
containerd允许通过插件机制来扩展其功能。这意味着用户可以根据需要添加新的功能,例如网络管理、存储管理等。 - 与容器编排工具集成:
containerd可以与容器编排工具(如 Kubernetes、Docker)集成,作为其底层容器运行时。这使得容器编排工具可以使用containerd的功能来管理容器。
containerd 作为容器运行时工具,提供了容器的核心管理和运行功能。它的设计目标是提供一个通用的容器执行引擎,使得不同的容器编排工具可以共享容器的生命周期管理、镜像管理等基本功能,从而降低了容器技术的复杂性和依赖。
kubernetes官方社区在发布的v1.20版本中声明将弃用 Dockershim,即 Docker 容器运行时接口(CRI),这意味着不再支持 Docker,并将在后续版本中删除。
二、Containerd部署
1、下载分发二进制文件
- 所需组件下载地址:下载最新的二进制包
- 如果下载太慢,那么下载到本地电脑然后上传至服务器
- 注意:经过测试,建议containerd部署v1.6+以上版本,低版本测试发现重启服务器后containerd.soc
原文链接:https://dqzboy.com k文件需要很久才会生成。
[root@k8s-master1 ~]# cd /opt/k8s/work/
[root@k8s-master1 work]# mkdir containerd
[root@k8s-master1 work]# tar -xvf containerd-1.6.0-linux-amd64.tar.gz -C containerd
[root@k8s-master1 work]# tar -xvf crictl-v1.23.0-linux-amd64.tar.gz
[root@k8s-master1 work]# mkdir cni-plugins
[root@k8s-master1 work]# tar -xvf cni-plugins-linux-amd64-v1.0.1.tgz -C cni-plugins
[root@k8s-master1 work]# mv runc.amd64 runc
2、分发二进制程序
- 将程序包分发给
Worker节点 NODE_IPS变量可以在profile中定义worker节点的IP地址数组
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /opt/k8s/bin"
scp containerd/bin/* crictl cni-plugins/* runc root@${node_ip}:/opt/k8s/bin
ssh root@${node_ip} "chmod a+x /opt/k8s/bin/* && mkdir -p /etc/cni/net.d"
done
3、创建和分发 containerd 配置文件
containerd v1.5以下版本使用下面的配置
- 通过下面的指令生成默认的配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
- 注意修改一些配置
- (1) 比如我这里的
root和state所对应的目录路径跟默认的是不一样的,需要我们手动修改 - (2) 修改 sandbox_image = “pause:3.8”镜像的地址,不然使用默认的地址国内环境会下载不下来
- (3) 使用 systemd cgroup 驱动程序,将配置中的
SystemdCgroup改为true - (4) 修改
registry.mirrors配置docker、gcr等国外register对应国内的加速地址 - (5) 如果是跟着我的文档部署的K8s集群,那么下面配置中的
bin_dir需要改为/opt/k8s/bin
- (1) 比如我这里的
[root@k8s-master1 work]# cat << EOF | sudo tee containerd-config.toml
version = 2
root = "/data/k8s/containerd/root"
state = "/data/k8s/containerd/state"
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "pause:3.8"
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/k8s/bin"
conf_dir = "/etc/cni/net.d"
max_conf_num = 1
[plugins."io.containerd.grpc.v1.cri".containerd]
disable_snapshot_annotations = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
sandbox_mode = "podsandbox"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.cri.v1.images".registry]
[plugins."io.containerd.cri.v1.images".registry.mirrors]
[plugins."io.containerd.cri.v1.images".registry.mirrors."docker.io"]
endpoint = ["https://docker hub镜像源地址"]
[plugins."io.containerd.cri.v1.images".registry.mirrors."gcr.io"]
endpoint = ["https://gcr.io镜像源地址"]
EOF
containerd v1.5以上版本使用下面的配置
- 使用
config_path来指定镜像加速源的配置
[root@k8s-master1 work]# cat << EOF | sudo tee containerd-config.toml
version = 2
# 根目录和状态目录
root = "/data/k8s/containerd/root"
state = "/data/k8s/containerd/state"
# gRPC 配置
[grpc]
address = "/run/containerd/containerd.sock"
uid = 0
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
# CRI 插件配置
[plugins."io.containerd.grpc.v1.cri"]
# CNI 配置
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/k8s/bin"
conf_dir = "/etc/cni/net.d"
# containerd 配置
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
default_runtime_name = "runc"
# runc 运行时配置
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# 镜像注册表镜像加速器配置
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
tls_cert_file = ""
tls_key_file = ""
EOF
# 创建注册表配置文件
## Docker
[root@k8s-master1 conf]# cat > docker-hosts.toml <<EOF
server = "https://docker.io"
[host."https://mirror-docker-cqgj.onrender.com"]
capabilities = ["pull", "resolve"]
EOF
## K8s
[root@k8s-master1 conf]# cat > k8s-hosts.toml <<EOF
server = "https://registry.k8s.io"
[host."https://mirror-k8s.onrender.com"]
capabilities = ["pull", "resolve"]
EOF
## Quay
[root@k8s-master1 conf]# cat > quay-hosts.toml <<EOF
server = "https://quay.io"
[host."https://mirror-quay-993l.onrender.com"]
capabilities = ["pull", "resolve"]
EOF
## Gcr
[root@k8s-master1 conf]# cat > gcr-hosts.toml <<EOF
server = "https://gcr.io"
[host."https://mirror-gcr.onrender.com"]
capabilities = ["pull", "resolve"]
EOF
v1.5以下版本,拷贝containerd-config.toml到/etc/containerd/目录下即可
- 分发配置文件至集群各个
worker节点 NODE_IPS变量我是在/etc/profile中定义的各个Worker节点IP数组CONTAINERD_DIR同样也是在/etc/profile中定义的,这里我定义的路径为/data/k8s/containerd
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /etc/containerd/ ${CONTAINERD_DIR}/{root,state}"
scp containerd-config.toml root@${node_ip}:/etc/containerd/config.toml
done
v1.5以上版本需要在/etc/containerd/目录下创建注册表加速源的配置
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /etc/containerd/certs.d/{docker.io,registry.k8s.io,quay.io,gcr.io} ${CONTAINERD_DIR}/{root,state}"
scp containerd-config.toml root@${node_ip}:/etc/containerd/config.toml
scp docker-hosts.toml root@${node_ip}:/etc/containerd/certs.d/docker.io/hosts.toml
scp k8s-hosts.toml root@${node_ip}:/etc/containerd/certs.d/registry.k8s.io/hosts.toml
scp quay-hosts.toml root@${node_ip}:/etc/containerd/certs.d/quay.io/hosts.toml
scp gcr-hosts.toml root@${node_ip}:/etc/containerd/certs.d/gcr.io/hosts.toml
done
4、创建 containerd systemd模板文件
[root@k8s-master1 work]# cat <<EOF | sudo tee containerd.service
[Unit]
Description=Lightweight Kubernetes
Documentation=https://containerd.io
After=network-online.target
[Service]
Environment="PATH=/opt/k8s/bin:/bin:/sbin:/usr/bin:/usr/sbin"
Environment="KUBELET_EXTRA_ARGS=--cgroup-driver=systemd"
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStartPre=-/bin/mkdir -p /run/containerd
ExecStart=/opt/k8s/bin/containerd \\
-c /etc/containerd/config.toml \\
-a /run/containerd/containerd.sock \\
--state /data/k8s/containerd/state \\
--root /data/k8s/containerd/root
KillMode=process
Delegate=yes
OOMScoreAdjust=-999
LimitNOFILE=1024000
LimitNPROC=1024000
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
5、分发 systemd文件并启动服务
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp containerd.service root@${node_ip}:/etc/systemd/system
ssh root@${node_ip} "systemctl enable containerd && systemctl restart containerd"
done
三、部署crictl命令行工具
crictl 是兼容 CRI 容器运行时的命令行工具,提供类似于 docker 命令的功能。具体参考官方文档。
1、创建和分发 crictl 配置文件
[root@k8s-master1 work]# cat << EOF | sudo tee crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
- 分发到所有 worker 节点:
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp crictl.yaml root@${node_ip}:/etc/crictl.yaml
done
2、crictl命令使用
| Containerd命令 | Docker命令 | 功能 |
| crictl image ls | docker images | 获取image信息 |
| crictl image pull nginx | docker pull nginx | pull 一个nginx的image |
| crictl image tag nginx nginx-test | docker tag nginx nginx-test | 给一个nginx的image添加tag |
| crictl image push nginx-test | docker push nginx-test | push nginx-test的image |
| crictl image pull nginx | docker pull nginx | pull 一个nginx的image |
| crictl image import nginx.tar | docker load<nginx.tar.gz | 导入本地镜像ctr不支持压缩 |
| crictl run -d –env dqzboy nginx-test nginx | docker run -d –name=nginx nginx-test | 运行的一个容器 |
| crictl ps | docker ps | 查看运行的容器 |
四、修改kubele使用systemd
- 在kubelet启动配置中追加如下参数,然后重启kubelet
--cgroup-driver=systemd

必须 注册 为本站用户, 登录 后才可以发表评论!