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、在集群中创建nginxPod

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链接。这使调试更加容易,但是这也意味着文件系统秘密仅受文件系统许可权保护。
posted @ 2020-01-23 16:17  McSiberiaWolf  阅读(1406)  评论(0编辑  收藏  举报