【云原生】kubernetes弃用docker,containerd风华正茂,何以承载云原生?

news2024/9/9 1:10:13

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Containerd
    • 引言
    • 安装 Containerd
      • 方法一:使用官方二进制文件
      • 方法二:使用包管理器
    • Containerd 的常用命令
      • ctr
      • 停止容器
      • 容器和镜像的高级操作
        • 导出和导入镜像
        • 标签和标签管理
        • 容器快照管理
      • 配置文件详解
      • 结合实际案例:使用 Containerd 部署 Web 应用
      • 深入 Containerd 的高级功能
        • 镜像管理
        • 网络配置
        • 存储卷和持久化存储
        • 安全性和隔离性
        • 监控和日志
      • 结合 Kubernetes 使用 Containerd
      • k8s使用containerd具体原因
    • 总结

Containerd

引言

Containerd 是一个高性能、高度可扩展的容器运行时,由 Docker 团队开发并开源,现已成为 Cloud Native Computing Foundation (CNCF) 的顶级项目之一。Containerd 专注于容器的生命周期管理和资源隔离,支持 OCI (Open Container Initiative) 标准,提供了一套丰富的 API 用于容器的创建、启动、停止和销毁等操作。本文将结合实际案例,详细介绍 containerd 的安装、配置、常用命令及高级功能。

安装 Containerd

方法一:使用官方二进制文件

对于基于 glibc 的系统(如 Ubuntu 或 Rocky Linux),推荐使用官方提供的二进制文件进行安装。以下步骤以 Ubuntu 为例:

  1. 下载 Containerd

    从 GitHub 上下载 containerd 的最新版本(以 v1.3.9 为例):

    cd /home/work
    wget https://github.com/containerd/containerd/releases/download/v1.3.9/containerd-1.3.9-linux-amd64.tar.gz
    
  2. 解压并安装

    将下载的压缩包解压到 /usr/local 目录下:

    sudo tar -C /usr/local -xf containerd-1.3.9-linux-amd64.tar.gz
    

    并将 containerd 的可执行文件链接到 /usr/bin 目录下,方便后续使用:

    sudo ln -s /usr/local/bin/containerd /usr/bin/containerd
    sudo ln -s /usr/local/bin/ctr /usr/bin/ctr
    
  3. 安装 runc

    Containerd 需要调用 runc 来启动容器,因此需先安装 runc。可以通过包管理器安装:

    sudo apt-get update
    sudo apt-get install runc
    
  4. 配置 Containerd

    Containerd 的配置文件默认为 /etc/containerd/config.toml。可以通过以下命令生成一个默认的配置文件:

    sudo mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    

    你可以根据需要修改配置文件中的各项参数。

  5. 将 Containerd 配置为服务

    创建一个 systemd 服务文件来管理 containerd:

    sudo touch /lib/systemd/system/containerd.service
    sudo vi /lib/systemd/system/containerd.service
    

    containerd.service 文件中,添加以下内容:

    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target
    
    [Service]
    ExecStartPre=/sbin/modprobe overlay
    ExecStart=/usr/bin/containerd
    Delegate=yes
    KillMode=process
    LimitNOFILE=1048576
    LimitNPROC=infinity
    LimitCORE=infinity
    
    [Install]
    WantedBy=multi-user.target
    

    保存并退出编辑器,然后重新加载 systemd 配置并启动 containerd 服务:

    sudo systemctl daemon-reload
    sudo systemctl enable containerd.service
    sudo systemctl start containerd.service
    sudo systemctl status containerd.service
    

方法二:使用包管理器

对于某些 Linux 发行版,可以直接使用包管理器安装 containerd。例如,在 Ubuntu 上:

sudo apt-get update
sudo apt-get install containerd.io

Containerd 的常用命令

ctr

ctr 是 containerd 的命令行工具,主要用于调试和简单的容器操作。以下是一些常用的 ctr 命令:

  • 列出所有镜像

    ctr images ls
    
  • 拉取镜像

    ctr image pull docker.io/library/nginx:latest
    
  • 列出所有容器

    ctr containers ls
    
  • 创建并运行容器

    ctr run --rm docker.io/library/nginx:latest nginx nginx -g 'daemon off;'
    

    注意:--rm 参数表示容器退出后自动删除。

  • 停止容器

    ctr 本身不提供直接停止容器的命令,因为容器管理通常通过容器的生命周期钩子(如 Docker 的 docker stop)实现。不过,你可以通过向容器内发送信号或使用 ctr tasks 命令来管理容器的任务(即进程)。

停止容器

虽然 ctr 没有直接的 stop 命令,但你可以通过 ctr tasks kill 命令来向容器的主进程发送信号,通常是 SIGTERM(信号15),来请求容器停止。例如:

# 首先,获取容器的ID或名称
ctr containers ls

# 假设容器的ID是 "your_container_id"
ctr tasks kill your_container_id SIGTERM

# 如果需要强制停止,可以发送 SIGKILL(信号9)
ctr tasks kill your_container_id SIGKILL

容器和镜像的高级操作

导出和导入镜像

虽然 ctr 没有直接的 exportimport 命令,但你可以使用 ctr images exportctr images import 来导出和导入镜像。

  • 导出镜像

    ctr images export -o nginx.tar docker.io/library/nginx:latest
    
  • 导入镜像

    ctr images import nginx.tar
    
标签和标签管理

Containerd 允许你为镜像添加标签,以便更容易地引用它们。然而,ctr 命令行工具没有直接的命令来添加或删除镜像标签。这通常是通过修改镜像的引用或重新拉取带有新标签的镜像来实现的。

容器快照管理

Containerd 使用快照来存储容器的文件系统状态。虽然直接管理这些快照不是 ctr 的主要用例,但了解它们对于理解容器的工作原理和进行故障排除很有帮助。

配置文件详解

Containerd 的配置文件(通常位于 /etc/containerd/config.toml)包含了运行时的各种配置选项,如插件配置、网络配置、存储配置等。以下是一些重要的配置项:

  • 插件配置:Containerd 使用插件系统来扩展其功能,如支持不同的存储驱动程序或网络插件。
  • 网络配置:可以配置 CNI(容器网络接口)插件以管理容器的网络。
  • 存储配置:配置镜像和容器快照的存储位置及使用的存储驱动程序。

结合实际案例:使用 Containerd 部署 Web 应用

假设我们要使用 Containerd 部署一个简单的 Nginx Web 服务器。以下是步骤:

  1. 拉取 Nginx 镜像

    ctr image pull docker.io/library/nginx:latest
    
  2. 创建并运行 Nginx 容器

    ctr run -d --name nginx_web_server docker.io/library/nginx:latest nginx nginx -g 'daemon off;'
    

    这里,-d 参数表示在后台运行容器,--name 用于指定容器的名称。

  3. 验证容器是否正在运行

    ctr containers ls
    

    你应该能看到名为 nginx_web_server 的容器在列表中。

  4. 查看容器日志

    ctr containers logs nginx_web_server
    

    这将显示 Nginx 容器的日志输出。

  5. 停止并删除容器

    ctr tasks kill nginx_web_server SIGTERM
    ctr containers rm nginx_web_server
    

    首先发送 SIGTERM 信号请求 Nginx 优雅地停止,然后删除容器。

通过以上步骤,你已经了解了如何使用 Containerd 来部署和管理一个简单的 Web 应用。Containerd 的强大功能和灵活性使其成为构建云原生应用和服务的理想选择。

深入 Containerd 的高级功能

镜像管理

Containerd 的镜像管理功能非常强大,支持多种存储驱动程序,能够高效地管理大量镜像的存储和检索。

  • 镜像存储驱动:Containerd 支持多种存储驱动,如 overlayfs、btrfs、zfs 等,这些驱动在文件系统层面提供了镜像层的堆叠和管理。你可以通过修改 config.toml 文件中的 [plugins.storage.driver] 部分来选择不同的存储驱动。

  • 镜像清理:随着时间的推移,系统上可能会积累大量不再使用的镜像和快照。Containerd 提供了垃圾回收(GC)机制来自动清理这些不再需要的资源。你可以通过运行 ctr garbage-collect 命令来手动触发垃圾回收,或者配置 Containerd 定期自动执行。

网络配置

Containerd 使用 CNI(Container Network Interface)插件来管理容器的网络。通过配置 CNI 插件,你可以定义容器的网络模式、IP 地址分配策略等。

  • CNI 插件配置:CNI 插件的配置文件通常位于 /etc/cni/net.d/ 目录下。你可以通过修改这些配置文件来定制容器的网络设置。

  • 网络策略:除了基本的网络配置外,你还可以使用网络策略来限制容器之间的网络访问,提高系统的安全性。

存储卷和持久化存储

虽然 Containerd 本身不直接管理存储卷,但它可以与外部存储系统(如 Ceph、NFS、GlusterFS 等)集成,为容器提供持久化存储。

  • 挂载存储卷:在创建容器时,你可以通过 --mount 参数将外部存储卷挂载到容器内部。这样,即使容器被删除,存储卷中的数据也会保留下来。

  • 动态卷管理:对于需要动态创建和销毁存储卷的场景,你可以使用第三方工具(如 Kubernetes 的 CSI 插件)来管理存储卷的生命周期。

安全性和隔离性

Containerd 提供了多种机制来增强容器的安全性和隔离性。

  • SELinux 和 AppArmor:这些安全模块可以在 Linux 系统上提供额外的安全层。通过配置 SELinux 或 AppArmor 策略,你可以限制容器对宿主机的访问权限。

  • 资源限制:Containerd 支持对容器的 CPU、内存、磁盘 I/O 等资源进行限制,以防止单个容器占用过多资源而影响其他容器的运行。

  • 命名空间隔离:Containerd 使用 Linux 命名空间(如 PID、网络、IPC、UTS、用户命名空间等)来隔离容器的进程、网络和文件系统视图。

监控和日志

为了有效地监控和管理容器,Containerd 支持多种监控和日志收集工具。

  • Prometheus 集成:你可以通过 Prometheus 监控 Containerd 的性能指标,如容器创建时间、镜像拉取速度等。

  • 日志收集:虽然 Containerd 本身不提供日志收集功能,但你可以使用第三方日志收集工具(如 Fluentd、Logstash、Fluent Bit 等)来收集容器的日志输出。

结合 Kubernetes 使用 Containerd

Kubernetes 是云原生应用的编排平台,而 Containerd 作为其底层的容器运行时,两者结合使用可以构建高效、可扩展的云原生应用。

  • 集成方式:Kubernetes 通过 CRI(容器运行时接口)与 Containerd 交互。CRI 定义了 Kubernetes 与容器运行时之间的通信协议,使得 Kubernetes 能够管理跨多个节点的容器生命周期。

  • 高级功能:当与 Kubernetes 结合使用时,Containerd 可以利用 Kubernetes 的网络插件(如 Calico、Flannel、Weave Net 等)和存储插件(如 Ceph、Rook、CSI 插件等)来提供复杂的网络配置和持久化存储解决方案。

  • 运维和管理:Kubernetes 提供了丰富的运维和管理工具(如 kubectl、Dashboard、Metrics Server 等),使得运维人员可以轻松地监控、管理和扩展基于 Containerd 的容器化应用。

k8s使用containerd具体原因

Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI),
比如 containerd,CRI- O,通过容器运行时来完成容器的创建、运行、销毁等实际工作,
Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 docker(在 k8s1.24 版本之前用,1.24 开始废弃了)、containerd, CRI-O 等多种容器运行时,这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行。

如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker, 再通过 Dockerd 去调用containerd。
如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。
使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。

调用链
Docker 作为 k8s 容器运行时,调用关系如下:
kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd Containerd 作为 k8s 容器运行时,调用关系如下:
kubelet --> cri plugin(在 containerd 进程中) --> containerd

总结

Containerd 作为云原生计算的核心组件之一,提供了高性能、可扩展的容器运行时解决方案。通过本文的介绍,你应该已经对 Containerd 的安装、配置、常用命令以及高级功能有了深入的了解。无论是单独使用还是与 Kubernetes 结合使用,Containerd 都能够为你提供强大而灵活的容器管理能力。随着云原生技术的不断发展,Containerd 的功能和性能也将持续提升,为构建更加高效、可靠、安全的云原生应用奠定坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA基础 - 泛型

目录 一. 简介 二. 集合泛型 三. 自定义泛型 四. 自定义泛型类和普通类的区别 一. 简介 泛型是 Java 语言中一种强大的特性,它允许在定义类、接口和方法时使用类型参数,从而增加了代码的类型安全性和复用性。 类型安全性: 使用泛型可以…

leetcode日记(60)编辑距离

感觉这题不是按难度划分的而是按代码长度划分的…看了答案才知道怎么做,其实思路很简单,但是特别难想…… 意思是使用动态规划,依次计算由word1的前i个字母到word2的前j个字母要经历的最小变化数。 min D[i][j]min(D[i-1][j]1,D[i][j-1]1,D…

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…

【MIT 6.5840(6.824)学习笔记】Raft

1 脑裂 许多容错系统使用一个单主节点来决定主副本。 MapReduce&#xff1a;由单主节点控制计算复制。GFS&#xff1a;主备复制数据&#xff0c;并由单主节点确定主拷贝的位置。VMware FT&#xff1a;主虚机和备份虚机之间复制指令&#xff0c;需要单点的Test-and-Set服务确认…

[0729] X-CMD 发布 v0.4.3:借助 fzf ,提升用户使用体验

目录 X-CMD 发布 v0.4.3&#x1f50e; ll&#x1f50e; jq&#x1f50e; yq&#x1f50e; man X-CMD 发布 v0.4.3 &#x1f50e; ll 新增 --fzf 子命令 该命令借助 fzf 为用户提供了一种高效查找文件和目录的相关信息的方法&#xff0c;类似于文件管理器。 # 使用 fzf 查找文…

AI智能名片O2O商城小程序源码在社区团购中的应用与红利深度探索

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;社区团购以其独特的商业模式和强大的市场渗透力&#xff0c;成为新零售领域的一股不可忽视的力量。而AI智能名片O2O商城小程序源码&#xff0c;作为技术创新的集大成者&#xff0c;正逐步渗透并深刻改变着社区团购的运作模式和…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

科普文:抽屉合同/协议

抽屉协议是指一种在特定情境下&#xff0c;当事人之间私下签订的、不公开披露的协议。通常情况下&#xff0c;除了协议双方外&#xff0c;其他人并不知道这份协议的存在。这种协议在需要时会被拿出来&#xff0c;因为它已经过双方签字盖章&#xff0c;同样具有法律效应。 背景…

SN65MLVD080使用手册

8通道半双工M-LVDS线路收发器 特性 低压差分30欧姆至55欧姆线路驱动器和接收器&#xff0c;支持信号速率高达250 Mbps&#xff1b;时钟频率高达125 MHz 满足或超过M-LVDS标准TIA/EIA-899多点数据交换规范 受控驱动器输出电压转换时间&#xff0c;提高信号质量 -1V至3.4V共模…

【C++版本】protobuf与gRPC

文章目录 一、Protobuf二、安装以及使用protoc参考 一、Protobuf Google Protocol Buffers&#xff08;protobuf&#xff09;是一种语言中立、平台中立的序列化协议&#xff0c;旨在高效地将结构化数据进行序列化和反序列化。它主要用于通信协议、数据存储和其他需要高效编码和…

【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中&#xff0c;由于传递信号的分析需要&#xff0c;引出了CAN数据帧的ID&#xff0c;长度和数据段的概念&#xff0c;它们都与CAN协议帧相关。CAN协议帧有5种类型&#xff0c;如下表&#xff1a; 而我们当前使用到的是数据帧&#xff0c;故本…

【Qwen-Audio部署实战】Qwen-Audio-Chat模型之FastApi部署实战

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

10 BERT

目录 1 综述 1.1 BERT的核心思想 1.2 BERT的关键技术&#xff1a;预训练阶段 1.3 微调阶段 2 BERT的架构 2.1 输入处理 3. 特征选择/学习模块 BERT 的自注意力过程 4. 预训练任务&#xff1a;同时进行 4.1 Next Sentence Prediction (NSP) 4.2 Masked Language Model…

Url图标实现

Url图标实现 效果如下&#xff1a; 1.引入样式 <link rel"icon" href"favicon.ico"> favicon.ico和对应的html一般需要在同一个目录下&#xff08;同级别&#xff09;。 2.title是用来设置在url页签中显示的名称。 可能存在的问题&#xff1a; …

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…

filament 初使用记录

安装初始化 一、环境准备 官网要的 我安装的 二、下载安装 安装laravel composer create-project --prefer-dist laravel/laravel 项目名称 10.*导入 filament composer require filament/filament注册 filament 管理面板 php artisan filament:install --panels初始化…

KubeSphere部署:(一)环境准备

本文介绍windows系统&#xff0c;安装wsl虚拟机&#xff08;ubuntu&#xff09;&#xff0c;并在ubruntu中配置连接私有harbor及阿里云镜像等。 在确定该方式前&#xff0c;博主也曾尝试过通过安装Docker Desktop的方式&#xff0c;但每次重启电脑之后&#xff0c;docker桌面端…

Photoshop 2023:创意无限的图像编辑神器

Photoshop 2023 是一款专为 Mac 和 Windows 系统设计的强大图像编辑软件&#xff0c;为专业设计师和业余爱好者提供了无与伦比的创作工具和功能。 一、强大的编辑工具 Photoshop 2023 拥有丰富的编辑工具&#xff0c;如选择工具、画笔工具、橡皮擦工具等。其选择工具能够精确…

Matlab编程资源库(14)常微分方程初值问题的数值解法

一、 龙格&#xff0d;库塔法简介 龙格-库塔法&#xff08;Runge-Kutta method&#xff09;是一种常用的数值解微分方程的方法&#xff0c;由德国数学家卡尔龙格&#xff08;Carl Runge&#xff09;和马丁威尔海尔姆库塔&#xff08;Martin Wilhelm Kutta&#xff09;在20世纪…

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端 1 开发 WebSocket 客户端1.1 开发环境1.1.1 为Qt 6安装 websockets1.2 .基于Qt6的 QWebSocket 客户端示例1.2.1 实现 WebSocket 客户端1.2.2 创建 QtQWesocketClient1.2.3 创建QWebsocket对象1.2.3.1 添加…