Так как при конфигурации DevCluster все ноды располагаются на одной физической машине, производить Rolling-upgrade, когда обновление устанавливается поочерёдно на каждый узел, а приложения мигрируют на соседние, как это происходит при стандартной кластерной конфигурации, не представляется возможным.
Официальным способом обновления в таком случае является удаление кластера и создание нового с той же конфигурацией. Это вызывает ряд проблем, таких как необходимость заново деплоить все приложения.
Для решения проблемы был выработан сценарий, при котором производится обновление DevCluster без потери приложений и их данных.
Команды выполняются локально на машине с развёрнутым SF в PowerShell с правами Администратора:
Подключаемся к кластеру (-ConnectionEndpoint можно не указывать, так как кластер локальный)
Connect-ServiceFabricCluster
Проверяем наличие зарегистрированных пакетов обновлений в кластере
В нашем случае их нет (кроме текущего)
Get-ServiceFabricRegisteredClusterCodeVersion
CodeVersion
-----------
6.1.456.9494
Получаем доступные к обновлению версии SF и ссылки на скачивание пакета обновления
Get-ServiceFabricRuntimeUpgradeVersion -BaseVersion 6.1.456.9494
Version SupportExpiryDate TargetPackageLocation
------- ----------------- ---------------------
6.1.456.9494 30.05.2018 0:00:00 https://download.microsoft.com/download/B/0/B/B0BCCAC5-65AA-4BE3-AB13-D5FF5890F4B5/6.1.456.9494/MicrosoftAzureServiceFabric.6.1.456.9494.cab
6.1.467.9494 30.05.2018 0:00:00 https://download.microsoft.com/download/B/0/B/B0BCCAC5-65AA-4BE3-AB13-D5FF5890F4B5/6.1.467.9494/MicrosoftAzureServiceFabric.6.1.467.9494.cab
6.1.472.9494 https://download.microsoft.com/download/B/0/B/B0BCCAC5-65AA-4BE3-AB13-D5FF5890F4B5/6.1.472.9494/MicrosoftAzureServiceFabric.6.1.472.9494.cab
Скачиваем пакет любым удобным способом
Копируем скачанный пакет в хранилище образов
Copy-ServiceFabricClusterPackage -Code -CodePackagePath .\MicrosoftAzureServiceFabric.6.1.472.9494.cab -ImageStoreConnectionString "fabric:ImageStore"
Регистрируем пакет обновления в SF
Register-ServiceFabricClusterPackage -Code -CodePackagePath MicrosoftAzureServiceFabric.6.1.472.9494.cab
Проверяем доступность нового пакета для обновления
Теперь доступно две версии: 6.1.456.9494, 6.1.472.9494
Get-ServiceFabricRegisteredClusterCodeVersion
CodeVersion
-----------
6.1.456.9494
6.1.472.9494
Запускаем обновление кластера до требуемой версии без Health-check проверок кластера в процессе, так как в процессе обновления и перезагрузки одной ноды перезапускается весь SF (следствие конфигурации DevCluster), в этот момент Health-check показывает недоступность кластера и обновление останавливается
Start-ServiceFabricClusterUpgrade -Code -CodePackageVersion 6.1.472.9494 -UnmonitoredAuto
Следить за прогрессом обновления можно с помощью команды
Get-ServiceFabricClusterUpgrade
TargetCodeVersion : 6.1.472.9494
TargetConfigVersion : 1
StartTimestampUtc : 21.03.2018 14:43:33
UpgradeState : RollingForwardPending
UpgradeDuration : 00:10:04
CurrentUpgradeDomainDuration : 00:00:00
CurrentUpgradeDomainProgress : UD2
NodeName : Node3
UpgradePhase : Upgrading
NextUpgradeDomain : UD2
UpgradeDomainsStatus : { "UD0" = "Completed";
"UD1" = "Completed";
"UD2" = "Pending" }
UpgradeKind : Rolling
RollingUpgradeMode : UnmonitoredAuto
ForceRestart : False
UpgradeReplicaSetCheckTimeout : 49710.06:28:15
При обновлении происходят множественные перезапуски SF, что приводит к недоступности его ConnectionEndpoint и, соответственно, выполнение вышеуказанной команды становится невозможно.
Для выхода из ситуации можно воспользоваться Монитором ресурсов Windows и отслеживать открытые TCP-порты. Когда среди них присутствует порт 19000
, кластер доступен для подключения с помощью Connect-ServiceFabricCluster
.
Во время обновления может потребоваться перезагрузка сервера, если SF долгое время не запускается на порту 19000
.
Также можно запустить обновление в режиме UnmonitoredManual
, в таком случае, после каждой ноды, обновление будет приостанавливаться и ждать ручного продолжения.
Продолжить обновление на следующей ноде, находящейся в Upgrade-домене UD1
Resume-ServiceFabricClusterUpgrade -UpgradeDomainName "UD1"
Изменить режим обновления уже после его запуска:
Update-ServiceFabricClusterUpgrade -UpgradeMode UnmonitoredManual