本文介紹 Azure 運算子服務管理員 (AOSM) 安全升級做法 (SUP)。 此功能集支持升級位於 Azure Operator Nexus 上的複雜容器網路功能(CNF)。 這些升級通常支持合作夥伴 In Service Software Upgrade (ISSU) 方法和需求。 雖然本文介紹基本概念,但尋找其他文章,以深入瞭解進階SUP特性和功能。
安全升級簡介
AOSM 所支援的指定網路服務,由一到多個 CNF 所組成,包含一段時間需要軟體和/或設定變更的元件。 若要進行這些元件層級變更,必須執行一到多個 helm 作業,以最小程度影響網路服務的方式,按特定順序升級每個網路函式應用程式(nfApp)。 AOSM 安全升級做法會套用下列高階功能來處理升級程式和工作流程需求:
- SNS Reput 支援 - 執行 helm 升級作業於網路功能設計版本(NFDV)中的所有 nfApps。
- 連接點平台 - 在連接點平台目標上支援 SNS Reput 作業。
- 作業逾時 - 設定每個 nfApp 作業的作業逾時的能力。
- 同步作業 - 一次執行一個序列 nfApp 作業的能力。
- 控制升級順序 - 定義不同的 nfApp 順序以進行安裝和升級。
- 暫停失敗 - 預設行為會在 nfApp 作業失敗后暫停。
- 失敗時恢復 - 此功能為選擇性的,在發生失敗時,會先恢復已完成的 nfApps,再處理失敗的 nfApp。
- 單一圖表測試驗證 - 在建立或更新後執行 Helm 測試作業。
- 無變更時跳過 nfApp - 跳過無變更結果的 nfApps 處理。
- 映射預先載入 - 將映像預先載入邊緣存放庫的能力。
安全升級方法
若要更新現有的 AOSM 網站網路服務(SNS),操作員會對已部署的 SNS 資源執行 reput 請求。 其中 SNS 包含具有多個 nfApps 的 CNF,則會跨網路函式定義版本 (NFDV) 中定義的所有 nfApps 展開要求。 根據預設,依序顯示,或選擇性地依 參數所 updateDependsOn 定義的順序顯示。
對於每個 nfApp,reput 請求支援各種變更,包括提升 Helm Chart 版本、新增/移除 Helm 值及/或新增/移除任何 nfApps。 雖然可以為每個 nfApp 設定時間限制,但根據已知的允許運行時長,nfApps 只能按順序一個接一個地處理。 Reput 更新會實作下列處理邏輯:
- nfApps 會依照
updateDependsOn順序處理,或按出現的順序處理。 - 當參數
applicationEnabled設為停用時,此 nfApps 項目會被略過。 - 如果未偵測到任何變更,則會略過參數
skipUpgrade設定為 的enablednfApps。 - 舊版和新 NFDV 之間通用的 nfApps 會使用
helm upgrade升級。 - 只有新 NFDV 中的 nfApps 是使用
helm install來安裝。 - 部署但未被新 NFDV 參考的 nfApps 會藉由使用
helm delete刪除。
為了確保結果,nfApp 測試支援使用 helm 模式,包括由 helm 前置或後置掛勾觸發的測試,或使用獨立的 helm 測試掛勾。 在前或後的鉤子失敗時,atomic 參數將被啟用。 使用 atomic/true 時,會復原失敗的圖表。 使用 atomic/false 時,則不會執行復原。 針對獨立運行的 Helm 測試掛鉤失敗,rollbackOnTestFailure 會遵循不可分割完成的類似邏輯。 如需獨立 Helm 測試的詳細資訊,請參閱下列文章: 在安裝或升級之後執行測試
當發生 nfApp 作業失敗,且透過 atomic 或 rollbackOnTestFailure 參數處理失敗的 nfApp 之後,操作員可以控制如何處理在失敗的 nfApp 之前被變更的任何 nfApp 的行為。 當發生故障時啟用暫停功能,操作員可以在解決失敗的 nfApp 後強制 AOSM 終止運行,以保留混合版本的環境。 由於復原失敗,作員可以強制 AOSM 復原任何先前的 nfApp,還原原始環境快照集。 如需控制升級失敗行為的詳細資訊,請參閱下列文章: 控制升級失敗行為
服務內升級的考慮
Azure作員服務管理員通常支援服務升級,這種升級方法會推進部署版本,而不會中斷執行中的服務。 需要網路功能擁有者考量一些因素,以確保在 ISSU 操作期間 AOSM 的正常運行。
- 當 AOSM 針對一組已排序的多個 nfApps 執行升級時,AOSM 會先升級或建立所有新的 nfApps,然後刪除所有舊的 nfApps。 此方法可確保服務不會受到影響,直到所有新的 nfApps 就緒,但需要額外的平臺容量,才能暫時裝載舊版和新 nfApps。
- 當 AOSM 升級具有多個複本的 nfApp 時,AOSM 會接受滾動或重新建立選項的部署配置檔設定。 使用滾動的位置,公開值
maxUnavailable,並以maxSurgeCGS 參數的形式公開,然後可在運行時間透過運算符 CGV 來設定。
最後,特定服務在不中斷的情況下升級的能力是服務本身的功能。 請進一步諮詢服務發行者以瞭解服務內升級功能,並確保它們符合適當的 AOSM 行為選項。
安全升級必要條件
使用 AOSM 規劃升級時,請在升級執行前解決下列需求,以將嘗試所花費的時間優化,並確保升級成功。
- 使用發行者和/或設計工具工作流程將更新後的成品上線。
- 在大部分情況下,請使用現有的發行者來裝載新版本成品。
- 使用現有的發行者支援
helm upgrade將ST更新為不同的版本。 - 使用新的發行者需要
helm delete目前 SNS 上的 ,然後helm install針對新的 SNS 版本使用 。
- 使用現有的發行者支援
- 成品存放區、網路服務設計群組 (NSDG) 和網路功能設計群組 (NFDG) 是不可變且無法變更的。
- 變更其中一個資源需要部署新的 SNS。
- 需要新的成品資訊清單才能儲存新的圖表和影像。
- 如需上傳新圖表和影像的詳細數據,請參閱 上線檔 。
- 需要新的NFDV和選擇性的網路服務設計版本 (NSDV)。
- NFDV 變更可能相當複雜。 本文只涵蓋基本變更。
- 只有在會引進新的設定群組結構描述 (CGS) 版本時,才需要新的 NSDV。
- 如有必要,使用新的 CGS。
- 如果升級會引進新的已公開設定參數,則有必要這麼做。
- 在大部分情況下,請使用現有的發行者來裝載新版本成品。
備註
相同 NSDG 和 NFDG 可以支援具有不同主要版本的 NSDV 和 NFDV
- 使用運算子工作流程建立更新後的成品。
- 如有必要,請根據新的 CGS 建立新的設定群組值 (CGV)。
- 藉由確認現有的網站和網站網路服務物件,重複使用和製作承載。
- 更新範本,以確保升級參數有根據升級信賴度和所需的失敗行為來進行設定。
- 用於生產環境的設定可以隱藏失敗詳細資料,而用於偵錯或測試的設定則可以選擇公開這些詳細資料。
安全升級程式
請遵循下列程式以使用 AOSM 觸發升級。
- 建立新的 NFDV 資源
- 對於新的 NFDV 版本,它必須是有效的 SemVer 格式。 新版本可以是升級,具有比已部署版本更高的價值,或降級,具有比已部署版本更低的價值。 新版本可能會因主要、次要或修補程式值而有所不同。
- 更新新的NFDV 參數
- Helm 圖表版本可加以更新,或者,Helm 值可以視需要加以更新或參數化。 新的 nfApps 也可以新增,因為它們不存在於已部署的版本。
- 更新 NFDV 以指定 nfApp 的順序
- UpdateDependsOn 是 NFDV 參數,用來指定更新作業期間 nfApps 的順序。 如果未
updateDependsOn提供,則會使用NFDV中顯示的 CNF 應用程式序列順序。
- UpdateDependsOn 是 NFDV 參數,用來指定更新作業期間 nfApps 的順序。 如果未
- 更新 ARM 範本以取得所需的升級行為
- 請務必設定任何所需的 CNF 應用程式
timeout、atomic參數和rollbackOnTestFailure參數。 隨著您對升級越來越有信心,變更這些參數可能會很有用。
- 請務必設定任何所需的 CNF 應用程式
- 發佈 SNS 信譽
- 上線完成後,就會提交 Reput 作業。 根據 nfApps 的數目、大小和複雜度而定,重新放置操作可能需要一些時間才能完成(數小時)。
- 檢查信譽結果
- 如果 Reput 回報成功的結果,表示升級已完成,而且使用者應該驗證服務的狀態和可用性。 如果 Reput 回報失敗,則請遵循升級失敗復原一節中的步驟繼續進行。
安全升級重試程式
在 Reput 更新失敗的情況下,可以遵循下列程序來重試該作業。
- 診斷失敗的 nfApp
- 藉由分析記錄和其他偵錯資訊來解決 nfApp 失敗的根本原因。
- 手動略過已完成的圖表
- 修正失敗的 nfApp 之後,但在嘗試升級重試之前,請考慮變更
applicationEnablement參數以加速重試行為。 此參數可以設定為 false,以略過 nfApp。 此參數在 nfApp 不需要升級時很有用。
- 修正失敗的 nfApp 之後,但在嘗試升級重試之前,請考慮變更
- 啟動 SNS 重試機制(重複直到成功)
- 根據預設,除非已使用
applicationEnablement旗標略過,否則信譽會以宣告的更新順序重試 nfApps。
- 根據預設,除非已使用
透過使用 installOptions 和 UpgradeOptions 來控制逾時
當 SNS 作業啟動 helm install 或 helm upgrade時,會使用 27 分鐘的預設逾時值。 雖然此值可以在全域網路功能(NF)層級自定義,但我們建議在元件 NF 層級使用 roleOverrideValues 於 NF 承載範本中自定義此值。 進一步揭露 CGS/CGV 中的 roleOverrideValues 允許操作員在運行期間進行控制。 下列範例示範了支援的 installOptions 和 upgradeOptions 參數如何應用於跨兩個 nfApp 元件的情況:
{
"roleOverrideValues": [
{
"name": "nfApplication1",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
} } } } },
{
"name": "nfApplication2",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1"
} } } } }
]
}
使用 applicationEnablement 略過 nfApps
在 NFDV 資源中 deployParametersMappingRuleProfile ,有類型列舉的支持屬性 applicationEnablement ,其接受 [未知]、[已啟用] 或 [停用] 的值。 它可以在網路功能部署期間用來手動排除 nfApp 操作。 下列範例示範泛型方法,以參數化 applicationEnablement 為 屬性中的 roleOverrideValues 內含值。
NFDV 範本變更
雖然不需要任何 NFDV 變更,但發行者可以選擇性地使用 NFDV 來設定 屬性的 applicationEnablement 預設值。 預設值會被使用,除非經由 roleOverrideValues 變更。 使用 NFDV 樣本來為 applicationEnablement 設定預設值。 下列範例會將狀態設定 enabled 為 networkfunctionApplication 的 hellotest 預設值。
"location":"<location>",
"properties": {
"networkFunctionTemplate": {
"networkFunctionApplications": [
"deployParametersMappingRuleProfile": {
"applicationEnablement": "Enabled"
},
"name": "hellotest"
],
"nfviType": "AzureArcKubernetes"
},
}
若要更動態地管理 applicationEnablement 值,運算符可以使用 NF 範本 roleOverrideValues 屬性傳遞即時值。 雖然操作者可以直接操作NF範本,但應將roleOverrideValues參數化,以便在運行期間通過CGV範本傳遞值。 下列範例示範對 CGS 範本、NF 範本以及 CGV 所需的修改。
CGS 範本變更
CGS 樣本必須更新,以包含每個行的一個變數宣告,以在下 roleOverrideValues參數化。 下列範例示範三個覆寫值。
"roleOverrideValues0": {
"type": "string"
},
"roleOverrideValues1": {
"type": "string"
},
"roleOverrideValues2": {
"type": "string"
}
NF 負載範本變更
NF 範本必須以三種方式更新。 首先,隱含組態參數必須定義為類型物件。 其次, roleOverrideValues0、 roleOverrideValues1和 roleOverrideValues2 必須宣告為對應至 config 參數的變數。 第三、 roleOverrideValues0、 roleOverrideValues1和 roleOverrideValues2 必須以適當順序參考 ,才能依適當順序進行替代 roleOverrideValues ,並遵循適當的語法。
"parameters": {
"config": {
"type": "object",
"defaultValue": {}
}
}
"variables": {
"roleOverrideValues0": "[string(parameters('config').roleOverrideValues1)]",
"roleOverrideValues1": "[string(parameters('config').roleOverrideValues1)]",
"roleOverrideValues2": "[string(parameters('config').roleOverrideValues2)]"
},
"resources": [
{
<snip>
"roleOverrideValues": [
"[variables('roleOverrideValues0')]",
"[variables('roleOverrideValues1')]",
"[variables('roleOverrideValues2')]"
]
}
CGV 範本變更
CGV 模板現在可以更新,以在執行時替換每個變數為 roleOverrideValues 屬性的內容。 下列範例會先將 rollbackEnabled 設定為 true,然後再覆寫 hellotest 和 hellotest1 的 nfApplications 集合。
{
"roleOverrideValues0": "{\"nfConfiguration\":{\"rollbackEnabled\":true}}",
"roleOverrideValues1": "{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\":\"Enabled\",\"helmMappingRuleProfile\":{\"releaseName\":\"override-release\",\"releaseNamespace\":\"override-namespace\",\"helmPackageVersion\":\"1.0.0\",\"values\":\"\",\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"30\",\"injectArtifactStoreDetails\":\"true\"}}}}}",
"roleOverrideValues2": "{\"name\":\"hellotest1\",\"deployParametersMappingRuleProfile\":{\"applicationEnablement\" : \"Enabled\"}}"
}
利用此架構,操作員可以透過對 CGV 進行簡單的更新來管理任何一個 roleOverrideValues ,然後附加 CGV 至所需的 SNS 操作。
略過沒有變更的 nfApps
此功能 skipUpgrade 的設計目的是優化 CNF 升級所需的時間。 當發行者在 底下roleOverrideValuesupgradeOptions啟用此旗標時,AOSM 服務層會執行特定預先檢查,以判斷是否可以略過特定nfApplication升級。 如果符合所有預先檢查準則,則會略過該應用程式的升級。 否則,升級會在叢集層級執行。
預先檢查準則
如果符合下列所有條件,則可以略過升級:
- 布
nfApplication建狀態為 [成功]。 - Helm 圖表名稱或版本沒有變更。
- Helm 值沒有變更。
啟用或停用 skipUpgrade 功能
此功能skipUpgrade預設為停用。 如果未在 roleOverrideValues 下 upgradeOptions指定這個選擇性參數,CNF 升級會以傳統方式繼續進行,其中 nfApplications 會在叢集層級升級 。
在網路函式資源內啟用 SkipUpgrade
若要透過 roleOverrideValues啟用 SkipUpgrade 功能,請參閱下列範例。
{
"location": "eastus2euap",
"properties": {
"publisherName": "xyAzureArcRunnerPublisher",
"publisherScope": "Private",
"networkFunctionDefinitionGroupName": "AzureArcRunnerNFDGroup",
"networkFunctionDefinitionVersion": "1.0.0",
"networkFunctionDefinitionOfferingLocation": "eastus2euap",
"nfviType": "AzureArcKubernetes",
"nfviId": "/subscriptions/4a0479c0-b795-4d0f-96fd-c7edd2a2928f/resourcegroups/ashutosh_test_rg/providers/microsoft.extendedlocation/customlocations/ashutosh_test_cl",
"deploymentValues": "",
"roleOverrideValues": [
"{\"name\":\"hellotest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"1\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"4\",\"skipUpgrade\":\"true\"}}}}}",
"{\"name\":\"runnerTest\",\"deployParametersMappingRuleProfile\":{\"helmMappingRuleProfile\":{\"options\":{\"installOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"},\"upgradeOptions\":{\"atomic\":\"true\",\"wait\":\"true\",\"timeout\":\"5\"}}}}}"
]
}
}
範例的說明
-
nfApplication:
hellotest- 旗
skipUpgrade標已啟用。 如果的hellotest升級要求符合預先檢查準則,則會略過升級。
- 旗
-
nfApplication:
runnerTest-
skipUpgrade未指定旗標。 因此,runnerTest即使在符合預先檢查準則的情況下,仍會在叢集層級執行傳統的 Helm 升級。
-
roleOverrideValues 選項完整參考指南
下列參考將本文中的所有範例與其他文章結合在一起,示範所有目前可透過 roleOverrideValues 機制取得的選項。
{
"roleOverrideValues": [
{
"nfConfiguration": {
"rollbackEnabled": "true"
}
},
{
"name": "nfApplication1",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"skipUpgrade": "true",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
}
}
}
}
},
{
"name": "nfApplication2",
"deployParametersMappingRuleProfile": {
"helmMappingRuleProfile": {
"options": {
"installOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
},
"upgradeOptions": {
"atomic": "true",
"wait": "true",
"timeout": "1",
"skipUpgrade": "true",
"testOptions": {
"enable": "true",
"timeout": "true",
"rollbackOnTestFailure": "true",
"filter": [
"test1",
"test2"
]
}
}
}
}
}
}
]
}