Kubernetes的nginx 入口控制器使用 cap_net_bind_service 能力(一个 Linux 文件系统属性)来获取打开特权端口(端口 80)的权限。但是,我有一个测试,它使用 docker 容器作为虚拟节点(docker inside docker)创建一个本地 Kubernetes 集群,并启动一个 nginx 入口控制器 pod。此控制器 pod 在 Windows 10 上的 Docker Desktop 中运行良好,但是当我在 Linux 上运行相同的测试时,控制器 pod 在启动时反复崩溃,并出现:
[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 主机上处于许可模式。