docker特权模式和kubernetes特权容器的区别

Difference between docker privileged mode and kubernetes privilege container

下面2种情况下授予容器的权限有什么区别

  1. sudo docker 运行 -d --privileged --pid=host alpine:3.8 tail -f /dev/null
  2. 使用 kubernetes
apiVersion: v1
kind: Pod
metadata:
  name: nsenter-alpine
spec:
  hostPID: true
  containers:
    - name: nsenter-alpine
      image: alpine:3.8
      resources:
        limits:
          cpu: "500m"
          memory: "200Mi"
        requests:
          cpu: "100m"
          memory: "100Mi"
      command: ["tail"]
      args: ["-f", "/dev/null"]
      securityContext:
        privilege: true

情况 1)

/ # ps -ef | wc -l
604

情况 2)

[root@localhost /]# ps -ef | wc -l
266

很明显,当使用 docker 直接实例化特权容器时,它能够看到主机的进程,但是当它使用 kubernetes 启动时,它只能看到少数进程。背后的原因是什么?

编辑:

我看到您在 docker run 命令中有 --pid=host,在 kubernetes pod 规范中有 hostPID: true。在这种情况下,如果容器 运行ning 在同一主机上,则两个数字应该相似。检查容器是否 运行ning 在同一主机上。 Kubernetes 可能已将 pod 调度到不同的节点。


上一个答案

sudo docker run -d --privileged --pid=host alpine:3.8 tail -f /dev/null

在上面的命令中,您使用的是 --pid=host 参数,它是 运行 在主机 pid 命名空间中连接容器。所以你可以查看主机上的所有进程。您可以在 kubernetes 的 pod spec 中使用 hostPID 选项实现相同的效果。


运行特权模式下的容器意味着容器中的进程本质上等同于主机上的root。默认情况下,不允许容器访问主机上的任何设备,但“特权”容器可以访问主机上的所有设备。

$ kubectl exec -it no-privilege ls /dev
core             null             stderr           urandom
fd               ptmx             stdin            zero
full             pts              stdout
fuse             random           termination-log
mqueue           shm              tty
$ kubectl exec -it privileged ls /dev
autofs              snd                 tty46
bsg                 sr0                 tty47
btrfs-control       stderr              tty48
core                stdin               tty49
cpu                 stdout              tty5
cpu_dma_latency     termination-log     tty50
fd                  tty                 tty51
full                tty0                tty52
fuse                tty1                tty53
hpet                tty10               tty54
hwrng               tty11               tty55
...

容器仍然运行在它自己的 pid 命名空间、ipc 命名空间和网络命名空间 等中。因此即使 运行宁在特权模式下。如果您想在主机命名空间中使用 运行,则可以在 Kubernetes 中使用 hostPIDhostNetworkhostIPC 字段 pod spec