containerd概述
kubernetes的容器运行时对接示意图
最新的示意图,取消了docker-shim
OCI
OCI,Open Container Initiative,
OCI目前包括两个标准
- runtime-spec:容器运行时标准
- image-spec:容器镜像标准
runC
RunC是一个轻量级工具,是用来运行容器的,可以理解为实现了OCI定义的接口工具
CRI-O
除了containerd,CRI-O是另一个实现了容器运行时接口CRI的容器运行时
docker
docker引擎部分封装了Containerd
CRI
容器运行时接口,时kubernetes用来控制和管理不同运行时的API,只要容器运行时能够对接这个CRI接口,那么这个容器运行时就能够被kubernets使用
docker-shim
最开始docker没有kubernetes所依赖的CRI接口,所以kubernetes中包括了一个叫docker-shim的组件,用来支持docker,现在已经被移除了
docker-shim可以理解为kubernets与docker之间的一个翻译官
kubernetes使用docker方案
docker1.24版本开始不使用docker作为运行时
但是如果要使用docker作为运行时,可以在kubernetes和docker之间加一个cri-dockerd来作为中间的翻译
Containerd
Containerd是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性
Containerd被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。
Containerd可以调用runC来运行容器(与runC等容器运行时交互),Containerd封装了runC
真正容器相关的操作其实containerd就完全足够了
containerd安装
apt安装方式默认安装了runc,不需要再重复安装
# 更新apt
sudo apt-get update
# 安装依赖
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d
# 更换阿里源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 安装containerd
sudo apt-get install -y containerd.io
让runc使用system cgroup驱动,对容器进行资源划分隔离
# 生成默认配置
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
SystemdCgroup = true
配置镜像加速
vim /etc/containerd/config.toml
在 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 后面添加镜像,注意前面的缩进(空格)
配置docker.io的示例
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://hnkfbj7x.mirror.aliyuncs.com"]
配置k8s.gcr.io的示例
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://registry.aliyuncs.com/k8sxio"]配置私有harbor镜像仓库示例
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."local.harbor.top"] endpoint = ["https://local.harbor.top"]如果配置了harbor镜像仓库,还需要在
[plugins."io.containerd.grpc.v1.cri".registry.configs]后面配置登录信息[plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."local.harbor.top".tls] insecure_skip_verify = true ca_file = "/etc/docker/certs.d/local.harbor.top/ca.crt" [plugins."io.containerd.grpc.v1.cri".registry.configs."local.harbor.top".auth] username = "admin" password = "Harbor12345"
重启服务
systemctl restart containerd
ctr
containerd默认提供cli命令行工具ctr,ctr命令提供基本的镜像和容器操作功能
ctr支持的namespace不是k8s中的namespace,而是containerd中的namespace,一个namespace中的镜像和容器等资源,在另一个namespace中看不到,默认情况下操作的都是default命名空间中的资源,(k8s.io集群中的资源放在k8s.io这个namespace中)
可以使用-n namespace来指定,也可以使用ctr namespace ls查看有哪些namespace
ctr基本使用
查看镜像
ctr image ls
查看namespace为k8s.io的镜像
ctr -n k8s.io image ls
拉取/推送/tag镜像
# ctr拉取镜像需要指定全路径
ctr image pull docker.io/library/nginx:1.24
# 指定namespace为k8s.io,表示操作的是k8s集群中的资源
ctr -n k8s.io image pull --all-platforms docker.io/library/nginx:1.24
# 有时报错digest not found,加上参数--all-platforms,表示下载所有平台的镜像,# 或者直接指定平台--platform linux/amd64
# 有时报错不支持https,需要添加参数--plain-http
# tag
ctr image tag docker.io/library/nginx:1.24 ip:5000/nginx:1.24
# 推送
ctr image push ip:5000/nginx:1.24
删除镜像
ctr -n k8s.io image rm docker.io/library/nginx:1.24
导入/导出镜像
# 导出镜像
ctr -n k8s.io image export --all-platforms lab.tar docker.io/library/nginx:1.24
# 导入镜像
ctr -n k8s.io image import --all-platforms lab.tar
查看容器
container和task有区别
container对象是指包含了一个容器所需要的资源及配置的数据结构,并没有处于运行状态,是一个静态容器 这个时候namespace、rootfs和容器的配置都已经初始化成功了task是指container对象运行起来后的表示crt task start [container_name]会真正启动一个容器容器真正run起来之后,会存在
container和task两个对象
# 查看container对象
ctr container ls
# 查看task对象,可以看到运行状态
ctr task ls
启动容器方案1
# 步骤1.先创建名为lab_container的container对象
ctr container create docker.io/library/nginx:1.24 lab_container
# 步骤2.再执行ctr task star才会真正启动一个容器,-d等同于docker run的-d
ctr task start -d lab_container
启动容器方案2
ctr run -d docker.io/library/nginx:1.24 lab_container2
删除容器
# 步骤1.先kill掉task对象
ctr task kill lab_container
# 步骤2.再rm掉container对象
ctr container rm lab_container
进入容器
# 必须要指定--exec-id参数,这个id可以随便写,只要唯一就行。
ctr task exec -exec-id 0 -t <task_name> /bin/bash
# 示例:ctr task exec -exec-id 0 -t lab_container2 sh
ctr命令大全
https://blog.csdn.net/qq_30614345/article/details/131873013
crictl
crictl是k8s cri-tool的一部分,是专门为k8s使用containerd制作的命令工具
使用非k8s创建的容器等资源,使用crictl无法看到,比如ctr命令在未指定namespace情况下创建的资源,crictl无法看到
crictl安装
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz
tar -zxvf crictl-v1.28.0-linux-amd64.tar.gz -C /usr/local/bin
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
查看配置
crictl info
crictl基本使用
查看k8s中的镜像
crictl image
拉取镜像,从哪里拉取是看上面containerd配置文件中设置的什么镜像源
crictl pull nginx:1.24
删除镜像
crictl rmi nginx:1.24
查看容器
crictl ps
crictl ps -a
启动容器,无法直接启动容器,需要pod和container配置文件
crictl run <container-config.[yaml|json]> <pod.config.[yaml|json]>
删除容器
# 步骤1.先停掉container
crictl stop <container_id>
# 步骤2.再rm掉contianer
crictl rm <container_id>
docker\ctr\crictl命令对比
| 命令 | docker | ctr(containerd) | crictl(kubernetes) |
|---|---|---|---|
| 查看运行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps |
| 查看镜像 | docker images | ctr image ls | crictl images |
| 查看容器日志 | docker logs | 无 | crictl logs |
| 查看容器数据信息 | docker inspect | ctr container info | crictl inspect |
| 查看容器资源 | docker stats | 无 | crictl stats |
| 启动/关闭已有的容器 | docker start/stop | ctr task start/kill | crictl start/stop |
| 运行一个新的容器 | docker run | ctr run | 无(最小单元为pod) |
| 打标签 | docker tag | ctr image tag | 无 |
| 创建一个新的容器 | docker create | ctr container create | crictl create |
| 导入镜像 | docker load | ctr image import | 无 |
| 导出镜像 | docker save | ctr image export | 无 |
| 删除容器 | docker rm | ctr container rm | crictl rm |
| 删除镜像 | docker rmi | ctr image rm | crictl rmi |
| 拉取镜像 | docker pull | ctr image pull | ctictl pull |
| 推送镜像 | docker push | ctr image push | 无 |
| 登录或在容器内部执行命令 | docker exec | 无? | crictl exec |
| 清空不用的容器 | docker image prune | 无 | crictl rmi --prune |