【问题标题】:Is there a safe way to trigger commands in another container in the same Kubernetes pod?是否有一种安全的方法可以在同一个 Kubernetes pod 中的另一个容器中触发命令?
【发布时间】:2020-12-12 07:03:47
【问题描述】:

我正在创建一个代理服务,它接受网络调用并可以在同一 pod 中的任何其他容器中触发命令。当然,这不是 pod 的常见用例,但我知道一些 CI 工具会做类似的事情,例如 Jenkins 和它的 Kubernetes 插件。

目前,我在代理容器中使用 kubectl 并让它运行 kubectl exec <pod> -c <container> -- <command>,它运行良好。但这似乎是漏洞的大好机会。

为了让代理拥有 kubectl exec 访问权限,它需要拥有 pod/exec 的权限,这使其能够访问同一命名空间中的所有 pod。

rules:
- apiGroups: [""]
  resources: ["pods", "pods/exec"]
  verbs: ["get", "list", "watch", "create"]

如果没有更好的方法来解决这个问题,我只会将 exec 命令烘焙到我的代理中,使其只接受对同一个 pod 的调用。

但我最担心的是从代理执行未知代码,它获得的访问权限超出了应有的范围。在 Jenkins 示例中,如果有人有一个管道来测试他们的代码并且他们是恶意的,并且包含一个实际使用 kubernetes-client 库并调用命名空间中的其他 pod 的测试,你将如何防止这种情况同时仍然启用容器到容器的通信?

如果有任何建议,我将不胜感激!

【问题讨论】:

  • 关于您尝试做什么的更多背景信息?在 Kubernetes 上做 CI/CD 管道吗? (Tekton 在这方面做得很好)或者通常,两个容器通信的方式是通过网络端口,但在这里听起来更像是你想把你的容器当作旧的虚拟机?还是用于某种无法通过日志记录、跟踪或其他方式完成的调试?
  • 嘿@Jonas,我正在为我的应用程序构建一个非常轻量级的 CI 组件。在最基本的情况下,它只是拉 src + 创建一个图像。我试图避免使用 tekton 或 argo 管道,但也许你是对的,这可能是最简单的。
  • Tekton 以一种聪明的方式做到了这一点,因此,Pod 中的所有容器都按顺序执行......这样您就可以先拉取,然后构建,然后推送镜像......或者什么你决定你的任务或管道做。

标签: kubernetes


【解决方案1】:

听起来您想在 pod 中执行命令,但又不想访问 kube-apiserver。此外,看起来您的应用程序正在侦听触发器(在某种甚至基于代理或应用程序的情况下)并执行命令。

我的建议是让应用程序 'shell out' 自己运行命令,而不是让 kubectl 在与 exec 的同一个 pod 上运行它.您没有指定您的应用程序是用什么语言编写的,但大多数常用语言都有一个库来执行 exec 系统调用或管理进程。即GolangPython

✌️

【讨论】:

  • 嘿@Rico,对于更多上下文,我有一个带有代理容器的 pod,我可以对它进行网络调用并让它“脱壳”。但我试图克服的挑战是,我希望能够添加具有不同依赖项(例如 python、nodejs)的容器,类似于 Jenkins 使用 pod 模板的方式。代理知道如何接收命令,然后它将在适当的容器上运行它们。由于依赖容器可以是任何东西,我不能为每个容器添加一个监听器来让它们脱壳。
  • 你能使用一个通用的容器镜像来处理你所有的依赖吗?您到底在与 Jenkins 谈论什么可以指定依赖项? pod 模板也不是从容器映像开始的吗?或者你想从一个单独的 pod 开始?但是常规的 jenkins 插件也会调用 kube-apiserver
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 2020-10-24
  • 2019-04-29
  • 2013-12-03
相关资源
最近更新 更多