【云原生】kubernetes弃用docker之后,containerd何以承载云原生?

news2024/12/22 10:56:49

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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/1970793.html

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

相关文章

Mac OS平台,利用 gifify 制作gif教程

一、前言 在很多时候都会用到视频的方式才能直观的表达想表达的东西, 但是视频的文件太大了,所以gif是一个很不错的选择,在网上找了很多免费的都不好用, 最理想的还是直接快捷键唤起,然后选择录制区域,保存…

[CR]厚云填补_GridDehazeNet

GridDehazeNet: Attention-Based Multi-Scale Network for Image Dehazing Abstract 我们提出了一个端到端的可训练卷积神经网络(CNN),命名为GridDehazeNet,用于单幅图像去雾。GridDehazeNet由预处理、主干网络和后处理三个模块组成。与手工选择的预处理…

Go语言---linux下安装golang protoc详细教程以及完整安装protoc-gen-go工具

在[分布式网络通讯框架]----Protobuf安装配置–附带每一步截图中,我们详细介绍了Protobuf是什么,为什么要使用Protobuf,以及在linux环境中,如何安装Protobuf。Protobuf 在 .proto 定义需要处理的结构化数据,可以通过 p…

Surya - OCR、布局分析、阅读顺序、语言检测

文章目录 一、关于 Surya功能特性例子训练托管API商业用途 二、安装手动安装 三、用法1、交互应用2、OCR(文本识别)来自 python编译 3、文本行检测From python 4、布局分析From python 5、阅读顺序From python 四、限制五、故障排除六、基准测试OCRGoogl…

react引入高德地图并初始化卫星地图

react引入高德地图并初始化卫星地图 1.安装依赖 yarn add react-amap amap/amap-jsapi-loader2.初始化地图 import AMapLoader from "amap/amap-jsapi-loader"; import { FC, useEffect, useRef, useState } from "react";const HomeRight () > {con…

高速总线概述(二):高速总线技术要点(比特流高速数据传输,编、解码、CRC校验及扰码结构,链路同步)

前言: 读 嵌入式高速串行总线技术 基于FPGA实现与应用_张峰 记 高速串行总线技术技术点 高速串行总线技术点 (1)采用串行比特流实现高速数据传输,数据以帧格式进行传输,以帧头(SOF)、…

串口调试可能遇见的常见问题和排查方法

串口UART作为嵌入式应用和通讯领域中最常用的接口之一,接口协议虽然简单,但在实际应 用中不同设备之间的通讯也会存在各种小问题,下面对使用中各种常见的问题做下总结和梳 理,可作为调试参考。 01串口通信常见问题 串口通信乱码…

嵌入式多线程

作业一&#xff1a; 使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include <myhead.h> #define BUF_SIZE 10 //定义缓冲区大小typedef struct{char* sfile;char* tfile…

springboot系列教程(三十一):springboot整合Nacos组件,环境搭建和入门案例详解

一、Nacos基础简介 1、概念简介 Nacos 是构建以“服务”为中心的现代应用架构&#xff0c;如微服务范式、云原生范式等服务基础设施。聚焦于发现、配置和管理微服务。Nacos提供一组简单易用的特性集&#xff0c;帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管…

MySQL高阶(九)——窗口函数

文章目录 MySQL高阶(九)——窗口函数特点语法结构窗口函数分类准备数据 序号函数聚合函数分布函数CUME_DIST&#xff08;累计分布值&#xff09;PERCENT_RANK &#xff08;等级值&#xff09; 前后函数LAG函数LEAD函数 头尾函数FIRST_VALUE和LAST_VALUENTH_VALUE(expr, n&#…

贪心(区间)

905. 区间选点 - AcWing题库 #include<bits/stdc.h> using namespace std; const int N1e510;struct Range {int l,r;bool operator <(const Range&m)const{return r<m.r;} }range[N];int main() {int n;cin>>n;for(int i0;i<n;i){cin>>range[…

汉诺塔(C++)

解决汉诺塔问题是程序递归思想最基本的体现&#xff0c;问题以及规则如下&#xff1a; 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上…

测评自养号与机刷:电商平台推广的深度解析与区别探讨

在电商平台上&#xff0c;产品和店铺的评价至关重要&#xff0c;许多买家在购买前都会仔细查看评论&#xff0c;比较同类产品的口碑&#xff0c;以便做出明智的选择。今天&#xff0c;我们将探讨测评自养号与机刷之间的区别。 测评一直是各大电商平台常用的推广手段&#xff0c…

心算项目攻略:最大化卡牌得分技巧

目录 题目描述代码逻辑原理总结解析&#xff1a;代码逻辑&#xff1a;示例场景&#xff1a;总结&#xff1a; 题目 选自力扣 心算项目的挑战比赛中&#xff0c;要求选手从 N 张卡牌中选出 cnt 张卡牌&#xff0c;若这 cnt 张卡牌数字总和为偶数&#xff0c;则选手成绩「有效」…

AI绘画工具推荐:Stable Diffusion的新境界

前言 在AI绘画的世界里&#xff0c;Stable Diffusion无疑是一颗璀璨的明星。然而&#xff0c;对于许多用户来说&#xff0c;切换不同的UI界面和管理众多模型是一项挑战。今天&#xff0c;我们为大家介绍一款革命性的工具——Stability Matrix&#xff0c;它将彻底改变你对Stabl…

JavaScript前端面试题——fetch

什么是fetch&#xff1f; fetch&#xff1a;fetch是浏览器内置的api&#xff0c;用于发送网络请求 ajax&axios&fetch的关系 ajax&#xff1a;ajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。 axios&#xff1a;…

MP4标准格式深度解析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

校园选课助手【1】-项目整体架构从此开始

项目背景 随着高校招生规模的不断扩大&#xff0c;学生选课需求日益增长。为提高选课效率&#xff0c;降低学生选课压力&#xff0c;本项目旨在开发一款校园选课助手软件。 项目目标:开发一款具有以下特点的校园选课助手软件&#xff1a; 易用性&#xff1a;界面简洁&#xff…

微信-公众号/订阅号推送消息(js版本)

1.登录或注册微信测试号 &#xff08;测试号的名称由官方自动生成&#xff0c;不能更改&#xff09; 微信测试号入口&#xff1a;微信公众平台 ​ 2.登录进去后会看到自己的appId和appsecret &#xff08;这两个参数都需填入代码中&#xff09; ​ 3.检查是否安装nodeJs…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-3-启动浏览器(详细教程)

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 通过前边两篇文章跟随宏哥学习想必到这里已经将环境搭建好了&#xff0c;今天就在Java项目搭建环境中简单地实践一下&#xff1a; 启动两大浏览器。按市场份额来说&#xff0c…