Разница между привилегированным режимом Docker и контейнером привилегий kubernetes

В чем разница в привилегиях, предоставленных контейнеру в следующих двух сценариях

  1. sudo docker run -d --privileged --pid=host alpine:3.8 tail -f /dev/null
  2. Использование кубернетов
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

Очевидно, что когда контейнер привилегий создается напрямую с помощью докера, он может видеть процессы хоста, но когда он запускается с использованием кубернетов, он может видеть только некоторые из процессов. В чем причина этого?

1 ответ

Решение

Редактировать:

Я вижу у тебя есть --pid=host в docker run команда и hostPID: trueв kubernetes pod spec. В этом случае оба числа должны быть одинаковыми, если контейнеры работают на одном хосте. Проверьте, работают ли контейнеры на одном хосте или нет. Kubernetes мог запланировать pod на другом узле.


Предыдущий ответ

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

В приведенной выше команде вы используете --pid=host аргумент, который запускает контейнер в пространстве имен pid хоста. Таким образом, вы можете просматривать все процессы на хосте. Вы можете добиться того же с помощью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, пространстве имен сети и т. Д. Таким образом, вы не увидите хост-процессы внутри контейнера даже при работе в привилегированном режиме. Ты можешь использоватьhostPID, hostNetwork, hostIPCполя спецификации пода в Kubernetes, если вы хотите работать в пространстве имен хоста.

Другие вопросы по тегам