从 K8s 的 “临时容器” 看 K8s 设计的厉害之处

ops/2024/10/22 2:30:11/

大家好,这里是G-LAB IT实验室。

在这里插入图片描述

从一个容器的不足说起

容器概念出现时,有个非常重要的理念:容器中极简。

容器里面只保留需要运行的进程就可以,其他一律不要安装。这也是为什么 Docker 出现的那时,有一篇文章《为什么不需要在 Docker 容器中运行 sshd》经常被提及的原因。

但有时候 Docker 容器中缺少需要的软件。比如 curl,wget,ifconfig,ip,tcpdump 等基础软件包,遇到问题时,什么命令都敲不了,很是让人抓狂。平时定位问题的技术(各种 Linux 命令行工具),一点都用不上了。自己打的镜像倒还好,大不了重新打镜像把需要的工具也安装后,重新打镜像。但是如果是开源镜像就比较棘手。

如何在没有安装软件包的容器里面,执行需要的命令行(二进制工具)进行调试,一直是 K8s 平台的一个小遗憾。

以前想 K8s 可以补充的功能

以前想着:可以利用 Host 上面的命令行呀,通过 nsenter 跳到容器里面,不就可以执行了么。

当年还幻想可以给 K8s 提点 proposal:让 exec 命令增加 --from-host 参数,当带上这个参数的时候,让 kubelet 直接从 Host 执行 nsenter 运行主机上面的二进制,这样就绕过了容器里面没有命令行的约束。方便管理员调试容器中相关问题。

想法似乎挺好,后面转战上层 AI 平台,并没有继续关注这么底层的了。直到最近看到 K8s 的新功能:“临时容器” (ephemeral containers)。发现 K8s 对某个特性的设计还是非常值得点赞的。

结果 K8s 实现的功能

K8s 为了能在容器里面,执行不存在的命令行,增加了一个 kubectl debug 命令

大致流程如下图:

其中红色容器,就是一个 “临时容器”,它与目标容器共享各种 namespace,所以与直接在目标容器中执行命令的效果是一样的。通过指定镜像地址,来控制这个新启动的 “临时容器” 里面包含自己所需要的各类命令行。

这样就可以在任意 K8s 的容器里面,执行不存在的命令行工具了。比如,对某 Pod 里面的名为 app 的容器执行调试:

kubectl debug -it -c debugger --target=app --image=busybox {POD_NAME}

–target 参数,是指定 Pod 中需要调试的目标 Container(有时 Pod 有多个 Container)。

果然还是人家的更厉害

看完 K8s 的实现,明显比早期想的 “借用 Host” 方法更好:其仍然保持 Host 节点的 “极简”,而是将需要的工具仍然保持由容器来承载。这样可以借用任意的容器镜像,而不必在 Host 节点上面安装各种工具包。非常优雅。

更 “过分” 的是,在节点上没有的命令行工具,也不需要给节点安装软件包,也可以通过临时容器来执行。

kubectl debug node/mynode -it --image=ubuntu

扩展性也很赞,确实考虑的挺周全。

So,启动 “临时容器” 来在目标容器中 “整活” 走起~


http://www.ppmy.cn/ops/127454.html

相关文章

Windows PowerShell 有没有类似conda的虚拟环境功能?

PowerShell本身并不直接提供与Conda完全相同的环境功能,但PowerShell可以通过一些方法和工具来实现类似的环境管理。以下是对PowerShell和Conda环境功能的详细对比及PowerShell实现类似功能的途径: 一、Conda的环境功能 Conda是一个开源的包管理系统和…

Mac 编译 Unreal 源码版本

在Mac上编译Unreal Engine源码需要遵循以下步骤: 安装必要的依赖项: Xcode Python(建议使用2.7版本) Java(使用JDK 8) CMake Ninja SVN(用于获取某些依赖项) 获取Unreal Engi…

15分钟学Go 实战项目一:命令行工具

实战项目一:命令行工具 1. 引言 命令行工具是开发者常用的工具之一,它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中,我们将创建一个简单的命令行工具,以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…

数据库相关操作

1. 创建数据库 首先,使用 CREATE DATABASE 语句来创建一个新的数据库。 CREATE DATABASE my_database; 2. 使用数据库 创建数据库后,使用 USE 语句切换到这个数据库。 USE my_database; 3. 创建表 接下来,在数据库中创建一张表。表中…

基于PHP在线小说阅读平台【附源码】

基于PHP在线小说阅读平台 效果如下: 系统首页界面 系统注册界面 热门小说详细页面 公告信息详细页面 后台登录界面 管理员主界面 用户界面 作者界面 小说分类界面 我的书架界面 作者主界面 研究背景 随着互联网的普及和数字化技术的飞速发展,传统的纸…

redis的发布订阅模式

1.发布订阅模式的结构 结合上图和消息中间件,可以将channel和消息中间件中的topic主题对应起来 2. Redis发布订阅功能 (1)发送消息 Redis采用PUBLISH命令发送消息,其返回值为接收到该消息的订阅者的数量。 (2&#xf…

中小型医院网站开发:Spring Boot入门

2 相关技术简介 2.1 Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,…

用Python删除PDF文档页面的页边距

在处理PDF文档时,有时候我们会遇到PDF文件带有较大的页边距的情况。这样过大的页边距不仅浪费了页面空间,而且在打印或电子阅读时也可能影响用户体验。通过删除这些不必要的页边距,我们可以更有效地利用页面区域,使得内容更加紧凑…