Kubernetes 中的容器运行时

容器运行时(Container Runtime)是 Kubernetes 最重要的组件之一,负责真正管理镜像和容器的生命周期。Kubelet 通过 Container Runtime Interface (CRI) 与容器运行时交互,以管理镜像和容器。

​ 容器运行时接口(Container Runtime Interface (CRI)) 是 Kubelet 1.5 和 kubelet 1.6 中主要负责的一块项目,它重新定义了 Kubelet Container Runtime API,将原来完全面向 Pod 级别的 API 拆分成面向 SandboxContainer 的 API,并分离镜像管理和容器引擎到不同的服务。

CRI 最早从从 1.4 版就开始设计讨论和开发,在 v1.5 中发布第一个测试版。在 v1.6 时已经有了很多外部容器运行时,如 frakti、cri-o 的 alpha 支持。v1.7 版本新增了 cri-containerd 的 alpha 支持,而 frakticri-o 则升级到 beta 支持。

1. CRI 接口


CRI 基于 gRPC 定义了 RuntimeServiceImageService,分别用于容器运行时和镜像的管理。其定义在

Kubelet 作为 CRI 的客户端,而 Runtime 维护者则需要实现 CRI 服务端,并在启动 kubelet 时将其传入:

kubelet --container-runtime=remote --container-runtime-endpoint=unix:///var/run/crio/crio.sock ..

2. 如何开发新的 Container Runtime

开发新的 Container Runtime 只需要实现 CRI gRPC Server,包括 RuntimeServiceImageService。该 gRPC Server 需要监听在本地的 unix socket(Linux 支持 unix socket 格式,Windows 支持 tcp 格式)。

具体的实现方法可以参考下面已经支持的 Container Runtime 列表。

3. 目前支持的 Container Runtime


目前,有多家厂商都在基于 CRI 集成自己的容器引擎,其中包括:

  • Docker: 核心代码依然保留在 kubelet 内部(pkg/kubelet/dockershim),依然是最稳定和特性支持最好的 Runtime
  • HyperContainer: 支持 Kubernetes v1.6+,提供基于 hypervisor 和 docker 的混合运行时,适用于运行非可信应用,如多租户和 NFV 等场景
  • Runc 有两个实现,cri-o 和 cri-containerd
    • cri-containerd: 支持 kubernetes v1.7+
    • cri-o: 支持 Kubernetes v1.6+,底层运行时支持 runc 和 intel clear container
  • Rkt: 开发中
  • Mirantis: 直接管理 libvirt 虚拟机,镜像须是 qcow2 格式
  • Infranetes: 直接管理 IaaS 平台虚拟机,如 GCE、AWS 等

cri-containerd

以 Containerd 为例,在 1.0 及以前版本将 dockershimdocker daemon 替换为 cri-containerd + containerd,而在 1.1 版本直接将 cri-containerd 内置在 Containerd 中,简化为一个 CRI 插件。

Containerd 内置的 CRI 插件实现了 Kubelet CRI 接口中的 Image ServiceRuntime Service,通过内部接口管理容器和镜像,并通过 CNI 插件给 Pod 配置网络。

4. CRI Tools


为了方便开发、调试和验证新的 Container Runtime,社区还维护了一个 cri-tools 工具,它提供两个组件

  • crictl: 类似于 docker 的命令行工具,不需要通过 Kubelet 就可以跟 Container Runtime 通信,可用来调试或排查问题
  • critest: CRI 的验证测试工具,用来验证新的 Container Runtime 是否实现了 CRI 需要的功能

另外一个工具是 libpod,它也提供了一个组件: podman,功能和 crictl 类似。

如果想构建 oci 格式的镜像,可以使用工具: buildah

转载自:Kubernetes 中的容器运行时 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (icloudnative.io)

k8s之容器运行时的更多相关文章

  1. Kubernetes(k8s)容器运行时(CRI)

    Kubernetes节点的底层由一个叫做"容器运行时"的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领 ...

  2. Kubernetes容器运行时(CRI)简介

    Kubernetes节点的底层由一个叫做“容器运行时”的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领域发展迅速.为了使K ...

  3. 一文搞懂容器运行时 Containerd

    文章转载自:https://www.qikqiak.com/post/containerd-usage/ 在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为 ...

  4. 在Linux中安装containerd作为kubernetes的容器运行时

    概述 从kubernetes1.24开始的版本移除了内置的docker支持,用户可以自行选择需要使用的容器运行时,比如containerd.CRI-O.Docker Engine等等,这里我们采用二进 ...

  5. 第30 章 : 理解 RuntimeClass 与使用多容器运行时

    理解 RuntimeClass 与使用多容器运行时 本文将主要分享以下三方面的内容: RuntimeClass 需求来源 RuntimeClass 功能介绍 多容器运行时示例 RuntimeClass ...

  6. 容器进阶:OCI与容器运行时

    Blog:博客园 个人 什么是容器运行时(Container Runtime) Kubernetes节点的底层由一个叫做容器运行时的软件进行支撑,它负责比如启停容器 这样的事情.最广为人知的容器运行时 ...

  7. CRI容器运行时

    CRI容器运行时 我们知道 Kubernetes 提供了一个 CRI 的容器运行时接口,那么这个 CRI 到底是什么呢?这个其实也和 Docker 的发展密切相关的. 在 Kubernetes 早期的 ...

  8. 云原生生态周报 Vol. 16 | CNCF 归档 rkt,容器运行时“上古”之战老兵凋零

    作者列表:木苏,临石,得为,等等 业界要闻 安全漏洞 CVE-2019-9512 CVE-2019-9514 http2 的 DOS 漏洞,一旦攻击成功会耗尽服务器的 cpu/mem,从而导致服务不可 ...

  9. 使用kubeoperator安装的k8s集群以及采用的containerd容器运行时,关于采用的是cgroup 驱动还是systemd 驱动的说明

    使用kubeoperator安装的k8s集群,默认使用的是systemd驱动 # kubectl get cm -n kube-system NAME DATA AGE calico-config 4 ...

  10. 关于使用kubeoperator搭建k8s集群使用containerd作为容器运行时,从自己搭建的habor仓库拉取镜像的有关说明

    1.kubepi界面添加habor仓库信息,并授权给k8s集群 这一步的操作是当在工作负载选择从harbor仓库拉取镜像时会自动创建有关的secrets信息,从而不用事先手动创建了(有别于kuboar ...

随机推荐

  1. Typora 上传到 Github 实现笔记同步管理

    首先在 Github 上 new 一个 repository ,我建的名称是 md_notes 然后在本地 terminal 中启动以下命令新建一个 ssh key  ssh-keygen -o 生成 ...

  2. Axure 0基础实战入门 模拟一个app页面

    Axure 0基础实战入门 模拟一个app页面 第一次接触axure9,尝试模拟一个app页面与交互 页面原型 我选择了一个免费的日程app,下载rp文件后导入到axure 模拟实现登录页面 新建两个 ...

  3. vue打包项目版本号自加

    原因 项目每次打包后都需要改动项目版本号,这个改动每次都需要在package.json中修改version,比较麻烦,到底有没有一种打包后版本号自加的办法. 方案 版本号自加其实可以使用fs修改文件来 ...

  4. 上架难、买量贵?即构 Web 端 1v1 方案全力加速泛娱乐出海

    1v1 视频社交以其功能简洁.互动性强.匹配效率高等特点,在陌生人社交玩法中饱受用户欢迎,平台仅需让两个用户通过匹配.选择等形式连通后,用户即可在房内进行 1v1 视频社交,且在社交的同时又极具私密性 ...

  5. 小tips:ECMA-262定义的7种错误类型

    七种错误类型如下: Error EvalError RangeError ReferenceError SyntaxError TypeError URIError 其中,Error是基类型(其他六种 ...

  6. C# and TypeScript – Enum Flags

    前言 以前就有提过 Enum Flags,但平日不常用.最近翻 Angular 源码,发现它很多地方用到,而且没有封装语义代码.一堆符号真的看不惯啊... 于是又去复习了一遍,熟悉熟悉.顺便写一篇做记 ...

  7. Java获取Object中Value的方法

    在Java中,获取对象(Object)中的值通常依赖于对象的类型以及我们希望访问的属性.由于Java是一种静态类型语言,直接从一个Object类型中访问属性是不可能的,因为Object是所有类的超类, ...

  8. 算法学习-Dancing Links X

    Dancing Links X 舞蹈链. 实质为用循环十字链在图上将所有"1"的位置链起来 构造较为巧妙,且极易理解,本题为 DLX 模板(精确覆盖问题) DLX 算法的题目做法一 ...

  9. C++ char*类型与vector类型的相互转换

    char*类型与vector<char> 类型的相互转换 很多时候需要使用动态的字符串,但是char*难以完成相应的扩容操作,而动态数组vector则可以简单地完成,结合二者特性就可以完成 ...

  10. 将 LLMs 精调至 1.58 比特: 使极端量化变简单

    随着大语言模型 (LLMs) 规模和复杂性的增长,寻找减少它们的计算和能耗的方法已成为一个关键挑战.一种流行的解决方案是量化,其中参数的精度从标准的 16 位浮点 (FP16) 或 32 位浮点 (F ...