kubernetes - 如何通过 kubernetes 准入 Controller 修补 pod 的容器规范以使用我的 exec 版本启动容器?

标签 kubernetes

我正在编写一个准入 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"
}

注意字段:EntrypointCmd。我相信这就是您要找的。所有这一切都是在不拉取任何图像的情况下完成的。这有多酷?

您可能可以获取源代码(它在 apache 许可下,因此可以随意修改它),从中获取其余服务并让准入 Controller 查询它以获取有关端点/cmds 的信息。

关于kubernetes - 如何通过 kubernetes 准入 Controller 修补 pod 的容器规范以使用我的 exec 版本启动容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65263058/

相关文章:

Kubernetes CRDs - 引用现有的验证规范

Kubernetes 环境变量在 sequelize-cli 中不起作用

docker - 当Minikube(k8s)内的Pod声明卷时,如何强制所有它们实际上位于裸机*主机*上的某个磁盘上?

Kubernetes ud615 新手 secure-monolith.yaml `error validating data` ?

存在容忍度的 Kubernetes DaemonSets

kubernetes - 我们可以使用kubeadm以完全脱机的方式安装Kubernetes吗?

kubernetes - Istio Gateway + Cert-Manager + letsencrypt 证书

docker - 运行 `minikube start` ,无法拉取 k8s.gcr 镜像,但 `docker pull` 可以

azure - AKS RBAC - 角色绑定(bind)无效

kubernetes - 如何将 Google Container Engine 中的自定义指标记录到 Stackdriver?