Docker desktop for windows 部署kind容器使用共享NFS卷

备注

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

在 Docker Desktop for windows 实践物理主机目录 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 服务提供存储目录

1
2
3
        IPTABLES_DIR="/home/xfhuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
        DOCS_DIR="/home/xfhuang/docs"
        docker run -itd --privileged  -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
  • 采用  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 export , itsthenetwork/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 mount  卷  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
–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 卷,待实践

nfs 部署 storageclass

1
2
3
git clone https://github.com/kubernetes-incubator/external-storage.git
cd external-storage/nfs-client/deploy
kubectl apply -f rbac.yaml

部署 nfs client 插件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
spec:
  serviceAccountName: nfs-client-provisioner
  containers:
    - name: nfs-client-provisioner
      image: k8s.dockerproxy.com/sig-storage/nfs-subdir-external-provisioner:v4.0.2
      volumeMounts:
        - name: nfs-client-root
          mountPath: /persistentvolumes
      env:
        - name: PROVISIONER_NAME
          value: fuseim.pri/ifs
        - name: NFS_SERVER
          value: 192.168.8.220 # nfs 服务器ip
        - name: NFS_PATH
          value: /root/work/storage/nfs # 存储地址
  volumes:
    - name: nfs-client-root
      nfs:
        server: 192.168.8.220 # nfs 服务器ip
        path: /root/work/storage/nfs # 存储地址

3. 创建 pvc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes: # 策略
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi # 请求空间大小

创建

1
kubectl  apply -f test-claim.yaml

查看 pvc

1
2
3
[root@node3 deploy]# kubectl  get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-2febc25a-d2b0-11e9-9623-000c29b3776e   1Mi        RWX            managed-nfs-storage   14s

4. 部署测试 pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: nginx
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc # 绑定pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc #pvc 通过pvc 动态创建pv
      persistentVolumeClaim:
        claimName: test-claim

创建 测试 pod

1
kubectl  apply -f test-pod.yaml

查看 pod

1
2
[root@node3 deploy]# kubectl  get pod | grep pod
test-pod                                  0/1     Completed   0          81s

查看 pv 是否动态创建:

1
2
3
[root@node3 deploy]# kubectl  get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-e78d0817-d2b0-11e9-9623-000c29b3776e   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            22m

好了是不是用起来很方便,还有其他的很多存储可以测试自己搞一套试试。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up