k8s为什么放弃docker?
k8s是今天容器编排领域的执行标准,而Docker从诞生为止在容器领域都扮演着举足轻重的地位,也都是k8s中默认的Container Runtime(容器运行时),而在2020年12月,k8s社区决定在k8s1.24版本中移除Dockershim 相关代码,这对于k8s和Docker来说都意义重大;

如上图所示,CRI接口(Container Runtime Interface)是k8s在1.5版本中引入的新接口,为了方便k8s通过这个接口使用各种容器运行时(例如:docker、Containerd、CRI-O);
但是Docker 没有支持k8s的CRI接口,k8s为了能够使用Docker实现容器管理,专门在k8s代码中增加一个Dockershim,k8s通过Dockershim将请求转发给Docker从而进行容器的管理;
Containerd介绍
Containerd 最初是 Docker 的一个核心组件,负责底层容器管理,例如:创建容器、启动容器、停止容器、删除容器等;
2016年Docker 把 containerd 捐献给了 CNCF 管理,目标是作为一个独立的开源项目独立发展,提供一个更加开放、稳定的容器运行基础设施;
下面是containerd的一些核心概念:
命名空间(Namespace):它是Linux内核的一个特性,用于隔离各个进程的资源,如网络、文件系统、进程等;
控制组(Cgroup):它是Linux内核的另一个特性,用于限制进程的资源使用量,如CPU、内存、磁盘IO等;
镜像(Image):它是一个文件或一组文件,包含了运行容器所需的环境及应用程序;
容器(Container):它是从镜像创建出来的运行实例,具有独立的命名空间和控制组;
在containerd中,容器生命周期的管理涉及以下几个步骤:
创建容器:根据指定的镜像创建一个容器;
容器的状态管理:containerd会记录容器的状态,如正在运行、已停止、已删除等;
容器的资源管理:containerd可以为容器分配资源,如CPU、内存等;
容器的网络管理:containerd可以为容器配置网络;
容器的文件系统管理:containerd可以管理容器的文件系统,挂载点等;
容器的删除:删除不再需要的容器;
容器的日志记录:容器日志记录,可以帮助用户更好地了解容器的运行状态和问题;
Containerd安装方式
安装containerd可以直接使用docker的yum源,本次使用阿里源来进行安装;
以下是在CentOS或RHEL上使用yum安装containerd的步骤:
添加阿里的Base仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo1.添加containerd的yum仓库
tee /etc/yum.repos.d/containerd.repo <<EOF
[containerd]
name=containerd
baseurl=https://download.docker.com/linux/centos/7/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
EOF2.安装containerd
#安装containerd
yum install containerd.io-1.6.20-3.1.el7.x86_64 -y3.启动containerd
systemctl start containerd
systemctl enable containerdContainerd命令介绍
单机版containerd使用ctr命令管理容器和镜像;
k8s中containerd使用crictl命令管理容器镜像;
以下是一个简单的containerd与Docker命令对比:
Containerd镜像管理
以下是 containerd 常用的管理镜像命令,这些命令涵盖了镜像的查看、拉取、导入、导出、删除等常用操作。
containerd拉取镜像方式
可以使用 ctr images pull <镜像名称> 命令来拉取镜像,其中 <镜像名称> 可以是完整的镜像名称,也可以是不带标签的镜像名称;
containerd 支持从多个平台拉取镜像,多个平台指的是镜像支持在多种CPU架构运行,包括:
amd64(64 位 x86 架构)
armv6、armv7 和 arm64(ARM 架构)
ppc64le(IBM Power 架构)
通过支持多个平台的方式拉取镜像,可以轻松实现跨平台容器的部署和迁移。
例如,如果要拉取 Docker Hub 上的 nginx 镜像,且支持多个平台的镜像,命令格式如下:
ctr images pull docker.io/library/nginx:1.20.1 --all-platforms
#解释
--all-platforms #用来表示支持在所有CPU架构运行,拉取镜像时,如果不加该参数,镜像导出后,无法再次导入到系统containerd查看镜像基本信息方式
可以使用 ctr images list 命令来查看本地已经下载的镜像,命令格式如下:
#列出本地所有已下载的镜像,包括它们的名称、标签、大小等信息
ctr images list
#解释:
REF #镜像的来源及镜像完整名称(包括镜像仓库名称、镜像名称和标签)
TYPE #镜像的类型,独有的一种记录方式,描述了一个Docker镜像的各种组成部分
DIGEST #镜像的摘要信息,是一个唯一的标识符,可以用于验证镜像的完整性
SIZE #镜像的大小
PLATFORMS #镜像支持的平台架构列表,多个架构之间用逗号分隔
LABELS #镜像的标签列表,-表示没有额外的标签
#或者使用
ctr images ls
#或者使用
ctr i ls
#使用-q(--quiet)选项可以只打印镜像名称
ctr images list -q
#或者使用
ctr i ls -qcontainerd检测镜像可用性方式
可以使用ctr images check 命令用于检查镜像是否可以被使用,它会对镜像进行验证并输出一些有用的信息,命令格式如下:
#主要查看其中的STATUS字段,如果是complete表示镜像是完整可用的状态
ctr i checkcontainerd挂载镜像到宿主机方式
可以使用 ctr images mount 命令用于将指定的镜像挂载到宿主机指定的目录下,以便可以访问镜像的文件系统内容,或者提取其中的文件,命令格式如下:
提示: 并不是用来修改镜像配置, 这个命令的主要功能是将镜像的层解压并挂载到指定目录。
#将nginx镜像挂载到宿主机/opt目录
ctr i mount docker.io/library/nginx:1.20.1 /opt
#查看/opt目录
ls /opt/etc/nginx
#卸载镜像
umount /optcontainerd将指定镜像导出为tar文件方式
可以使用 ctr image export 命令将 containerd 中的指定镜像导出为 tar 归档文件,导出的 tar 文件包含镜像的所有层,可以用于备份镜像、在其他主机上导入镜像或者分享给他人使用,命令格式如下:
ctr i export nginx-1.20.1.tar docker.io/library/nginx:1.20.1 --all-platforms
#提示:导出镜像时,如果不加--all-platforms参数,镜像无法再次导入到系统containerd删除镜像方式
可以使用 ctr images remove 命令删除 containerd 中的指定镜像,如果已经使用该镜像创建了容器,需要先删除该容器,在删除镜像,命令格式如下:
#如果需要删除多个镜像,可以在命令行中指定多个镜像名称
ctr i remove docker.io/library/nginx:1.20.1
#或者使用
ctr i rm
#或者使用
crt i deletecontainerd导入镜像方式
可以使用 ctr image import 命令将本地的镜像 tar 归档文件导入到 containerd 中,命令格式如下:
#导入镜像
ctr i import nginx-1.20.1.tar
#查看镜像
ctr i lscontainerd修改镜像tag方式
镜像的标签主要用来描述镜像的一些基本信息,例如:镜像的版本、作者、供应商、URL、文档和许可证等信息,要修改 containerd 中的镜像标签(tag),可以使用 ctr images tag 命令
命令格式: ctr images tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
#修改nginx镜像标签
ctr i tag docker.io/library/nginx:1.20.1 nginx:1.20.1
#查看镜像
ctr i ls -qContainerd容器管理
以下是 containerd 常用的管理容器命令,这些命令涵盖了容器的创建、启动、停止、删除、查看等常用操作。
containerd创建容器方式
使用 ctr containers create创建容器,例如,根据 docker.io/library/nginx:1.20.1 镜像创建一个名为 nginx 的容器
ctr c create docker.io/library/nginx:1.20.1 nginx01containerd查看容器方式
使用ctr containers list查看所有当前存在的容器及其状态
ctr c ls
CONTAINER IMAGE RUNTIME
nginx01 docker.io/library/nginx:1.20.1 io.containerd.runc.v2提示: ctr containerd create 这个命令用于创建一个新的容器实例,但并不启动容器。在执行此命令时,会创建容器的文件系统、网络等配置,但容器内的进程不会运行。
containerd启动容器任务方式
containerd 将容器内正在运行的进程称为任务(task) 创建容器后,可以通过 ctr task start 来启动容器中的任务,-d 后台启动
ctr t start -d nginx01containerd查看容器任务方式
ctr task list 用于列出所有当前运行或已停止的容器任务
ctr t ls
TASK PID STATUS
nginx01 9629 RUNNING
#解释:
Task ID:任务的唯一标识符,与容器名称相同。
PID:任务在宿主机上的进程 ID。
Status:任务的当前状态,如 "RUNNING"(正在运行)或 "STOPPED"(已停止)。提示:容器任务运行时,无法直接删除容器,如需删除,需要先停止容器中的任务。
containerd暂停容器任务方式
ctr task pause 用于暂停正在运行的容器任务,当容器任务被暂停时,其中的所有进程都会被冻结,不会消耗 CPU,临时停止容器的运行,以便进行调试、监控或其他操作
ctr t pause nginx01
#查看容器任务状态
ctr t ls
TASK PID STATUS
nginx01 10226 PAUSED #任务状态为STOPPED(暂停)提示:容器任务暂停时,无法直接删除容器,如需删除,需要先停止掉容器中的任务。
containerd恢复容器任务方式
ctr task resume 用于恢复先前被暂停的容器任务,当容器任务被恢复时,其中的所有进程将重新开始运行,消耗 CPU
ctr t resume nginx01
#查看容器任务状态
ctr t ls
TASK PID STATUS
nginx01 10226 RUNNING #任务状态为RUNNING(运行)containerd终止容器内的任务方式
ctr task kill 用于向容器中的主进程发送指定信号,以便终止容器中的任务
ctr t kill nginx01
#查看容器任务状态
ctr t ls
TASK PID STATUS
nginx01 9817 STOPPED #任务状态为STOPPED(停止),此状态的任务无法再次重启,如果需要重启,需要先删除任务,在重新启动任务。提示:此时可以通过 ctr c rm nginx01 删除该任务所对应的容器,如果只想删除该任务,并不想删除该任务的容器,通过以下方法。
containerd删除容器内的任务方式
ctr task delete 用于删除已经终止的容器任务( 只能删除已经终止的任务 )
ctr t delete nginx01提示:容器并没有备删除
containerd删除容器的方式
ctr containers rm 用于删除已停止的任务容器,无法删除运行的任务容器
ctr c rm nginx01containerd创建容器并立即启动容器中的任务方式
ctr run命令用于创建并启动一个新的容器,与 ctr c create 不同,ctr run 在创建容器后会立即启动容器中的进程, 此命令用于那些不需要在启动容器进程之前进行任何配置的情况下使用
ctr run -d docker.io/library/nginx:1.20.1 nginx01
#查看容器任务状态
ctr t ls
TASK PID STATUS
nginx01 20673 RUNNINGcontainerd进入容器方式
ctr task exec 用于进入到一个已经运行的容器内部
选项说明:
-t#用于在容器中分配一个命令终端;--exec-id#用于指定一个唯一的标识符(ID),可以理解为用户在进入容器时的一个编号,此 编号在同一个容器中是唯一的,如果该ID已经被占用,其他用户无法重复使用(退出容器后ID消失);/bin/bash#执行命令的解释器;
例如:进入名为 nginx01 的容器中,并使用唯一的 exec ID 123 ,可以使用以下命令:
ctr t exec -t --exec-id 123 nginx01 /bin/bash提示:无法进入被暂停的容器,和未运行任务的容器。
containerd列出容器中的所有任务方式
ctr task ps 用于列出一个容器中的所有任务,包括主进程(容器中的初始进程)以及通过 ctr task exec 在容器中启动的其他任务
ctr t ps nginx01containerd创建带有网络的容器方式
containerd自身并不具备为容器提供网络的能力,默认Containerd管理的容器仅有lo网络,如果容器需要配置网络,需要结合CNI(Container Network Interface)插件为容器配置网络。也可以让容器共享主机的网络。
选项说明: --net-host 设置容器的网络模式为主机模式,使容器直接使用宿主机的网卡和IP地址
ctr run -d --net-host docker.io/library/nginx:1.20.1 nginx02
#进入容器查看网络
ctr t exec -t --exec-id 123 nginx02 /bin/bash
#查看网络
ifconfig
#提示:如果没有ifconfig命令,通过以下方式安装
apt update
apt install net-toolsContainerd命名空间管理
在 co
命名空间在 containerd 中的作用如下:
隔离:命名空间可以将容器、镜像、快照等资源在同一个主机中进行隔离,这些资源对其他命名空间不可见,防止资源之间的冲突;
多用户支持:每个用户可以在自己的命名空间中管理自己负责的资源,而不会影响其他用户;
资源分组管理:例如,可以为每个项目或应用程序创建一个单独的命名空间,防止管理混乱的现象;
containerd命名空间管理命令
containerd查看命名空间方式
ctr ns ls
NAME LABELS
default
#解释:
NAME #名称,default是默认命名空间
LABELS #标签containerd创建命名空间方式
ctr ns create k8s.io
ctr ns ls
NAME LABELS
default
k8s.io如果需要在指定的名称空间管理资源(如创建容器、拉取镜像等) 需要使用 --namespace(或 -n)选项指定命名空间
#例如:拉取镜像到k8s.io空间
ctr -n k8s.io i pull docker.io/library/nginx:1.20.1
#例如:查看k8s.io空间镜像
ctr -n k8s.io i ls
#例如:在k8s.io空间创建容器
ctr -n k8s.io run -d docker.io/library/nginx:1.20.1 nginx01
#例如:查看K8s.io空间容器
ctr -n k8s.io c ls
#例如:查看k8s.io空间任务容器
ctr -n k8s.io t ls
#例如:进入k8s.io空间下的容器内部
ctr -n k8s.io t exec -t --exec-id 1 nginx01 /bin/bash
#例如:终止k8s.io空间下的任务容器
ctr -n k8s.io t kill nginx01
#例如:删除k8s.io空间下的容器
ctr -n k8s.io c rm nginx01
#例如:删除k8s.io空间下的镜像
ctr -n k8s.io i rm docker.io/library/nginx:1.20.1containerd删除命名空间方式
ctr ns remove k8s.io总结:Containerd虽然已经实现了大多数容器的管理功能,但在实际生产环境中,Containerd很少单独出现(功能有限、配置繁琐),其设计目的是为了嵌入到Kubernetes中使用,Kubernetes在底层使用containerd实现容器的管理,而Kubernetes提供了更丰富的功能和更易于用户使用的命令。
评论区