Развертывание приложения.Net Core в Linux Service Fabric Cluster
У меня есть приложение Service Fabric, которое было написано в.Net Core. Он работает нормально на локальном кластере SF Windows. Он состоит из одной службы без сохранения состояния без веб-компонента.
Я сейчас пытаюсь развернуть его в Linux SF Cluster. Мне удалось запустить SF в Docker, используя экземпляр service-fabric-onebox.
Я использовал файл entryPoint.sh, полученный из шаблона yeomen azuresfcsharp, и изменил узел программы EntryPoint в файле ServiceManifest.xml. Я также компилирую свой проект, используя dotnet cli и ключ -r ubuntu.16.04-x64.
Теперь, когда я пытаюсь выполнить развертывание в своем кластере SF, я получаю
Error event: SourceId='System.Hosting', Property='CodePackageActivation:Code:EntryPoint'.
There was an error during CodePackage activation.The service host terminated with exit code:32512
Есть идеи?
1 ответ
Я наконец-то понял. Я опубликую ответ здесь, но я также продолжу и пройдусь по всем этапам получения проекта Service Fabric, разработанного в Windows, для запуска на Linux.
Точка входа
В ServiceManifest.xml проекта SF есть узел EntryPoint/ExeHost/Program. В окнах это указывает на исполняемый файл, сгенерированный msbuild. Не так много в Linux.
- Если у вас не установлен npm, установите его.
- Бежать
npm i -g yo
- Бежать
npm i -g generator-azuresfcsharp
- В тестовой папке запустите
yo azuresfcsharp
Когда генератор запустится, он выдаст вам папку проекта SF и папку проекта aC#. Перейдите в проект SF / папку с именем сервиса / код. В этой папке будет два файла с именем entryPoint.sh и dotnet-include.sh
Вам необходимо добавить их в свой проект и установить для них "Содержимое и всегда копировать".
Наконец, в ServiceManifest.xml измените узел EntryPoint/ExeHost/Program на entryPoint.sh
составление
Компиляция с Visual Studio не будет работать, потому что вам нужно ориентироваться на среду выполнения Linux.
Примечание. Прежде чем приступить к компиляции, необходимо понять, как устроен пакет Service Fabric. Лучший способ щелкнуть правой кнопкой мыши по проекту SF в Visual Studio, выбрать пакет, перейти в папку проекта SF в проводнике, перейти к pkg и посмотреть там.
В окне консоли перейдите в папку с файлом csproj создаваемой вами службы. Давайте предположим, что вы создаете свой пакет развертывания в папке с именем pkg
в корне вашего решения. Итак, бегите:
dotnet publish -o ..\pkg\YourServicePkg\Code -r ubuntu.16.04-x64
Обратите внимание - папка в вашем pkg ДОЛЖНА заканчиваться на Pkg.
Другое примечание - посмотрите здесь список времени выполнения, на которое вы можете ориентироваться. Я просто использую unbuntu. Идентификаторы времени выполнения
Завершение пакета
Наконец, для завершения вашего пакета развертывания вам понадобится файл ApplicationManifest.xml в корне папки вашего пакета, файл ServiceManifest.xml из вашего сервисного проекта и папка Config из вашего сервисного проекта. Файлы проекта сервиса можно найти в PackageRoot
Итак, вы будете иметь:
pkg
|
-> ApplicationManifest.xml
-> YourServicePkg
|
-> ServiceManifest.xml
-> Code (This is where you targeted dotnet publish)
-> Config
Среда Linux
Теперь вам нужно где-то запустить его локально. Я использовал докер. Вот ссылка для полной инструкции по установке, но я пойду по основам здесь.
Во-первых, вам нужно обновить конфигурацию вашего docker deamon следующими настройками:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
Затем потяните изображение.
docker pull servicefabricoss/service-fabric-onebox
Вам нужно будет открыть порты 19080 и 19000 с
-p 19080:19080 -p 19000:19000
Если вы использовали диспетчер локальных кластеров Service Fabric в окнах, вам нужно будет щелкнуть правой кнопкой мыши значок на панели задач и выбрать "Удалить кластер". Затем, когда это закончится, вам нужно выйти. Вы должны удалить кластер, иначе происходят странные вещи.
После запуска образа докера откройте его bash и запустите ./setup.sh
, с последующим ./run.sh
Развертывание
Когда SF запускается в Docker, и вы можете перейти на localhost:19080, пришло время для развертывания с PowerShell.
Во-первых, давайте проверим наш пакет, чтобы убедиться, что он действителен.
Test-ServiceFabricApplicationPackage .\pkg\
Если это работает, давайте развернем
Connect-ServiceFabricCluster localhost:19000
Register-ServiceFabricApplicationType -ApplicationPathInImageStore YourService
Remove-ServiceFabricApplicationPackage -ImageStoreConnectionString fabric:ImageStore -ApplicationPackagePathInImageStore YourService
New-ServiceFabricApplication -ApplicationName fabric:/YourService -ApplicationTypeVersion 1.0.0 -ApplicationTypeName YourServiceType
Ваше приложение должно запускаться в Linux.
Важный
Так вот что меня достало, и в результате код выхода: ошибка 32512.
Я использую GitHub, и, видимо, стиль окончания строки установлен в Windows. Поэтому, когда я снял его на другом компьютере, окончания строк были изменены с LF на CR LF.
Чтобы это исправить, мне пришлось открыть нужные файлы в Notepad++ и нажать "Правка" -> "Преобразование EOL" -> "Unix (LF)".
Я должен был сделать это для ApplicationManifest.xml, всех файлов ServiceManifest.xml и всех файлов entryPoint.sh и dotnet-include.sh.