在使用Container OS(COS)的Google容器引擎中挂载NFS卷

3

在将GKE集群节点的镜像类型从container-vm迁移到cos之后,似乎不再可能为pod挂载NFS卷。

问题似乎是缺少NFS客户端库,因为我尝试了所有COS版本的挂载命令(cos-stable-58-9334-62-0,cos-beta-59-9460-20-0,cos-dev-60-9540-0-0)都失败了。

sudo mount -t nfs mynfsserver:/myshare /mnt

执行失败

mount: wrong fs type, bad option, bad superblock on mynfsserver:/myshare,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

但是这与此处列出的支持的卷类型相矛盾: https://cloud.google.com/container-engine/docs/node-image-migration#storage_driver_support 在一个使用镜像类型为container-vm的池中,在pod中挂载NFS卷是可行的,但在使用cos时却不行。
在使用cos时,当我执行kubectl describe pod命令时,会收到以下消息:
MountVolume.SetUp failed for volume "kubernetes.io/nfs/b6e6cf44-41e7-11e7-8b00-42010a840079-nfs-mandant1" (spec.Name: "nfs-mandant1") pod "b6e6cf44-41e7-11e7-8b00-42010a840079" (UID: "b6e6cf44-41e7-11e7-8b00-42010a840079") with: mount failed: exit status 1
Mounting command: /home/kubernetes/containerized_mounter/mounter
Mounting arguments: singlefs-1-vm:/data/mandant1 /var/lib/kubelet/pods/b6e6cf44-41e7-11e7-8b00-42010a840079/volumes/kubernetes.io~nfs/nfs-mandant1 nfs []
Output: Mount failed: Mount failed: exit status 32
Mounting command: chroot
Mounting arguments: [/home/kubernetes/containerized_mounter/rootfs mount -t nfs singlefs-1-vm:/data/mandant1 /var/lib/kubelet/pods/b6e6cf44-41e7-11e7-8b00-42010a840079/volumes/kubernetes.io~nfs/nfs-mandant1]
Output: mount.nfs: Failed to resolve server singlefs-1-vm: Temporary failure in name resolution

1
'cos' 上似乎存在 DNS 问题。如果我在定义持久卷时使用 NFS 服务器的 IP 地址,则 'cos' 上也可以正常工作。 - Martin Weindel
我有同样的问题,使用直接IP定义卷可以工作,但使用DNS名称无法工作(尝试了主机名、内部DNS名称以及公共DNS)。 - Glenn Vandamme
2个回答

1
我已经借鉴了@saad-ali在kubernetes项目中提到的解决方案,以使其正常工作。
具体来说,我已将以下内容添加到我的云配置文件中:
# This script creates a chroot environment containing the tools needed to mount an nfs drive
- path: /tmp/mount_config.sh
  permissions: 0755
  owner: root
  content: |
    #!/bin/sh
    set +x # For debugging

    export USER=root
    export HOME=/home/dockerrunner
    mkdir -p /tmp/mount_chroot
    chmod a+x /tmp/mount_chroot
    cd /tmp/
    echo "Sleeping for 30 seconds because toolbox pull fails otherwise"
    sleep 30
    toolbox --bind /tmp /google-cloud-sdk/bin/gsutil cp gs://<uploaded-file-bucket>/mounter.tar /tmp/mounter.tar
    tar xf /tmp/mounter.tar -C /tmp/mount_chroot/
    mount --bind /tmp/mount_chroot /tmp/mount_chroot
    mount -o remount, exec /tmp/mount_chroot
    mount --rbind /proc /tmp/mount_chroot/proc
    mount --rbind /dev /tmp/mount_chroot/dev
    mount --rbind /tmp /tmp/mount_chroot/tmp
    mount --rbind /mnt /tmp/mount_chroot/mnt

上传的文件存储桶包含由kube团队创建的chroom镜像,可以从以下链接下载:https://storage.googleapis.com/kubernetes-release/gci-mounter/mounter.tar 然后,云配置的runcmd看起来像这样:
runcmd:
- /tmp/mount_config.sh
- mkdir -p /mnt/disks/nfs_mount
- chroot /tmp/mount_chroot /bin/mount -t nfs -o rw nfsserver:/sftp /mnt/disks/nfs_mount

这个可以运行。虽然很丑,但目前只能这样了。


1

Martin,你是手动设置挂载点(自己执行mount命令),还是让kubernetes通过引用NFS卷的pod代表你进行操作?

前者不起作用。后者可以。正如你发现的那样,COS没有提供NFS客户端库,因此GKE通过在/home/kubernetes/containerized_mounter/rootfs处设置chroot,并在其中调用mount来解决此问题。


Saad,感谢您解释了挂载Pod的NFS卷的机制。 - Martin Weindel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接