k8s-容器运行时接口分析

1、为了什么需要 CRI ?

在 k8s v1.5 之前,Docker 作为第一代的容器运行时, kubelet 通过内嵌其中的 DockerShim 操作 Docker API 来操作容器。在 Kubernetes 1.5 中引入了 CRI,可以解耦了kubelet与容器运行时,该插件接口让 Kubernetes 无需重新编译就可以支持更多的容器运行时。

kubelet 将通过 CRI 接口来跟第三方容器运行时进行通信(如Rkt或Hyper等),来操作容器与镜像。CRI 包含 Protocol Buffers、gRPC API、以及运行库支持,还有尚在开发的标准规范和工具。

2、CRI 概览

实现 CRI 接口的容器运行时称为 CRI shim , 它作为 gRPC 服务端,监听在本地的 Unix socket 上;而 Kubelet 作为 gRPC 客户端来调用 CRI 接口,进行 Pod 、容器、镜像的生命周期管理。

在这里插入图片描述

Protocol Buffers API 包含两个 gRPC 服务 ImageServiceRuntimeService

  • ImageService 提供从仓库拉取镜像、查看和移除镜像等功能;
  • RuntimeService 提供对 Pod 和容器的生命周期管理、和容器的交互,创建和启动容器、删除容器等功能;

另外安装时,需要在每台宿主机上单独安装一个负责响应 CRI 的组件称作 CRI shim。顾名思义,CRI shim 的工作,就是扮演 kubelet 与容器项目之间的“垫片”(shim)。所以它的作用非常单一,那就是实现 CRI 规定的每个接口,然后把具体的 CRI 请求“翻译”成对后端容器项目的请求或者操作。

3、Pod 和容器的生命周期管理

service RuntimeService {// Sandbox operations.rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {}rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse) {}rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse) {}rpc PodSandboxStatus(PodSandboxStatusRequest) returns (PodSandboxStatusResponse) {}rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse) {}// Container operations.rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}rpc StartContainer(StartContainerRequest) returns (StartContainerResponse) {}rpc StopContainer(StopContainerRequest) returns (StopContainerResponse) {}rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse) {}rpc ListContainers(ListContainersRequest) returns (ListContainersResponse) {}rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse) {}...
}

Pod 由一组应用程序容器组成,位于具有资源约束的隔离环境中。在CRI中,这种环境称为PodSandbox。我们有意为容器运行时留出一些空间,以便根据它们在内部的运行方式以不同的方式解释 PodSandbox。对于基于虚拟机管理程序的运行时,PodSandbox 可能代表虚拟机。对于其他人,例如Docker,它可能是Linux命名空间。PodSandbox 必须遵守 Pod 资源规范。在 v1alpha1 API 中,这是通过启动 kubelet 创建并传递给运行时的 pod 级 cgroup 中的所有进程来实现的。

在启动 pod 之前,kubelet 会调用 RuntimeService.RunPodSandbox 来创建环境。这包括为 Pod 设置网络(例如,分配 IP)。一旦 PodSandbox 处于活动状态,就可以独立创建/启动/停止/删除单个容器。要删除 pod,kubelet 会在停止和移除 PodSandbox 之前停止并移除容器。

Kubelet 的职责在于通过 RPC 管理容器的生命周期,实现容器生命周期的钩子,以及存活和健康监测,执行 Pod 的重启策略等。

4、Exec/attach/port-forward 请求

service RuntimeService {...// ExecSync runs a command in a container synchronously.rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse) {}// Exec prepares a streaming endpoint to execute a command in the container.rpc Exec(ExecRequest) returns (ExecResponse) {}// Attach prepares a streaming endpoint to attach to a running container.rpc Attach(AttachRequest) returns (AttachResponse) {}// PortForward prepares a streaming endpoint to forward ports from a PodSandbox.rpc PortForward(PortForwardRequest) returns (PortForwardResponse) {}...
}

Kubernetes 为用户提供了和 Pod 以及其中的容器进行交互的能力(kubectl exec/attach/port-forward)。Kubelet 目前支持两种方式来支持这些功能:调用容器的本地方法,或者使用 Node 上的工具(例如 nsenter 以及 socat)。因为多数工具假设 Pod 利用 Linux namespace 做了隔离,因此使用 Node 上的工具并不是一个可移植的方案。在 CRI 中,我们显式的定义这些调用,让运行时可以做特定实现。

当下还有一个潜在问题是,Kubelet 处理所有的请求连接,所以他有成为 Node 通信瓶颈的可能。在设计 CRI 的时候,我们采纳了一些反馈,让运行时能够排除中间人。容器运行时可以启动一个单独的流服务器处理请求(还能为 Pod 的资源使用进行记录),并把服务器地址返回给 Kubelet。这样 Kubelet 就能反馈信息给 API Server,使之可以直接连接到容器运行时的服务,并连接到客户端。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件,主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中,接下来,PageHelper会进入Mybatis的拦截器环节,…

自回归模型(AR )

最近看到一些模型使用了自回归方法,这里就学习一下整理一下相关内容方便以后查阅。 自回归模型(AR ) 自回归模型(AR )AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…

吉他初学者学习网站搭建系列(9)——如何用coze做一个网站助手

文章目录 背景功能搭建智能体新增工作流效果总结 背景 随着AI大模型的普及,国内也涌现出许多帮助用户更便捷使用大模型的平台。扣子就是其中之一。国内已经有蛮多用户了,我试用了这个平台,来给我的网站搭建一个小助手,效果非常好…

【网络】网络基础知识(协议、mac、ip、套接字)

文章目录 1. 计算机网络的背景2. 认识网络协议2.1 协议分层2.2 OS与网络的关系 3. 网络传输基本流程3.1 局域网通信流程3.2 跨网络通信流程 4. Socket 编程预备4.1 理解源IP地址和目的IP地址4.2 端口号与Socket4.3传输层的典型代表4.4 网络字节序 5. socket 编程接口5.1 介绍5.…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前,作者用 Qt 仿照前端 UI 设计了一个 ministack(https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h) 控件,这个控件可以折叠。部分用户体验后&#…

【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码

目录 一、PyQt5介绍: (1)PyQt简介: (2)PyQt API: (3)支持的环境: (4)安装: (5)配置环境变量…

青海摇摇了3天,技术退步明显.......

最近快手上的青海摇招聘活动非常火热,我已经在思考是否备战张诗尧的秋招活动。开个玩笑正片开始: 先说一下自己的情况,大专生,20年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初&#xff0c…

DDD第一话:业务领域分析

业务领域的概念 业务领域定义了公司的主要活动领域,这是公司为客户提供的服务内容。例如:联邦快递提供快递服务;星巴克最出名的是它的咖啡。 子域 为了实现其业务领域的目标和目标,公司必须在多个子领域中操作。子域是业务活动…

MongoDB change stream实战

什么是 Chang Stream Change Stream指数据的变化事件流,MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案,类似于关系数据库的触发器,但原理不完全相同: Change Stream 的实…

Linux其二设置端口号,静态ip以及命令

目录 1、VI编辑器 【linux版本的文本文件】 2) 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压(重点) 5、find 查找命令 6、which & whereis 作用是一样的,表示某…

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令,在C盘位置C:\Users\325…

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者,我已经习惯于用Node.js写一些web应用来为工作服务,因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能:web路由。(观看此文的前提是默认你已经装好nonde.js了&#xf…

【后端面试总结】Redis字符串实现原理

字符串是我们平时接触频率最高的一个基础类型,但就是这么一个平平无奇的基本类型,在Redis里面也是经历了各种各样的优化,来优化它对内存的占用,了解这部分内容,与其说是“学习Redis”,不如说是“向Redis学习…

GitToolBox插件:让IntelliJ IDEA的Git操作如虎添翼

GitToolBox插件介绍 GitToolBox是一款针对IntelliJ IDEA的插件,旨在增强IDE内置的Git功能,使Git操作更加便捷和高效。无论是单独开发者还是团队中的一员,这个插件都能帮助更好地管理代码和协作流程。 功能特点 分支管理:GitToolBo…

Vulhub:Shiro[漏洞复现]

目录 CVE-2010-3863(Shiro未授权) 使用浏览器访问靶场主页面 使用Yakit进行抓包 使用ffuf对靶机8080端口进行根路径FUZZ CVE-2016-4437(Shiro-550) 使用浏览器访问靶场主页面 使用Yakit进行抓包 使用Yakit反连中自带的Yso-Java Hack进行漏洞利用 首先运行脚本生成一个…

Netty 框架——TCP 粘包和拆包

Netty 框架——TCP 粘包和拆包 1. 产生的原因 在 TCP 协议中,发送端为了提高网络传输的效率,通常会使用优化算法,如 Nagle 算法,将多个小的数据包合并成一个较大的数据块一起发送。这是因为频繁的小数据包传输可能会导致效率低下…

SQL靶场第九关攻略

我们的第九关需要用到时间盲注 使用条件:完全没有变化的页面 我们在了解一下时间盲注和布尔盲注的区别,时间盲注比布尔盲注多了一个if判断加上sleep()函数的运用 if(a,b,c) if判断句,a为条件,b、c为执行语句;如果a为…

STM32一keil5更换芯片后报错问题的解决。

目录 一、STM32型号认识二、报错问题三、常用的启动配置文件四、问题解决 一、STM32型号认识 二、报错问题 当我们在原来工程下修改芯片时,原本可以编译通过的代码突然很多报错。如下所示,这是因为我们的启动文件配置错误。对于不同型号的芯片其flash容量…

STM32 自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 RAM vs ROM vs FLASH 2013-09-05记录,ROM和RAM指的都是半导体存储器,ROM是Read Only …

深入解析 HTML Input 元素:构建交互性表单的核心

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…