Доступ к сетевому файлу в кластере GKE - пул узлов Windows

Мы контейнеризуем приложение dotnet в кластере GKE (пул узлов Windows). У нас есть требование, согласно которому несколько модулей могут получить доступ к одному и тому же общему пространству (постоянному тому). Также он должен поддерживать режим доступа "ReadWriteMany". Мы рассмотрели вариант ниже:

  1. Постоянный диск GCE, к которому обращается постоянный том.(Он не поддерживает ReadWriteMany. Доступ к диску может иметь только один модуль).
  2. Общий сетевой файловый ресурс (NFS). В настоящее время не поддерживается для пулов узлов Windows.
  3. Filestore подходит для решений, но дорого и управляется Google.

Мы ищем другие варианты, соответствующие нашим требованиям. Пожалуйста помоги.

2 ответа

Вы правы, говоря, что NFS еще не поддерживается в Windows, по крайней мере, не для встроенного клиента v4. Так что, пока нет поддержки NFS v4, команда Kubernetes не могла начать эту работу в k8s. источник

С этим ограничением единственным решением, которое я вижу, остается Filestore.

Я пытался решить ту же проблему - доступ к общей файловой системе из двух модулей Windows (приложение ASP.NET в консольном приложении IIS +). Мне не удалось использовать Filestore, потому что для этого требуется NFSClient (Install-WindowsFeature NFS-Client), и я не смог установить его в контейнеры (во время сборки контейнера или во время выполнения), так как он требует перезагрузки компьютера - возможно, мне здесь не хватает чего-то.

Варианты, которые я нашел:

  1. Если вам нужно создать простое временное демонстрационное приложение, которое может работать на одной виртуальной машине, вы можете запустить оба модуля на одном экземпляре, создать постоянный диск, присоединить его к экземпляру с помощью gcloud compute instances attach-disk, RDP в экземпляр, смонтируйте диск и предоставьте диск модулям в качестве hostPath. Это решение, которое я использую сейчас.

  2. Создайте общий ресурс SMB (на отдельной виртуальной машине или с помощью контейнера Docker. https://hub.docker.com/r/dperson/samba/ и получить к нему доступ из модулей, используя New-SmbMapping -LocalPath $shareletter -RemotePath $dhcpshare -Username $shareuser -Password $sharepasswd -Persistent $true. Это решение работало для моего консольного приложения, но веб-приложение не могло получить доступ к файлам (хотя я настроил пул приложений в IIS для работы как локальная система). SMB также можно смонтировать из экземпляра с помощьюNew-SmbGlobalMapping- это делает flexvolume https://github.com/microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows. Я не исследовал этот вариант и думаю, что у него будет такая же проблема (IIS не видит файлы).

  3. Я думаю, что лучшим (наиболее безопасным и надежным) решением было бы настроить контроллер домена Active Directory и общий ресурс SMB на отдельной виртуальной машине и предоставить к нему доступ к контейнерам с помощью gMSA: https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccountshttps://kubernetes.io/docs/tasks/configure-pod-container/configure-gmsa/ Это непросто.