(未成功)Docker Desktop for mac部署kind容器使用共享NFS卷

警告

本文方案实践尚未成功,可能是因为 Docker Desktop for mac 的物理主机文件系统 APFS 加密文件系统 影响。所以后续我准备切换到 X86移动云Kind(本地docker模拟k8s集群) 再做实践。

Docker容器使用NFS 使用 Docker systemd进程管理器 来运行NFS服务器,和本文区别仅是 init 差异,所以应该也解决不了Docker卷的 does not support NFS export 问题。

备注

我在 Docker 卷 学习过程仔细阅读了Docker官方文档 docker docs: Storage >> Volumes 发现:

在 Docker Desktop for mac 实践物理主机目录 mount 到容器内部再 NFS sharing 目前没有成功 ,我改变方案,采用 (正在探索)Docker Desktop for mac部署kind容器通过 SSH Tunnel 使用共享NFS卷

在kind运行简单的容器 访问共享的NFS可以部署一种共享数据的发布模式:

  • 容器内部不需要复制发布的文件,对于静态WEB网站会非常容易实现无状态pod部署

  • 数据更新可以在中心化的 nfs服务 存储上实现,方便 DevOps Atlas 持续部署

我在 Docker Desktop for mac 端口转发(port forwarding) 基础上进一步设置 dev-gw 容器提供NFS服务

准备工作

  • 调整 dev-gw 容器运行命令,将物理主机的 docs 目录作为卷映射到 dev-gw 内部:

运行 dev-gw 容器: 物理主机的docs目录被卷映射进 dev-gw 为后续NFS服务提供存储目录
IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"

docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
        --cap-add=NET_ADMIN --cap-add=NET_RAW \
        --mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
        -v  ${DOCS_DIR}:/docs \
        --hostname dev-gw --name dev-gw fedora-gw

NFS服务配置

  • 采用 Ubuntu NFS部署 相似方法配置NFS服务,在 dev-gw 容器内部修改配置文件 /etc/exports 内容:

运行 dev-gw 容器内部添加 /etc/exports
/docs *(rw,sync,no_root_squash,no_subtree_check)
  • 在容器内部运行启动NFS服务进行验证:

    exportfs -a
    rpcbind
    rpc.statd
    rpc.nfsd
    rpc.mountd
    

异常排查

执行 exprotfs -a 提示错误:

exportfs: /docs does not support NFS export

执行 rpc.nfsd 提示错误:

rpc.nfsd: Unable to request RDMA services: Protocol not supported
运行 dev-gw 容器: 卷 docs 以及增加运行参数 --privileged
IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"

docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
        --cap-add=NET_ADMIN --cap-add=NET_RAW \
        --mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
        --privileged \
        -v  ${DOCS_DIR}:/docs \
        --hostname dev-gw --name dev-gw fedora-gw

不过, --privileged 参数不能解决 exportfs: /docs does not support NFS exportitsthenetwork/nfs-server-alpine 提到了 OverlayFS 不支持NFS输出,需要使用 Docker 卷 挂载到容器内部。不过,我确实是使用了:

DOCS_DIR="/Users/huataihuang/docs"
docker run ... -v  ${DOCS_DIR}:/docs ...

参考 directory does not support NFS #61 ,我尝试改为 bind mount :

运行 dev-gw 容器: 使用 bind mountdocs 以及增加运行参数 --privileged
IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"

docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
        --cap-add=NET_ADMIN --cap-add=NET_RAW \
        --mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
        --privileged \
        --mount type=bind,source=${DOCS_DIR},target=/docs \
        --hostname dev-gw --name dev-gw fedora-gw

但是报错依旧是 exportfs: /docs does not support NFS export

备注

我怀疑在 macOS 上运行的 Docker Desktop for mac 的底层文件系统 APFS 加密文件系统 影响了容器化运行NFS输出,所以我后续准备在 X86移动云Kind(本地docker模拟k8s集群) 重新实践(底层使用 ZFS)

备注

docker docs: Volumes 应该能够直接创建自带NFS输出的Docker卷,待实践

参考