杨梅冲
每天在想什么呢?
随笔 - 198,  文章 - 0,  评论 - 7,  阅读 - 17万

一、containerd简介

复制代码
官 方 文 档 : https://containerd.io

    在 2016 年 12 月 14 日,Docker 公司宣布将containerd 从 Docker 中分离,由开源社区独立发展和运营。Containerd 完全可以单独运行并管理容器,而 Containerd 的主要职责是镜像管理和容器执行。同时,Containerd 提供了 containerd-shim 接口封装层,
向下继续对接 runC 项目,使得容器引擎 Docker Daemon 可以独立升级。 Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。总结一下,它主要负责干以下事情: • 管理容器的生命周期(从创建容器到销毁容器) • 拉取/推送容器镜像 • 存储管理(管理镜像及容器数据的存储) • 调用 runC 运行容器(与 runC 等容器运行时交互) • 管理容器网络接口及网络 1.docker与containerd之间的关系 Docker 包含 Containerd,Containerd 专注于运行时的容器管理,而 Docker 除了容器管理之外,还可以完成镜像构建之类的功能。 Containerd 提供的 API 偏底层,不是给普通用户直接用的,容器编排的开发者才需要Containerd。 2.Containerd 在容器生态中扮演的角色 Containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如 Kubernetes等容器编排系统。 Containerd 以 daemon 的形式运行在系统上,通过 unix domain socket 暴露底层的 grpc API,上层系统可以通过这些 API 管理机器上的容器.

containerd不包含runc,但是运行容器需要runc

cri-container不包含cni,但是运行容器也需要cni plugin

cri-container-cni包含runc,包含cni。需要解压到根目录下

复制代码
复制代码
K8S 为什么要放弃使用 Docker 作为容器运行时,而使用 containerd 呢?
Docker,Kubernetes  等工具来运行一个容器时会调用容器运行时(CRI),比如  containerd,CRI- O,通过容器运行时来完成容器的创建、运行、销毁等实际工作,Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 docker(
在 k8s1.24 版本之前用,1.24 开始废弃了)、containerd, CRI-O 等多种容器运行时,这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行 备注:CRI CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,你需要在集群中的每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod 及其容器。容器运行时接口(CRI)是kubelet 和容器运行时之间通信的主要协议。 OCI: OCI, Open Container Initiative ,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。 OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业
中的其他领导者在 2015 年 6 月的时候启动。 k8s使用containerd具体原因: 如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker, 再通过 Docker 去调用containerd。 如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。 使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。 调用链 Docker 作为 k8s 容器运行时,调用关系如下: kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd Containerd 作为 k8s 容器运行时,调用关系如下: kubelet --> cri plugin(在 containerd 进程中) --> containerd
复制代码

二、containerd安装

复制代码
# 1.安装源和依赖软件包(与docker没区别)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast

# 2.安装containerd
yum install containerd -y
containerd --version # 查看containerd版本

# 3.启动containerd
systemctl start containerd && systemctl enable containerd && systemctl status containerd

# 4.修改contianerd配置文件,配置镜像仓库加速地址
# 直接生产默认配置文件:containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
复制代码
[plugins]
  [plugins.cri]
  [plugins."io.containerd.grpc.v1.cri"]
    # 将镜像下载地址改为阿里云地址
    sandbox_image = "registry.cn- hangzhou.aliyuncs.com/google_containers/pause:3.6"

###自有镜像源配置
    [plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
          endpoint = ["https://pft7f97f.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
        [plugins.cri.registry.mirrors."gcr.io"]
          endpoint = [
            "https://gcr.mirrors.ustc.edu.cn"
          ]
        [plugins.cri.registry.mirrors."k8s.gcr.io"]
          endpoint = [
            "https://gcr.mirrors.ustc.edu.cn/google-containers/"
          ]
        [plugins.cri.registry.mirrors."quay.io"]
          endpoint = [
            "https://quay.mirrors.ustc.edu.cn"
          ]

systemctl daemon-reload && systemctl restart containerd && systemctl status containerd
复制代码

# 5.开启包转发功能和修改内核参数
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

参数生效:sysctl -p
查看: lsmod | grep br_netfilter
复制代码

2.containerd设置私有镜像仓库

复制代码
#1. 找到.registry.configs增加以下内容

[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = ""
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.test.com:6443"]
      endpoint = ["https://harbor.test.com:6443"]
    [plugins."io.containerd.grpc.v1.cri".registry.configs]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".tls]
        insecure_skip_verify = true
      [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".auth]
        username = "name"
        password = "pass"

systemctl restart containerd
最好不要使用别的端口了直接80快速方便
测试:crictl pull harbor.test.com:6443/app:v1
# 拉取镜像命令
ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify

或者
ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify --user=admin:harbor123
复制代码

3.containerd镜像操作

复制代码
命令介绍:
ctr:是containerd本身的CLI
crictl :是Kubernetes社区定义的专门CLI工具

1.查看本地镜像列表
ctr images list  或者 crictl images
查看导入的镜像
ctr images ls 

列表名称:
REF TYPE DIGEST SIZE PLATFORMS LABELS

2.下载镜像命令
ctr images pull docker.io/rancher/mirrored-pause

# 3.上传命令:打标签
ctr images tag  docker.io/docker/alpine:latest  host/test/alping:v1

ctr i tag docker.io/docker/alpine:latest host/test/alping:v1
ctr images pull host/test/alping:v1 
# 4.导入/导出本地镜像
ctr images import app.tar
ctr images exporter
复制代码
[root@node1 ~]# ctr i ls -q
docker.io/library/busybox:1.28
docker.io/library/tomcat:8.5-jre8-alpine

# 导出
[root@node1 ~]# ctr images export busybox-1.28.tar.gz docker.io/library/busybox:1.28

# 删除
[root@node1 ~]# ctr images rm docker.io/library/busybox:1.28  或 ctr i rm docker.io/library/busybox:1.28
docker.io/library/busybox:1.28

# 导入
[root@node1 ~]# ctr images import busybox-1.28.tar.gz 
unpacking docker.io/library/busybox:1.28 (sha256:585093da3a716161ec2b2595011051a90d2f089bc2a25b4a34a18e2cf542527c)...done

# 查看容器名称列表
[root@node1 ~]# ctr i ls -q
docker.io/library/busybox:1.28
docker.io/library/tomcat:8.5-jre8-alpine
复制代码

# 5.显示运行的容器列表
crictl ps

# 6.删除本地镜像
ctr images ls crictl rmi # 没生效可以使用下面这个
ctr i rm REF名称

# 7. 查看容器资源情况 crictl stats

# 8.登录容器平台
crictl exec

# 9.容器启动和停止
crictl start/stop

# 10.查看容器日志
crictl logs
[root@master containerd]# ctr image --help
NAME:
   ctr images - manage images

USAGE:
   ctr images command [command options] [arguments...]

COMMANDS:
   check                    check existing images to ensure all content is available locally
   export                   export images
   import                   import images
   list, ls                 list images known to containerd
   mount                    mount an image to a target path
   unmount                  unmount the image from the target
   pull                     pull an image from a remote
   push                     push an image to a remote
   delete, del, remove, rm  remove one or more images by reference
   tag                      tag an image
   label                    set and clear labels for an image
   convert                  convert an image
复制代码
复制代码
11.查看containerd默认命名空间
[root@moban containerd]# ctr namespace ls
NAME    LABELS 
default        
moby 
ctr 有命名空间 namespace 来指定类似于工作空间的隔离区域。使用方法 ctr -n default images ls来查看 default 命名空间的镜像,不加 -n 参数,默认也是使用 default 的命名空间。

12.查看默认名称空间下镜像
[root@moban containerd]# ctr -n=default images ls
REF                                                           TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                    LABELS 
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 application/vnd.docker.distribution.manifest.list.v2+json sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db 294.7 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 -  
复制代码

4.基于containerd运行容器

复制代码
#基于 containerd 运行一个容器
这里要解释一个概念 containers 和 task ,在 docker 里面 container 概念被弱化 ,将 containers 和 task 整合在一起,基于 docker run 可以运行容器。
ctr 中 containers 是镜像实例化的一个虚拟环境,提供一个磁盘,模拟空间,就好比你电脑处于关机状态一样。
ctr 中 tasks 是将容器运行起来,电脑开机了 ,初始化进程等 ,task 就是的这么个形式。

[root@moban containerd]#  ctr image pull docker.io/library/busybox:latest

# 运行容器
[root@moban containerd]# ctr run -d docker.io/library/busybox:latest busybox-v1

# 查看容器在宿主机的PID
[root@moban containerd]# ctr task ls
TASK          PID     STATUS    
busybox-v1    3914    RUNNING

# 进入容器
[root@moban containerd]# ctr task exec --exec-id 3914 -t busybox-v1 sh
/ # 

# 删除容器
# 可以先停止容器再删除

[root@moban containerd]# ctr task kill --signal 9 busybox-v1
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 4233 STOPPED

# 直接删除

[root@moban containerd]# ctr task rm -f busybox-v1
WARN[0000] task busybox-v1 exit with non-zero exit code 137 
# 容器运行停止
[root@moban containerd]# ctr task ls
TASK    PID    STATUS 
# 查看
[root@moban containerd]# ctr c ls
CONTAINER     IMAGE                               RUNTIME                  
busybox-v1    docker.io/library/busybox:latest    io.containerd.runc.v2 
# 删除
[root@moban containerd]# ctr c rm busybox-v1
复制代码

5.上传镜像

复制代码
# 镜像拉取需要加上参数--all-platform,否则上传时候会出现not found报错
ctr images pull --all-platforms harbor.test.com:6443/tools/busybox:latest

# 1.标签
[root@moban containerd]# ctr images tag docker.io/library/busybox:latest harbor96.9you.com:6443/tools/busybox:v1
harbor96.9you.com:6443/tools/busybox:v1

# 上传
[root@moban containerd]# ctr images push harbor.test.com:6443/tools/busybox:v1 --user=admin:harbor123

ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify
ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify  --user=admin:harbor123
复制代码

 6.镜像加速器第二种添加方式

复制代码
# 修改/etc/containerd/config.toml

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"

cd /etc/containerd/certs.d
cat hosts.toml
[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
  capabilities = ["pull"]

systemctl restart containerd
复制代码

 7.docker与containerd命令比对

 

posted on   杨梅冲  阅读(18163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示