hincky的主页 hincky的主页
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • 容器技术

    • docker

    • k8s

    • helm

    • rancher

    • prometheus

    • grafana

    • containerd

      • 容器管理工具 Containerd
        • 1.0 前言
        • 1.1 Containerd前世今生
        • 1.2 Containerd架构
          • 1.2.1 架构图
          • 1.2.2 常用插件
          • 1.2.3 架构缩略图
          • 1.2.4 与其它容器运行时工具性能对比
      • 安装containerd
        • 2.1 YUM方式安装
          • 2.1.1 获取YUM源
          • 2.1.2 使用yum命令安装
          • 2.1.3 验证安装及启动服务
          • 2.1.4 验证可用性
        • 2.2 二进制方式安装
          • 2.2.1 获取安装包
          • 2.2.2 安装并测试可用性
          • 2.2.2.1 安装containerd
          • 2.2.2.2 查看containerd安装位置
          • 2.2.2.3 复制containerd运行时文件至系统
          • 2.2.2.4 添加containerd.service文件至系统
          • 2.2.2.5 查看containerd使用帮助
          • 2.2.2.6 生成containerd模块配置文件
          • 2.2.2.6.1 生成默认模块配置文件
          • 2.2.2.6.2 替换默认配置文件
          • 2.2.2.7 启动containerd服务并设置开机自启动
          • 2.2.2.8 复制ctr命令至系统
          • 2.2.2.9 查看已安装containerd服务版本
          • 2.2.2.10 安装runC
          • 2.2.2.10.1 获取runC
          • 2.2.2.10.2 安装runC并验证安装结果
      • 镜像管理
        • 3.1 Containerd容器镜像管理命令
        • 3.2 查看镜像
        • 3.3 下载镜像
        • 3.4 镜像挂载
        • 3.5 镜像导出
        • 3.6 镜像删除
        • 3.7 镜像导入
        • 3.8 修改镜像tag
      • 容器管理
        • 4.1 获取命令帮助
          • 4.1.1 获取ctr命令帮助
          • 4.1.2 获取创建静态容器命令帮助
          • 4.1.3 获取动态容器命令帮助
        • 4.2 查看容器
        • 4.3 查看任务
        • 4.4 创建静态容器
        • 4.5 静态容器启动为动态容器
        • 4.6 进入容器操作
        • 4.7 直接运行一个动态容器
        • 4.8 暂停容器
        • 4.9 恢复容器
        • 4.10 停止容器
        • 4.11 删除容器
      • 私有镜像仓库harbor
        • 5.1 Harbor准备
        • 5.2 配置Containerd使用Harbor仓库
          • 5.2.1 Harbor主机名解析
          • 5.2.2 修改Containerd配置文件
          • 5.2.3 ctr下载镜像
          • 5.2.4 ctr上传镜像
      • 命名空间管理
        • 查看帮助
        • ns操作
          • 查看
          • 创建
          • 删除
        • 查看用户进程
        • 查看镜像
        • 创建静态容器
          • 查看容器
        • 与其它Containerd容器共享命名空间
      • 网络管理
        • 7.1 创建CNI网络
          • 7.1.1 获取CNI工具源码
          • 7.1.2 获取CNI Plugins(CNI插件)
          • 7.1.3 准备CNI网络配置文件
          • 7.1.4 生成CNI网络
        • 7.2 为Containerd容器配置网络功能
          • 7.2.1 创建一个容器
          • 7.2.2 进入容器查看其网络情况
          • 7.2.3 获取容器进程ID及其网络命名空间
          • 7.2.4 为指定容器添加网络配置
      • 持久化存储
        • 利用静态容器实现
        • 验证
      • docker集成containerd容器管理
        • 安装docker相关组件
        • 修改docker服务文件
    • jenkins

  • 命令集合

  • 软路由

  • 容量保障技术

  • 运维
  • 容器技术
  • containerd
hincky
2022-11-12
目录

容器管理工具 Containerd

# 1.0 前言

  • 早在2016年3月,Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。

  • containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。

  • containerd以Daemon的形式运行在系统上,通过暴露底层的gRPC API,上层系统可以通过这些API管理机器上的容器。

  • 每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。

  • 对于容器编排服务来说,运行时只需要使用containerd+runC,更加轻量,容易管理。

  • 独立之后containerd的特性演进可以和Docker Engine分开,专注容器运行时管理,可以更稳定。

image-20220218112209583

image-20220218221135407

# 1.1 Containerd前世今生

2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker公司拒绝了;接着Google公司联合RedHat、IBM等公司说服Docker公司把其容器核心技术libcontainer捐给中立社区(OCI,Open Container Intiative),并更名为runC。 为了进一步遏制Docker在未来技术市场影响力,避免在容器市场上Docker一家独大,Google公司带领导RedHat、IBM等成立了CNCF(Cloud Native Computing Fundation)基金会,即云原生计算基金会。CNCF的目标很明确,既然在容器应用领域无法与Docker相抗衡,那就做Google更有经验的技术市场------大规模容器编排应用场景,Google公司把自己内部使用的Brog系统开源------Kubernetes,也就是我们今天所说的云原生技术生态。

2016年Docker公司推出了Docker Swarm,意在一统Docker生态,让Docker既可以实现容器应用管理,也可以实现大规模容器编排,经过近1年左右时间的市场验证后,发现在容器编排方面无法独立抗衡kubernetes,所以Docker公司于2017年正式宣布原生支持Kubernetes,至此,Docker在大规模容器编排应用市场败下阵来,但是Docker依然不甘心失败,把Docker核心依赖Containerd捐给了CNCF,依此说明Docker依旧是一个PaaS平台。

2020年CNCF基金会宣布Kubernetes 1.20版本将不再仅支持Docker容器管理工具,此事的起因主要也与Docker捐给CNCF基金会的Containerd有关,早期为了实现Kubernetes能够使用Docker实现容器管理,专门在Kubernetes组件中集成一个shim(垫片)技术,用来将Kubernetes容器运行时接口(CRI,Container Runntime Interface)调用翻译成Docker的API,这样就可以很好地使用Docker了,但是随着Kubernetes在全球技术市场的广泛应用,有更多的容器管理工具的出现,它们都想能够借助于Kubernetes被用户所使用,所以就提出标准化容器运行时接口,只要适配了这个接口就可以集成到Kubernetes生态当中,所以Kubernetes取消了对shim的维护,并且由于Containerd技术的成功,可以实现无缝对接Kubernetes,所以接下来Kubernetes容器运行时的主角是Containerd。

# 1.2 Containerd架构

# 1.2.1 架构图

Containerd设计的目的是为了嵌入到Kubernetes中使用,它是一个工业级的容器运行时,不提供给开发人员和终端用户直接使用,这样就避免了与Docker产生竞争,但事实上,Containerd已经实现大多数容器管理功能,例如:容器生命周期管理、容器镜像传输和管理、容器存储与网络管理等。

image-20220220093315501

  • Containerd 采用标准的 C/S 架构

    • 服务端通过 GRPC 协议提供稳定的 API
    • 客户端通过调用服务端的 API 进行高级的操作
  • 为了实现解耦,Containerd 将不同的职责划分给不同的组件,每个组件就相当于一个子系统(subsystem)。连接不同子系统的组件被称为模块。

  • Containerd 两大子系统为:

    • Bundle : 在 Containerd 中,Bundle 包含了配置、元数据和根文件系统数据,你可以理解为容器的文件系统。而 Bundle 子系统允许用户从镜像中提取和打包 Bundles。
    • Runtime : Runtime 子系统用来执行 Bundles,比如创建容器。

    其中,每一个子系统的行为都由一个或多个模块协作完成(架构图中的 Core 部分)。每一种类型的模块都以插件的形式集成到 Containerd 中,而且插件之间是相互依赖的。

    例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service Plugin、Metadata Plugin、GC Plugin、Runtime Plugin 等,其中 Service Plugin 又会依赖 Metadata Plugin、GC Plugin 和 Runtime Plugin。每一个小方框都表示一个细分的插件,例如 Metadata Plugin 依赖 Containers Plugin、Content Plugin 等。

# 1.2.2 常用插件

  • Content Plugin : 提供对镜像中可寻址内容的访问,所有不可变的内容都被存储在这里。
  • Snapshot Plugin : 用来管理容器镜像的文件系统快照。镜像中的每一个 layer 都会被解压成文件系统快照,类似于 Docker 中的 graphdriver。
  • Metrics : 暴露各个组件的监控指标。

image-20220220093649732

# 1.2.3 架构缩略图

Containerd 被分为三个大块:Storage、Metadata 和 Runtime

image-20220220093958799

# 1.2.4 与其它容器运行时工具性能对比

这是使用 bucketbench 对 Docker、crio 和 Containerd 的性能测试结果,包括启动、停止和删除容器,以比较它们所耗的时间:

image-20220220095224783

结论: Containerd 在各个方面都表现良好,总体性能优于 Docker 和 crio 。

编辑 (opens new window)
grafana介绍
安装containerd

← grafana介绍 安装containerd→

最近更新
01
人生前期重要的能力
05-17
02
防火墙命令
04-11
03
docker-compose部署mysql主从集群
03-22
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式