一、为什么会出现临时容器¶
生产环境下为了优化镜像体积和提高镜像的安全性,并不会在容器中安装太多高危工具,比如curl、wget、dig以及常用的net-tools等。这样做虽然提高了镜像的安全性,但也带来了一些不便,比如无法查看容器内的进程情况、无法查看容器内的链接情况、服务出了问题无法很方便地进行排查等。因为上述操作并非经常使用,所以我们并没有必要从一开始就安装这些工具,但是等用到的时候再安装也是一件很麻烦的事情,为了解决这类问题,在1.16版本后,Kubernetes引入了Ephemeral Containers的概念,可以不用安装第三方工具即可实现在线Debug操作。
二、什么是临时容器¶
临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启, 因此不适用于构建应用程序。 临时容器使用与常规容器相同的 ContainerSpec 节来描述,但许多字段是不兼容和不允许的。
- 临时容器没有端口配置,因此像
ports、livenessProbe、readinessProbe这样的字段是不允许的。 - Pod 资源分配是不可变的,因此
resources配置是不允许的。
临时容器是使用 API 中的一种特殊的 ephemeralcontainers 处理器进行创建的, 而不是直接添加到 pod.spec 段,因此无法使用 kubectl edit 来添加一个临时容器。
注意:临时容器不被静态Pod支持
三、临时容器是做什么的¶
临时容器是为了调试程序而设计的,所以在添加临时容器时,最好使用一个包含所有常用工具的镜像进行创建。当业务容器崩溃或容器镜像不包含调试工具而导致kubectl exec不可用时,临时容器对于交互式故障排查和在线Debug很有用。尤其是在使用像不包含任何shell和其他工具的distroless镜像作为基础镜像时,虽然可以减少攻击面和漏洞,但是对于问题的排查会变得尤为棘手,此时临时容器就可以发挥很大的作用,带来诸多便利性。