Powershell 在交换暂存/生产插槽(交换VIP)之前,是否正在等待新部署完全初始化?

Powershell 在交换暂存/生产插槽(交换VIP)之前,是否正在等待新部署完全初始化?,powershell,azure,Powershell,Azure,我使用以下代码将新部署的应用程序从暂存插槽交换到生产插槽(交换VIP): 我认为,-WaitToComplete标志将确保所有虚拟机在执行交换之前都已完全初始化,但是它没有,并且它执行交换,此时生产槽中新部署的应用程序仍在初始化,并且在完全初始化时大约5/10分钟不可用 在执行交换VIP操作之前,确保应用程序完全初始化的最佳方法是什么?我猜您实际看到的可能是DNS条目传播和可用所需的延迟 您应该发现,一旦状态报告为就绪,您可能无法使用登台URL访问您的站点”http://.cloudapp.ne

我使用以下代码将新部署的应用程序从暂存插槽交换到生产插槽(交换VIP):

我认为,-WaitToComplete标志将确保所有虚拟机在执行交换之前都已完全初始化,但是它没有,并且它执行交换,此时生产槽中新部署的应用程序仍在初始化,并且在完全初始化时大约5/10分钟不可用


在执行交换VIP操作之前,确保应用程序完全初始化的最佳方法是什么?

我猜您实际看到的可能是DNS条目传播和可用所需的延迟

您应该发现,一旦状态报告为就绪,您可能无法使用登台URL访问您的站点”http://.cloudapp.net“你会发现它可能不会出现。。。但是,如果您查看管理门户,您将在属性的底部看到“VIP”的值-如果您使用该IP地址“http://xxx.xxx.xxx.xxx 您应该能够访问您的站点

当您进行交换时,您会发现类似的行为。DNS更新需要一些时间才能传播,但您可能会看到,您仍然可以使用IP地址或登台地址(如果已可用)访问站点

最后,一个问题…根据您的问题,您可能会将部署到暂存作为构建的一部分,然后立即升级到生产部署…这是否正确,如果正确,为什么不直接部署到生产部署?(我并不是说直接部署到生产环境中是一种最佳做法……但如果这是您的工作流程,我认为临时部署到暂存环境没有任何好处)


希望这能有所帮助!

我猜您实际看到的可能是DNS条目传播和可用所需的延迟

您应该发现,一旦状态报告为就绪,您可能无法使用登台URL访问您的站点”http://.cloudapp.net“您会发现它可能不会出现……但是如果您查看管理门户,您会在属性的底部看到一个‘VIP’值—如果您使用该IP地址”http://xxx.xxx.xxx.xxx 您应该能够访问您的站点

当您进行交换时,您会发现类似的行为。DNS更新需要一些时间才能传播,但您可能会看到,您仍然可以使用IP地址或登台地址(如果已可用)访问站点

最后,一个问题…根据您的问题,您可能会将部署到暂存作为构建的一部分,然后立即升级到生产部署…这是否正确,如果正确,为什么不直接部署到生产部署?(我并不是说直接部署到生产环境中是一种最佳做法……但如果这是您的工作流程,我认为临时部署到暂存环境没有任何好处)


希望这能有所帮助!

我对PowerShell不是很熟悉,但根据我对Shell的经验,您可以使用管道命令。管道字符(|)前面的每一组代表一个命令,该命令将其结果传递给管道中的下一个命令(管道字符后面的命令)。由于您在解聚完全完成之前执行这些命令,因此您将新部署的应用程序切换到生产槽

这里首先要注意的是,对于最后一个命令,实际上是Get OperationStatus,您有“-WaitToComplete”参数

我看到的另一件事是,这个powershell命令只会执行vip交换。部署呢

从您描述的情况来看,您的构建服务器似乎是自动部署到登台的,并且您有执行交换脚本的构建后事件。如果您的流程是这样的,那么Mike Erickson在这里的建议是有意义的-在部署到登台后立即交换。如果您要在不使用ch的情况下进行交换,为什么要部署到登台首先检查应用程序运行状况?但是我不建议直接解聚到服务器(删除+部署),但这是一个服务升级。因为当我们进行服务升级时,我们的部署会保留其公共IP地址。如果我们删除+部署,我们将获得一个新的公共IP地址。并且已保证在删除部署之前不会更改托管服务的公共IP地址

最后,您应该稍微扩展一下PowerShell脚本。首先包括一个例程,该例程将检查(并等待)暂存槽是否“就绪”,然后执行交换。正如我所说,我对PowerShell不太了解,但我相信这是可行的

只要我的2美分

更新

再次访问后,我现在了解到一些情况。您正在等待操作完成,但这是您正在等待完成的VIP-SWAP操作。如果您的部署尚未准备就绪,您必须等待它准备就绪。此外,正如Mike提到的,可能会有DNS延迟,这一点在最后指出:

注意:

如果您在推广后不久访问生产站点,DNS 名称可能未准备好。如果遇到DNS错误(404),请稍候 几分钟后重试。请记住,Windows Azure会创建DNS 动态命名条目,更改可能需要几分钟 传播

更新2


嗯,您必须查询所有角色及其所有实例,并等待它们全部就绪。技术上,您可以在每个角色至少有一个实例就绪的情况下进行VIP交换,但我认为这会使脚本更加复杂。

我对PowerShell不是很熟悉,但根据我使用shells的经验
Get-HostedService -serviceName $serviceName -subscriptionId $subcription -certificate $certificate | Get-Deployment -slot staging | Move-Deployment |Get-OperationStatus –WaitToComplete
$hostedService = "YOUR_SERVICE_NAME"

do {
    # query the status of the running instances
    $list = (Get-AzureRole -ServiceName $hostedService `
                           -Slot Staging `
                           -InstanceDetails).InstanceStatus 

    # total number of instances
    $total = $list.Length

    # count the number of ready instances
    $ready = ($list | Where-Object { $_ -eq "ReadyRole" }).Length

    Write-Host "$ready out of $total are ready"

    $notReady = ($ready -ne $total)
    If ($notReady) {
        Start-Sleep -s 10
    }
}
while ($notReady)
$hostedService = "YOUR_SERVICE_NAME"
# Wait roughly 10 minutes, plus time required for Azure methods
$remainingTries = 6 * 10

do {
    $ready=0
    $total=0
    $remainingTries--

    # query the status of the running instances
    $list = (Get-AzureRole -ServiceName $hostedService -Slot Staging -InstanceDetails).InstanceStatus 

    # count the number of ready instances
    $list | foreach-object { IF ($_ -eq "ReadyRole") { $ready++ } }

    # count the number in total
    $list | foreach-object { $total++ } 

    "$ready out of $total are ready"

    if (($ready -ne $total) -and ($remainingTries -gt 0)) {
        # Not all ready, so sleep for 10 seconds before trying again
        Start-Sleep -s 10
    }
    else {
        if ($ready -ne $total) {
            throw "Timed out while waiting for service to be ready: $hostedService"
        }

        break;
    }
}
while ($true)