【问题标题】:Can pods in Kubernetes see/access the processes of other containers running in the same pod?Kubernetes 中的 Pod 可以查看/访问在同一个 Pod 中运行的其他容器的进程吗?
【发布时间】:2015-11-04 08:33:49
【问题描述】:

在 Kubernetes 文档 Pods 的此页面上,它声明

pod 的上下文可以定义为几个 Linux 命名空间的结合:

PID 命名空间(pod 内的应用程序可以看到彼此的进程) 网络命名空间(pod内的应用程序可以访问相同的IP和端口空间)

IPC 命名空间(pod 内的应用程序可以使用 SystemV IPC 或 POSIX 消息队列进行通信)

UTS 命名空间(pod 内的应用程序共享一个主机名)

但是,它接着说

就 Docker 构造而言,一个 pod 由一组具有共享卷的 Docker 容器并置。 Docker 尚未实现 PID 命名空间共享。

那么这是否意味着 pod 不能看到其他容器中的进程或在同一个 pod 中运行的容器之间执行任何类型的 IPC?如何向另一个 pod 中运行的进程发送信号?

【问题讨论】:

    标签: kubernetes ipc


    【解决方案1】:

    是的,我们希望他们可以共享 PID 命名空间,但正如您所说,Docker 目前不支持它。一旦我们在 Docker 中获得支持,我们将迅速将其添加到 Kubernetes。

    这意味着您不能使用信号来向 Pod 中的其他进程发出信号。

    但是,您可以使用 IPC 机制,例如管道和共享内存。

    【讨论】:

    • 我认为现在 docker 支持加入现有的 pid uts ipc NS,对吗?
    【解决方案2】:

    这是否意味着 Pod 不能看到其他容器中的进程或在同一个 Pod 中运行的容器之间执行任何类型的 IPC?

    这正是“Docker 尚未实现 PID 命名空间共享”的意思。 Kubernetes“pods”只是 Docker 容器的集合,所以如果你不能在直接的 Docker 中做,你就不能在 Kubernetes 中做。

    pod 中的容器do 共享一个网络命名空间,因此您可以将侦听套接字绑定到localhost 并从 pod 中的任何容器访问它。可能这可以用于容器间 ipc/signalling。

    【讨论】:

      【解决方案3】:

      这是否意味着 pod 无法看到其他容器中的进程或在同一 pod 中运行的容器之间执行任何类型的 IPC?

      最近的Kubernetes 1.12 (Q3 2018) announcements 包括:

      可配置的 pod 进程命名空间共享正在进入测试阶段,这意味着用户可以通过在 PodSpec 中设置选项来配置 pod 内的容器以共享公共 PID 命名空间

      请参阅kubernetes/feature 495“可配置 Pod 进程命名空间共享”(及其PR 66507commit 8ebc84e)和its documentation:“Share Process Namespace between Containers in a Pod”。

      警告:

      1. 容器进程不再具有 PID 1。 一些容器镜像拒绝在没有 PID 1 的情况下启动(例如,使用 systemd 的容器)或运行像 kill -HUP 1 这样的命令来向容器进程发出信号。 在具有共享进程命名空间的 pod 中,kill -HUP 1 将向 pod 沙箱发出信号。

      2. 进程对 pod 中的其他容器可见。 这包括/proc 中可见的所有信息,例如作为参数或环境变量传递的密码。这些仅受常规 Unix 权限保护。

      3. 容器文件系统通过/proc/$pid/root 链接对 pod 中的其他容器可见。 这使调试更容易,但也意味着文件系统机密仅受文件系统权限保护。

      【讨论】:

        【解决方案4】:

        pod 中的容器可以使用 sysV 共享内存(shmget() shmat())和(一旦 docker 正确支持)POSIX 共享内存。我们唯一不能做的事情是 signal() 和 ptrace() 并在 /proc 中查看进程

        【讨论】:

        • 我认为这没有改变?
        • 我了解共享 PID 空间在 Kube 1.10 中是可选的(即将推出)
        【解决方案5】:

        如果 Pod 规范中的 shareProcessNamespace 属性设置为 true,则 POD 中的所有容器共享 PID 命名空间。因此,一个容器中的进程可以向另一个容器中的进程发送信号。

        https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#pod-v1-core

        【讨论】:

          猜你喜欢
          • 2015-08-21
          • 1970-01-01
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 2020-05-13
          • 2021-12-30
          • 1970-01-01
          相关资源
          最近更新 更多