k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

news2024/11/27 6:15:11

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

  • 介绍
  • containerd 安装方法
    • 二进制文件安装
    • 源码构建安装
  • 注意事项
  • 说明

介绍

Containerd是一个工业标准的容器运行时,它强调简单、健壮和可移植性。它可作为Linux和Windows的守护进程,能管理主机系统上完整容器生命周期: 镜像传输和存储、容器执行和管理、容器底层存储和网络等。它是CNCF下“毕业”的项目,旨在嵌入到更大的系统中,而不是由开发人员或最终用户直接使用。
作为IT行业的人员最熟悉的容器产品大多是docker,可是docker较新的版本底层也在使用containerd来管理容器; k8s 早期大力支持docker作为其底层容器运行时,把相关代码都hardcode到组件中,指导1.24版本开始逐步废除kubelet中的 dockershim,转而通过cri来适配更多类型的容器运行时,包括知名的containerd和 CRI-O。
containerd作为知名、稳定、可靠的容器运行时,从事容器云领域的小伙伴都有必要了解一下它的基本原理和常见的安装部署方式,以便于解决工作、学习中遇到的相关问题…

containerd 安装方法

在安装之前我们可以想象一下运行起来一个容器需要哪些基础组件,类比docker run启动一个容器,我们 containerd 需要哪些基础工具组件呢?
首先, 需要命令行工具 nerdctl或者ctr来实现类似于docker run的功能(即docker-cli项目);其次, nerdctl等工具是需要和containerd的进行通信的,因此需要containerd组件;除此之外还需要一个low-level的运行时工具,它可以通过namespace隔离、cgroup限制来运行起一个实际的容器进程,这个组件就是runc了(当然可以用其它的low-level运行时工具,例如 youki);最后,容器运行是需要相关网络组件的,因此需要cni网络组件。
了解上述基础内容后,我们就能明白: 通过 runc、containerd、nerdctl、cni等4个主要模块就能玩转containerd容器运行时了,下面我们基于这4个模块分别用二进制和源码的方法安装containerd。

二进制文件安装

  1. runc
    在 github.com/opencontainers/runc/releases 下载指定系统和版本的 runc

  2. containerd
    在 github.com/containerd/containerd/releases 下载指定系统和版本的 containerd,笔者使用ubuntu比较多,下载 cri-containerd-cni-1.6.30-linux-amd64.tar.gz 版本,cri表示包含low-level的runc可执行文件,cni表示包含了常见的容器网络组件(例如bridge)。

  3. nerdctl
    在 github.com/containerd/nerdctl/releases 下载containerd的client程序,可以用来执行 nerdctl run|images|ps 等等价于docker的命令。

  4. cni
    在 github.com/containernetworking/plugins/releases 下载常见的容器网络组件可执行文件。

    如果不设置cni的话,新建容器会出现网络相关报错
    root@xg:/home/xg# nerdctl run -d --name=test-busybox busybox:1.32 sleep 3600
    FATA[0000] failed to verify networking settings: failed to create default network: needs CNI plugin "bridge" to be installed in CNI_PATH ("/opt/cni/bin"), see https://github.com/containernetworking/plugins/releases: exec: "/opt/cni/bin/bridge": stat /opt/cni/bin/bridge: no such file or directory 
    

    此处以cri-containerd-cni-1.6.30-linux-amd64.tar.gz 和 nerdctl-2.0.0-beta.2-linux-amd64.tar.gz 为例,将文件拷贝文件到指定目录,按照如下步骤即可运行期containerd容器服务:

    安装containerd
    $ tar -zxvf  cri-containerd-cni-1.6.30-linux-amd64.tar.gz
    # mv usr/local/bin/* /usr/local/bin/
    # mv opt/cni /opt/
    # mv usr/local/sbin/runc /usr/local/sbin/
    # mv etc/systemd/system/containerd.service /etc/systemd/system/containerd.service
    # systemctl daemon-reload
    # systemctl start containerd
    安装nerdctl
    $ tar -zxvf nerdctl-2.0.0-beta.2-linux-amd64.tar.gz
    # mv nerdctl /usr/local/bin/
    

    测试containerd
    在这里插入图片描述
    测试nerdctl在这里插入图片描述
    至此,我们已经通过二进制文件成功的运行起了containerd服务,并用nerdctl测试了容器运行时的可用性。如果后续碰到了内网机器无法访问公网的情况,大胆的使用这种二进制的方法安装containerd服务吧。

源码构建安装

  1. runc
    在github clone containerd 源码,checkout到指定的版本,make all 编译生成二进制文件。
    $ git clone https://github.com/opencontainers/runc.git
    $ git checkout release-1.1
    $ make all
    
    命令执行成功后会在当前目录生产对应的runc文件,将其同步到目标机器上,然后mv 到 /usr/local/sbin/ 目录下即可
    
    如下图: 在这里插入图片描述
  2. containerd
    在github clone containerd 源码,checkout到指定的版本,make all 编译生成二进制文件。
    $ git clone https://github.com/containerd/containerd.git
    $ git checkout release/1.6
    $ make all
    
    make all执行成功后就会在bin目录下生成一系列containerd相关的二进制文件,将bin文件打包后同步到指定的机器上,mv 到 /usr/local/bin/ 目录, 将 containerd.service mv到/etc/systemd/system/目录, 然后通过 systemctl 即可启动服务
    containerd.service放在项目的根目录下(截至2024-03-2日,分支release/1.6)
    
    如下图:
    在这里插入图片描述
  3. nerdctl
    在github clone nerdctl 源码,checkout到指定的版本,make all 编译生成二进制文件。
    $ git clone https://github.com/containerd/nerdctl.git
    $ git checkout release/1.7
    $ make all
    
    make all执行成功后就会在当前目录/_output下生成nerdctl二进制文件,将其同步到目标机器上,mv到 /usr/local/bin/ 下即可
    
    如下图: 在这里插入图片描述
  4. cni
    在github clone containerd 源码,checkout到指定的版本,make all 编译生成二进制文件。
    $ git clone 
    $ git checkout release-1.1
    $ bash build_linux.sh
    $ ls bin
    bandwidth  bridge  dhcp  firewall  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan  vrf
    
    执行成功后会在当前目录下bin文件夹下生成一系列的网络插件二进制文件,将bin文件打包后同步到指定的机器上,将二进制文件 mv 到 /opt/cni/bin 目录即可
    
    如下图:
    在这里插入图片描述

注意事项

  1. 编译containerd报错的时候可能需要安装libbtrfs-dev
    报错信息:
    btrfs/ioctl.h: No such file or directory
    部分网友推荐 apt-get -y install btrfs-progs ,实测在ubuntu22.04及之后的系统上无效
    
    解决方法:
    有效: apt install libbtrfs-dev
    参考: https://ubuntu.pkgs.org/20.04/ubuntu-main-arm64/libbtrfs-dev_5.4.1-2_arm64.deb.html
    
    方法2: 编译的时候忽略 btrfs 
    make all BUILDTAGS=no_btrfs
    
  2. 编译runc报错的时候可能需要安装 pkg-config 和 libseccomp-dev
    报错信息1:
    # pkg-config --cflags  -- libseccomp
    pkg-config: exec: "pkg-config": executable file not found in $PATH
    解决方法:
    apt install pkg-config
    
    报错信息2:
    go build github.com/seccomp/libseccomp-golang:
    # pkg-config --cflags  -- libseccomp
    Package libseccomp was not found in the pkg-config search path.
    Perhaps you should add the directory containing `libseccomp.pc'
    to the PKG_CONFIG_PATH environment variable
    Package 'libseccomp', required by 'virtual:world', not found
    pkg-config: exit status 1
    解决方法:
    apt install libseccomp-dev
    
  3. 在新的server上执行 runc -v报错 GLIBC_2.38 not found
    报错:
    # /usr/local/sbin/runc -v
    /usr/local/sbin/runc: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /usr/local/sbin/runc)
    
    解决方法:
    确保编译系统的glibc版本和运行系统的glibc相同,或者比运行系统低一点。
    笔者最开始在ubuntu23.10 Desktop 上编译,在 ubuntu 22.04 server上运行, 而23.10 使用GLIBC 2.38,22.04使用的是GLIBC 2.35, 因此调整到22.04版本的系统上重新编译就可以正常使用了。
    
    可以通过 strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_ 查看当前系统上的glibc版本
    通过 ldd --version 查看当前系统正在使用的glibc版本
    

说明

软件环境:
ubuntu 22.04 server
nerdctl-2.0.0-beta.2
cri-containerd-cni-1.6.30
runc 1.1.0
参考文档:
containerd -> BUILDING.md
Docker、Containerd、RunC分别是什么
功能解释:containerd.io、docker-ce、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin、docker.io
ubuntu docker离线安装docker
How to install the Containerd runtime engine on Ubuntu Server 22.04
Containerd shim 原理深入解读
Containerd组件 – containerd-shim-runc-v2作用
Understanding the Container Runtime Containerd in one article

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

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

相关文章

RK3588 NPU研究(一)

使用NPU进行AI计算,具体对应模型推理 对应代码位置 hardware/rockchip/rknpu2 examples: yolo5 编译 下载NDK工具https://developer.android.google.cn/ndk/downloads?hlzh-cn源码中使用16b,测试可以使用16/17/18/19/20,不可以使用21&…

C语言-atoi函数的模拟

模拟术语讲解 首先,需要定义一个标志位变量sign,用于表示转换结果的合法性1。定义一个函数My_atoi,用于实现atoi的功能1。在My_atoi函数中,首先遍历字符串,直到遇到第一个非空格字符1。如果第一个字符不是数字或正负号…

ROS安装教程(鱼香ROS快捷版)

文章目录 前言一、ROS版本二、ROS安装1.添加ROS源2.添加密钥3.安装ROS4.安装python依赖包(可选)5.初始化rosdep6.ROS 测试 总结 前言 对于初学者来说,ROS的安装往往是一个令人头疼的问题,复杂的步骤和网络问题常常成为入门的第一…

kubernetes-dashboard 安装配置

k8s 1.23以上的版本 https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 执行命令: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 安装完成后&#x…

FSH6罗德与施瓦茨FSH6频谱分析仪

181/2461/8938产品概述: R&S FSH6频谱分析仪坚固耐用、方便易用,专为野外使用而设计。它重量轻、操作简单、设计合理且具有大量测量功能,是任何需要高效测量仪器进行户外工作的人不可或缺的工具。 R&S FSH6是一款手持式频谱分析仪&…

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种, 第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可…

基于springboot实现在线文档管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线文档管理系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&am…

3分钟教你最大化利用APP消息推送(Push)在运营中的优势

推送通知是指运营团队通过自有产品或外部工具,主动向用户的移动设备发送信息。用户可以直接在手机的锁屏和通知中心看到这些推送通知,点击通知中心的相关内容可以激活应用并跳转至特定页面。例如,我们在手机锁屏时接收到的微信消息&#xff0…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中,对数据库操作常常会涉及多张表,所以在OOP中就涉及对象与对象的关联关系。针对多表操作,MyBatis提供关联映射。 关联关系概述 一对一:A类中定义B类的属性b,B类中定义A…

电脑常见故障检测方法与对应问题分析说明

电脑常见故障检测方法与对应问题分析说明 前言说明1、机器无法开机故障2、屏幕无法显示3、无法联网4、能开机但是无法进入系统,提示not boot5、USB接口无法识别U盘 前言说明 本文为小白向,许多内容属于经验学而非科学,还望大佬们轻喷。 如上…

Verilog语法之always语句学习

always语法是Verilog_HDL中最常用的一种语法。 always过程语句和语句块组成的,语法格式如下所示。 always(敏感信号1 or 敏感信号2.....) always实现组合逻辑和时序逻辑。用always实现组合逻辑要将所有的敏感信号加入敏感列表中;用always实现时序逻辑时…

为什么都说”一入Java深似海“?

引言 在当今数字化时代,编程已经成为一项至关重要的技能。而在众多编程语言中,Java以其广泛的应用领域和强大的功能特性,吸引了无数开发者的目光。无论是Web开发、移动应用还是大数据处理,Java都发挥着举足轻重的作用。然而&…

GDAL源码剖析(一)

GDAL源码剖析(一)_gdal 源码-CSDN博客 一、GDAL简介 GDAL官方网站http://www.gdal.org/,本文章中的基本内容都是参照官网中的信息,如有错误或者与官网中的内容冲突,以官网中的为正确。 在开始文章之前,我…

探索数字物流技术 2024中国国际展览会与您相约七月杭州

数字贸易创新引领合作动能 《十四五规划》明确指出关于“加快数字化发展,建设数字中国”要求,积极为全国数字物流链转型革新试水探路。全力发展以数字化为引领的现代产业体系,打造面向未来、全球的数字物流技术变革高地。数字化成为了物流和供应链企业推…

Redis实战(黑马点评:短信登录)

1.基于Session实现发送短信验证码 UserController: /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {return userService.sedCode(phone,session);}UserServiceImpl: Overri…

[yolox]ubuntu上部署yolox的ncnn模型

首先转换pytorch->onnx->param模型,这个过程可以查资料步骤有点多,参考blog.51cto.com/u_15660370/6408303,这里重点讲解转换后部署。 测试环境: ubuntu18.04 opencv3.4.4(编译过程省略,参考我其他博客) 安装…

一个页面实现两个滚动条【前端】

一个页面实现两个滚动条【前端】 前言版权推荐一个页面实现两个滚动条最后 前言 2024-4-2 12:54:46 以下内容源自《【前端】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net …

25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。 t1线程获得A对象锁,接下来想获取B对象的锁。 t2线程获得B对象锁,接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

数字医疗:智慧医共体引领健康未来

随着科技的不断发展,数字医疗正在成为医疗行业的一场革命。数字化技术的应用不仅提高了医疗服务的效率和质量,还为人们带来了更便捷、智能的健康管理方式。在这个数字化时代,智慧医共体已经成为了健康未来的引领者。 数字医疗,顾…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集,还不熟悉,继续熟悉; 现在有一个文件型的数据源,名为swtest1;它前面小图标上有UDX三个字母,表明这是一个UDX类型的数据源;在此数据源上右击&#x…