我正在编写一个准入 Controller ,它负责用我的 exec
版本启动所有容器,比如 myexec
。
我知道,我可以修改 pod 容器规范中的 command
,以 myexec
为前缀。
但是当 pod 的容器规范中没有 command
时,我陷入了困境。在那些情况下,根据我的理解,我必须找到容器要加载的图像的入口点命令/脚本。我需要将 command
设置为 myexec entrypoint.sh
。
这看起来既棘手又昂贵,因为我必须检查图像、找到入口点,所有这些都在准入 Controller 内。
我想说的是 kubernetes 已经在拉取镜像(以防镜像已经被拉入或预先显式加载到集群中)并且在它们的节点上有 list ,它可能会将这些入口点信息作为容器配置发送,但是我不知道如何在入场时捕捉到这些。
所以我正在寻找一些我不知道的提示、技巧或方法来实现我的目标。
PS:我无法更改图像配置。
最佳答案
有这个项目skopeo这允许您查询任何容器注册表以获取元数据,例如入口点和命令。
可以使用skopeo cmd工具进行测试。
关注this install instructions安装它。
现在尝试以下操作:
$ skopeo inspect --config docker://nginx:latest
您可能看到的是大量输出。我们的用例不需要其中的大部分。
我们感兴趣的是在.config
下。我使用 jq
来查询它。看看:
$ skopeo inspect --config docker://nginx:latest | jq ".config"
{
"ExposedPorts": {
"80/tcp": {}
},
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.19.5",
"NJS_VERSION=0.4.4",
"PKG_RELEASE=1~buster"
],
"Entrypoint": [
"/docker-entrypoint.sh"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
}
注意字段:Entrypoint
和 Cmd
。我相信这就是您要找的。所有这一切都是在不拉取任何图像的情况下完成的。这有多酷?
您可能可以获取源代码(它在 apache 许可下,因此可以随意修改它),从中获取其余服务并让准入 Controller 查询它以获取有关端点/cmds 的信息。
关于kubernetes - 如何通过 kubernetes 准入 Controller 修补 pod 的容器规范以使用我的 exec 版本启动容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65263058/