Docker特权模式和Kubernetes特权容器的区别

4

以下两个场景中,容器获得的特权授权有何区别?

  1. sudo docker run -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

在第二种情况下,
[root@localhost /]# ps -ef | wc -l
266

显然,当直接使用Docker实例化特权容器时,它能够查看主机的进程,但是当使用Kubernetes启动时,它只能查看少量的进程。这背后的原因是什么?

1个回答

3

编辑:

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


上一个答案

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

在上面的命令中,您使用了--pid=host参数,该参数在主机pid名称空间中运行容器。因此,您可以查看主机上的所有进程。您可以在Kubernetes中的pod规范中使用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的pod spec中使用hostPIDhostNetworkhostIPC字段。


谢谢您的回复。但是我已经在我的Pod规范中设置了hostPID: true。 - himadri
1
啊,我漏看了。那就没有问题了。除非它们在不同的节点上运行,否则两者应该报告相似的数字。你的k8s版本是多少,集群中有多少个节点? - Shashank V
它们正在同一节点上运行。 - himadri
2
我的错,第二个容器是在主机上的虚拟机中运行,因此它只显示来自虚拟机内部的进程。 - himadri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接