■ 北京 繆仕章
編者按:有時使用公有云服務也會遇到資源不足的情況,筆者近期遇到在部署網站新版站點時提示Azure 云服務資源分配出現了問題。
Azure 是微軟公有云服務的支柱產品,它提供虛擬機、云服務、存儲、網絡和數據庫等服務。
基于龐大的數據中心,看似Azure 的資源是取之不盡、用之不竭的。然而,近期筆者在工作中就遇到了一個與資源不足有關的問題。
筆者管理的網站運行在Azure 云服務上,在部署網站新版站點時,筆者遇到了如圖1 所示報錯信息。
從這些錯誤信息看,似乎是云服務資源分配出現了問題。解決此問題之前,需要先了解Azure 資源分配的工作原理和發生分配故障的原因。
Azure數據中心的服務器分區成群集,會在多個群集中嘗試新的云服務分配請求。將第一個實例部署到云服務時(不管是部署到過渡環境還是生產環境中),都會將該云服務固定到某個群集。云服務中任何進一步地部署都會發生在同一個群集,這種情況稱為“固定到群集”。

圖1 部署網站新版站點時報錯
圖2說明在多個群集中嘗試進行一般分配的情況。圖3 說明固定到群集2(因為現有的云服務CS_1 托管于此處)的分配情況。
當分配請求固定到某個群集時,由于可用的資源池僅限于某個群集,很可能找不到可用的資源。此外,如果分配請求固定到某個群集,但該群集不支持所請求的資源類型,那么即使該群集有可用的資源,請求仍會失敗。
圖4 說明由于唯一候選群集沒有可用的資源,導致已固定的分配失敗的情況。圖5 則說明了由于唯一候選群集不支持所請求的VM大小(雖然群集有可用的資源),導致已固定的分配失敗的情況。
總的來說,就是用戶在Azure 上創建云服務或虛擬機時,云服務或虛擬機會被自動分配到當前可用的Azure 集群,并且該集群不可變。Azure 集群的資源是有限的,當越來越多的云服務或虛擬機被分配到該Azure集群,就可能出現用戶爭奪Azure 計算資源的問題,從而導致云服務或虛擬機部署失敗的現象。

圖2 嘗試在多個集群上分配資源

圖3 在固定的集群上分配資源
那應該如何解決這樣的問題呢?可以考慮以下兩個方案:
(1)將工作負荷部署到新的云服務。
(2)更新CNAME或A記錄,將流量指向新的云服務。
(3)沒有流量流向舊站點后,即可刪除舊的云服務。
此方案的優點是不會出現服務中斷,缺點是無法使用原有云服務DNS 和原IP地址。
刪除現有云服務的生產槽和過渡槽,使云服務為空,然后在現有云服務中創建新部署。在部署的時候會在該區域的所有群集上重新嘗試進行資源分配完成部署。 但需要確保云服務未綁定到地緣組。
此解決方案的優點是可以保留現有的DNS 名稱及IP地址(需提前做IP 地址保留),缺點是可能會出現服務中斷。

圖4 在固定的集群上因無足夠的資源分配失敗

圖5 在固定的集群上因規格不支持分配失敗
筆者分析當前業務狀態,由于當前服務分布在兩個數據中心,使用了高可用的方案。筆者決定使用方案2,也就是刪除生產槽和過渡槽,然后重新部署。筆者制定了以下計劃:
(1)當前生產插槽的IP地址做地址保留。
(2)修改流量管理器把服務流量全部切換到另外一個數據中心。
(3)刪除有部署問題的數據中心上的生產槽和過渡槽。
(4)修改云服務配置文件將云服務的IP 地址指向保留的IP。
(5)進行新的部署。
(6)測試新部署。
(7)再次修改流量管理器使流量按原規則在兩個數據中心分布。
Azure 提供兩種方式進行地址保留操作,第一種是通過Azure 門戶:通過搜索找到保留IP,然后進行保留IP 地址的添加,如圖6 所示。但這種方法不能保留當前云服務上的IP 地址,在本案例中不適用。故本案例采取第二種方法——使用PowerShell 設置Azure 保留IP,具體步驟如下:
(1)運行Import-Module AzureRM 導入AzureRM 模塊。
(2)運行Login-Azure RmAccount-Environment Name AzureChinaCloud。

圖6 通過Azure 門戶保留IP 地址
(3)運 行New-Azure ReservedIP -Reserved IP Name My Web Site IP -Label MyCloudServiceIP - Location "chinanorth" -Service Name My Cloud Service(可以運行Get-AzureService 確認云服務名字)。
(4)運 行Get-Azure ReservedIP 得到保留IP 信息并核對。
如果有多個訂閱下的云服務需要做地址保留則需要按以下步驟進行:
(1)運 行Get-Azure RmSubscription 得到租戶下的所有訂閱。
(2)運行Select-Azure Subscription -Subscription Id MysubscriptionID 指定對應的訂閱。
(3)運 行 New-AzureReservedIP-ReservedIPName MyWebSiteIP-Label MyCloudServiceIP-Location "chinanorth" -ServiceName MyCloud Service 設置保留IP。
IP 地址保留做好以后,就可以通過流量管理器切換流量了。這里舉例說明流量管理器的工作原理:
當用戶訪問www.azure.cn 的時候,他的DNS 服務器會返回給用戶www.azure.cn的Cname 記錄,比如azure.trafficmanager.net。這條記錄就是www.azure.cn 這個站點在DNS 服務流量管理器上的一個DNS 記錄,該記錄分別指向www.azure.cn的IP,然后根據DNS 配置文件中的策略進行流量分配,給用戶返回www.azure.cn的IP 地址,例如國內的用戶只訪問IP 地址1,而國外的用戶只訪問IP 地址2。而且流量管理器還會監控IP地址1 和IP 地址2 的特定頁面,如果發現該IP 地址1的頁面返回代碼500,則會自動將流量切換到IP 地址2。
流量切換后測試無誤,就可以刪除云服務的生產槽和過渡槽了。通過使用PowerShell 命令“Remove-Azure Deployment -Service Name mycloud service -Slot Production -Force”刪除生產槽。
使用PowerShell 命令“Remove-AzureDeployment -ServiceName mycloud service -Slot Staging -Force”刪除過渡槽。
注意,進行以上操作前請使用Select-Azure Subscription -Subscription Id mysubscriptionid 選擇對應的訂閱,謹防誤操作。
修改配置文件以使用保留IP,在網絡配置下添加ReservedIPs,將ReservedIP名字指向剛剛新建保留IP的名字即可,如圖7 所示。
接下就可以進行新的部署了。使用PowerShell 命令“New-AzureDeployment -ServiceName mycloud service -Package package path -Configuration profile path -Slot Production”進行生產槽的部署。
完成部署后進行服務測試,如無問題可以整流量管理器配置切換流量。至此,問題解決完畢。
生產環境遇到Azure 資源不足的情況會引起很多不必要的麻煩,所幸筆者的生產環境分布在不同的數據中心,在處理此類問題時可以將流量切換到另一個數據中心進行問題的處理。
此類Azure 數據中心資源不足的情況并不算常見,但為了今后避免此類問題,應該:
(1)考慮在多個數據中心部署服務,確保服務的可用性。
(2)部署云服務時優先選擇新的數據中心,比如當前的China North 2 和China East 2 是2018 年 上線的,資源比較充足。
(3)如果遇到此類問題但暫時無法切換到新數據中心的話,可以考慮使用就地升級的方式,以確保服務版本更新能夠正常進行。

圖7 修改部署配置文件