Монтирование тома NFS в Google Container Engine с ОС Container (COS)
После переноса типа образа из container-vm в cos для узлов кластера GKE, кажется, больше невозможно смонтировать том 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
Монтирование тома NFS в модуле работает в пуле с типом изображения container-vm
но не с 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
2 ответа
Я использовал решение @saad-ali, упомянутое выше, из проекта kubernetes, чтобы сделать эту работу.
Чтобы быть конкретным, я добавил следующее в мой cloud-config:
# 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, загружен с сайта: 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
Это работает. Безобразно, черт возьми, но пока придется.
Мартин, вы настраиваете монтирование вручную (выполняете монтирование самостоятельно), или вы позволяете kubernetes делать это от вашего имени через модуль, ссылающийся на том NFS?
Бывший не будет работать. Позже будет. Как вы обнаружили, COS не поставляется с клиентскими библиотеками NFS, поэтому GKE справляется с этим, устанавливая chroot (в /home/kubernetes/containerized_mounter/rootfs) с необходимыми двоичными файлами и вызывая монтирование внутри них.