科技 > 人工智能 > 云计算

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

157人参与 2024-08-06 云计算

本文分享自华为云社区《从k8s的“临时容器”看k8s设计的厉害之处》,作者: tsjsdbd。

从一个容器的不足说起

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

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

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

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

我以前想k8s可以补充的功能

之前唐老师写过《跟唐老师学习云网络 - nsenter魔法棒》,我还想着:可以利用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,启动“临时容器”来在目标容器中“整活”走起~

 

点击关注,第一时间了解华为云新鲜技术~

 

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

字节跳动开源Linux内核网络抓包工具netcap

08-06

流量回放新形态:基于网关 Access Log 发起

08-06

全球63%组织部署零信任

08-06

聊一聊:这部科幻电影陪我度过了很多个周五(内涵福利!!)

08-06

对话 Zilliz 创始人 Charles:如何在AGI的浪潮下慢慢地快

08-06

基于“日志审计应用”的 DNS 日志洞察实践

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论