Разница между привилегированным режимом Docker и контейнером привилегий kubernetes
В чем разница в привилегиях, предоставленных контейнеру в следующих двух сценариях
- sudo docker run -d --privileged --pid=host alpine:3.8 tail -f /dev/null
- Использование кубернетов
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, если вы хотите работать в пространстве имен хоста.