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



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

Get-HostedService -serviceName $serviceName -subscriptionId $subcription -certificate $certificate | Get-Deployment -slot staging | Move-Deployment |Get-OperationStatus –WaitToComplete

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

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

此PowerShell片段将等待,直到每个实例都准备就绪(基于@astaykov给出的答案)。

它查询暂存槽中正在运行的实例的状态,只有当所有实例都显示为"就绪"时,它才会退出循环。

$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)

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

您应该发现,一旦状态报告为Ready,您可能无法使用暂存URL访问您的网站。"http://.cloudapp.net"你会发现它可能不会出现……但如果你查看管理门户,你会在属性的底部看到‘VIP’的值——如果你使用该IP地址"http://xxx.xxx.xxx.xxx你应该能够访问你的网站。

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

最后,有一个问题。。。根据您的问题,听起来您可能会将其部署为构建的一部分,然后立即升级为生产部署。。。这是正确的吗?如果是,为什么不直接部署到生产部署中呢?(我并不是说直接部署到生产中是一种最佳实践……但如果这是你的工作流程,我认为临时部署到阶段没有任何好处)

希望这能有所帮助!

我对PowerShell不是很熟悉,但从我使用shell的经验来看,你是在管道化命令。管道字符(|)之前的每个集合表示一个命令,该命令将其结果传递给管道中的下一个命令(管道字符之后的命令)。因为您在depolyment完全完成之前执行这些命令,所以您可以将新部署的应用程序交换到生产插槽。

这里首先要注意的是,您只为最后一个命令设置了"-WWaitToComplete"参数,该命令实际上是GetOperationStatus。

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

根据您的描述,您的构建服务器似乎正在自动部署到暂存,并且您有执行交换脚本的构建后事件。Mike Erickson在这里提出的建议是有道理的,如果你的流程是这样的话——在退出后立即切换到分期付款。如果要在不首先检查应用程序运行状况的情况下进行交换,为什么要部署到暂存?但是,我不建议直接部署到服务器(删除+部署),而是建议升级服务。因为当我们进行服务升级时,我们的部署会保留其公共IP地址。如果我们删除+部署,我们会得到一个新的公共IP地址。并且托管服务的公共IP地址已经保证在删除部署之前不会更改。

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

只有我的2美分。

更新

重新阅读本指南后,我现在明白了一些东西。您正在等待操作完成,但这是您正在等待完成的VIP-SWAP操作。如果你的声明部署还没有准备好,你必须等待它准备好。而且,正如Mike提到的,可能会有DNS延迟,这在指南的末尾有所说明:

注意:

如果您在促销后不久访问生产网站,DNS名称可能还没有准备好。如果遇到DNS错误(404),请等待几分钟后重试。请记住,Windows Azure创建DNS动态命名条目,并且更改可能需要几分钟时间传播。

更新2

好吧,您必须查询所有角色及其所有实例,然后等待所有角色都准备好。技术上,你可以在每个角色至少准备一个实例的情况下进行VIP交换,但我认为这会使脚本更加复杂。

下面是对Richard Astbury上面的例子的一个小调整,它将重试有限的次数。所有这些都归功于他最初的样本代码,所以我会投票给他,认为他是最中肯的答案。只需在此处发布此变体,作为人们根据需要复制/粘贴的替代方案:

$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)

最新更新