kubernetes之Pod中的容器共享进程Namespace
简介
此文讲述如何配置Pod中的容器恭喜共享进程Namespace。当进程名称空间共享被激活,在同一个Pod中,一个容器的进程可以在其他容器中看到。可以使用此功能来配置协作容器,例如日志处理程序sidecar容器,或对不包含调试实用程序(例如shell)的容器映像进行故障排除。在Kubernetes v1.17中已处于稳定状态。
备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。
配置Pod共享进程Namespace
使用shareProcessNamespace
激活进程Namespace共享。例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: shell
image: busybox
securityContext:
capabilities:
add:
- SYS_PTRACE
stdin: true
tty: true
1、在集群中创建nginx
Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: shell
image: busybox
securityContext:
capabilities:
add:
- SYS_PTRACE
stdin: true
tty: true
创建Pod
# kubectl apply -f /root/k8s-example/pods/share-process-namespace.yaml
2、将 shell
容器附加到nginx
容器上,运行ps
命令
# kubectl attach -it nginx -c shell
输出内容如下:
/ # ps ax
PID USER TIME COMMAND
1 root 0:00 /pause
6 root 0:00 nginx: master process nginx -g daemon off;
11 101 0:00 nginx: worker process
12 root 0:00 sh
18 root 0:00 ps ax
可以用信号通知其他容器中的进程。 例如,将SIGHUP
发送到nginx以重新启动worker
进程。 这需要SYS_PTRACE
功能。
/ # kill -HUP 6
/ # ps ax
PID USER TIME COMMAND
1 root 0:00 /pause
6 root 0:00 nginx: master process nginx -g daemon off;
12 root 0:00 sh
19 101 0:00 nginx: worker process
20 root 0:00 ps ax
甚至可以使用/proc/$pid/root
链接访问另一个容器映像。
/ # head /proc/6/root/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
理解进程Namepsace共享
Pod可以共享很多资源,例如共享进程名称空间。不过,某些容器图片可能会与其他容器隔离,因此了解这些差异很重要:
- 容器的进程不再有
PID 1
。一些容器在没有PID 1
进程或运行诸如kill -HUP 1之类的命令来发出容器进程信号拒绝启动(例如:,容器使用systemd
)在具有共享进程名称空间的Pod中,kill -HUP 1
将向Pod沙箱发出信号。 (在以上示例中为/ pause
。) - 进程对Pod中的其他容器可见。 这包括
/proc
中所有可见的信息,例如作为参数或环境变量传递的密码。 这些仅受常规Unix权限保护。 - 容器文件系对Pod中其他容器通过
/proc/$pid/root
链接。这使调试更加容易,但是这也意味着文件系统秘密仅受文件系统许可权保护。