首页 文章

Kubernetes中的pod可以查看/访问在同一个pod中运行的其他容器的进程吗?

提问于
浏览
6

在Kubernetes docs Pods的这个页面上,它说明了这一点

pod的上下文可以定义为几个Linux命名空间的结合:PID命名空间(pod中的应用程序可以看到彼此的进程)网络命名空间(pod中的应用程序可以访问相同的IP和端口空间)IPC命名空间( pod中的应用程序可以使用SystemV IPC或POSIX消息队列进行通信)UTS名称空间(pod中的应用程序共享主机名)

然而,它然后说

就Docker构造而言,pod包含一组共享卷的共处理Docker容器 . Docker尚未实现PID命名空间共享 .

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

4 回答

  • 2

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

    这意味着您无法使用信号来发信号通知Pod中的其他进程 .

    但是,您可以使用管道和共享内存等IPC机制 .

  • 1

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

    这正是“使用Docker尚未实现PID命名空间共享”的含义 . Kubernetes“pods”只是Docker容器的集合,所以如果你不能在直接的Docker中做到这一点,你就无法在Kubernetes中完成 .

    pod中的容器确实共享网络命名空间,因此您可以将侦听套接字绑定到 localhost 并从该pod中的任何容器访问它 . 可能这可以用于容器间ipc /信令 .

  • 3

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

  • 0

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

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

    可配置的pod进程命名空间共享正在转向beta,这意味着用户可以通过在PodSpec中设置选项来配置pod中的容器以共享公共PID命名空间 .

    请参见kubernetes/feature 495 "Configurable Pod Process Namespace Sharing"(及其PR 66507commit 8ebc84e)和its documentation:“Share Process Namespace between Containers in a Pod” .

    警告,有这个:

    容器进程不再具有PID 1.某些容器映像在没有PID 1的情况下拒绝启动(例如,使用systemd的容器)或运行kill -HUP 1之类的命令来发信号通知容器进程 . 在具有共享进程名称空间的pod中,kill -HUP 1将发出pod沙箱的信号 . 进程对于pod中的其他容器是可见的 . 这包括/ proc中可见的所有信息,例如作为参数或环境变量传递的密码 . 这些只受常规Unix权限的保护 . 容器文件系统通过/ proc / $ pid / root链接对pod中的其他容器可见 . 这使得调试更容易,但这也意味着文件系统机密仅受文件系统权限的保护 .

相关问题