【问题标题】:Difference between docker privileged mode and kubernetes privilege containerdocker特权模式和kubernetes特权容器的区别
【发布时间】:2020-05-13 01:27:35
【问题描述】:

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

  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

情况2)

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

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

【问题讨论】:

    标签: docker kubernetes nsenter


    【解决方案1】:

    编辑:

    我看到你在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 spechostPIDhostNetworkhostIPC 字段。

    【讨论】:

    • 感谢您的回复。但是我的 pod 规范中已经有了 hostPID: true。
    • 啊,我错过了。那我看不出有什么问题。两者都应该报告相似的数字,除非它们在不同的节点上运行。你的k8s版本是多少,集群有多少个节点?
    • 它们在同一个节点上运行。
    • 我的错,第二个容器在主机上的虚拟机内运行,因此它只显示虚拟机内的进程。
    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2016-07-25
    • 2018-03-25
    相关资源
    最近更新 更多