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

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

本文分享自华为云社区《从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,启动“暂时容器”来在目标容器中“整活”走起~
 
点击关注,第一时间了解华为云新鲜技能~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表