Почему cap_net_bind_service не работает в этом вложенном контейнере Docker nginx?
Контроллер входящего трафика nginx для Kubernetes использует возможность cap_net_bind_service, которая является атрибутом файловой системы Linux, для получения разрешений на открытие привилегированного порта (порт 80). Однако у меня есть добрый тест, который создает локальный кластер Kubernetes, используя контейнеры докеров в качестве виртуальных узлов (докер внутри докеров), и запускает модуль контроллера входящего трафика nginx. Этот модуль контроллера отлично работает в Docker Desktop в Windows 10, но когда я запускаю тот же тест в Linux, модуль контроллера несколько раз дает сбой при запуске с:
[17:27:34]nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
Тем не менее, необходимая возможность существует во вложенном контейнере Docker:
$ allpods=$(kubectl get pods)
$ ingresspod=$(echo "$allpods"|grep '^nginx-ingress-controller'|head -n1)
$ kubectl exec "${ingresspod%% *}" -- getcap -v /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx = cap_net_bind_service+ep
SELinux включен, но находится в разрешающем режиме на хосте Linux.
1 ответ
Это оказалось потому, что на хосте Linux dockerd
был запущен с --no-new-privileges
вариант.