容器组件概念解析与containerd快速入门

167 阅读6分钟

containerd概述

kubernetes的容器运行时对接示意图

image.png

最新的示意图,取消了docker-shim

image.png

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就完全足够了

image.png

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命令提供基本的镜像和容器操作功能

image.png

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起来之后,会存在containertask两个对象

# 查看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

image.png

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命令对比

命令dockerctr(containerd)crictl(kubernetes)
查看运行的容器docker psctr task ls/ctr container lscrictl ps
查看镜像docker imagesctr image lscrictl images
查看容器日志docker logscrictl logs
查看容器数据信息docker inspectctr container infocrictl inspect
查看容器资源docker statscrictl stats
启动/关闭已有的容器docker start/stopctr task start/killcrictl start/stop
运行一个新的容器docker runctr run无(最小单元为pod)
打标签docker tagctr image tag
创建一个新的容器docker createctr container createcrictl create
导入镜像docker loadctr image import
导出镜像docker savectr image export
删除容器docker rmctr container rmcrictl rm
删除镜像docker rmictr image rmcrictl rmi
拉取镜像docker pullctr image pullctictl pull
推送镜像docker pushctr image push
登录或在容器内部执行命令docker exec无?crictl exec
清空不用的容器docker image prunecrictl rmi --prune