目录

Kubernetes组件镜像添加bash

概述

Kubernetes 组件的镜像里都没有 bash 等命令,事实上这也是官方支持和默认的行为,不仅是小体积的镜像更方便存储和传送,还有就是安全问题的考虑。但如果没有任务 bash 等命令的容器,在进行 debug 的时候会比较麻烦,虽然官方提供了临时容器 debug 的方式,由于不同公司对这个方式的支持程度不一样,所以有些公司还是需要通过容器内的 bash 命令来进行一些简单的 debug 操作的。

那么如果在 Kubernetes 组件的镜像里可以添加 bash 命令吗?如果重新修改 Kubernetes 的 base 镜像重新打包和构建镜像,会耗费大量的时间,那么是否有更简单的方式来为这些镜像里添加 bash 命令呢。本文将针对这个问题进行分析和讲解。

Kubernetes组件基础镜像

为了给 Kubernetes 组件镜像添加 bash 命令等,首先想到的就是这些组件镜像是通过什么基础镜像构建出来的。由于 Kubernetes 构建镜像的方式比较复杂,需要搞清楚官方仓库里构建镜像脚本的内容,建议查看 common.sh,这样可以定位到 Kubernetes 构建组件镜像的时候用的都是什么基础镜像,下面是在一台 Linux 主机上进行快速构建镜像的例子,主要选择 Make 的目标应该为 quick-release-images,这样可以快速构建镜像。

1
2
3
4
curl -LO https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.30.4.zip
unzip v1.30.4.zip
cd kubernetes-1.30.4
make quick-release-images

为镜像添加bash命令

举个例子,通过下面的 Dockerfile,就可以把 busybox 在 /bin/ 目录下的工具都搬到 kube-apiserver 的镜像了。

1
2
3
FROM registry.k8s.io/kube-apiserver:v1.30.4

COPY --from=busybox:latest /bin/* /bin/

总结

要说为什么一定要在 Kubernetes 相关的组件里引入 shell,这是个好问题,官方都最小化生成镜像了,如果说因为要进入 kube-apiserver 这些容器里 debug,其实也算不上理由,官方也早已经有 debug 容器支持了。实际上,还是因为一些公司内部的运维工具会依赖 kubectl exec 这样的命令进入容器 debug,讲道理运维有权限登录宿主机,切到 kube-apiserver 容器的命名空间就什么都可以 debug 了,所以这个实际上还是一个伪需求。当然本文的目的就是说非要硬加,那也是可以加的。

参考资料

  1. Add shell or bash to a docker image (Distroless based on Debian GNU/Linux)
  2. 什么是Distroless容器镜像?
  3. 如何使用Distroless让你的容器更加安全