在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 回答
是的,我们希望他们可以共享PID命名空间,但正如您所说,Docker目前不支持它 . 一旦我们在Docker中获得支持,我们将迅速将其添加到Kubernetes .
这意味着您无法使用信号来发信号通知Pod中的其他进程 .
但是,您可以使用管道和共享内存等IPC机制 .
这正是“使用Docker尚未实现PID命名空间共享”的含义 . Kubernetes“pods”只是Docker容器的集合,所以如果你不能在直接的Docker中做到这一点,你就无法在Kubernetes中完成 .
pod中的容器确实共享网络命名空间,因此您可以将侦听套接字绑定到
localhost
并从该pod中的任何容器访问它 . 可能这可以用于容器间ipc /信令 .pod中的容器可以使用sysV共享内存(shmget()shmat())和(一旦docker正确支持它)POSIX共享内存 . 我们唯一不能做的是signal()和ptrace(),并查看/ proc中的进程
最近Kubernetes 1.12 (Q3 2018) announcements确实包括:
请参见kubernetes/feature 495 "Configurable Pod Process Namespace Sharing"(及其PR 66507,commit 8ebc84e)和its documentation:“Share Process Namespace between Containers in a Pod” .
警告,有这个: