Почему 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 вариант.

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