杨梅冲
每天在想什么呢?

一、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 2022-09-06 13:20  杨梅冲  阅读(14103)  评论(0编辑  收藏  举报