共用方式為


開始使用安全升級做法

本文介紹 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 設定為 的 enabled nfApps。
  • 舊版和新 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 作業失敗,且透過 atomicrollbackOnTestFailure 參數處理失敗的 nfApp 之後,操作員可以控制如何處理在失敗的 nfApp 之前被變更的任何 nfApp 的行為。 當發生故障時啟用暫停功能,操作員可以在解決失敗的 nfApp 後強制 AOSM 終止運行,以保留混合版本的環境。 由於復原失敗,作員可以強制 AOSM 復原任何先前的 nfApp,還原原始環境快照集。 如需控制升級失敗行為的詳細資訊,請參閱下列文章: 控制升級失敗行為

服務內升級的考慮

Azure作員服務管理員通常支援服務升級,這種升級方法會推進部署版本,而不會中斷執行中的服務。 需要網路功能擁有者考量一些因素,以確保在 ISSU 操作期間 AOSM 的正常運行。

  • 當 AOSM 針對一組已排序的多個 nfApps 執行升級時,AOSM 會先升級或建立所有新的 nfApps,然後刪除所有舊的 nfApps。 此方法可確保服務不會受到影響,直到所有新的 nfApps 就緒,但需要額外的平臺容量,才能暫時裝載舊版和新 nfApps。
  • 當 AOSM 升級具有多個複本的 nfApp 時,AOSM 會接受滾動或重新建立選項的部署配置檔設定。 使用滾動的位置,公開值 maxUnavailable ,並以 maxSurge CGS 參數的形式公開,然後可在運行時間透過運算符 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 應用程式序列順序。
  • 更新 ARM 範本以取得所需的升級行為
    • 請務必設定任何所需的 CNF 應用程式 timeoutatomic 參數和 rollbackOnTestFailure 參數。 隨著您對升級越來越有信心,變更這些參數可能會很有用。
  • 發佈 SNS 信譽
    • 上線完成後,就會提交 Reput 作業。 根據 nfApps 的數目、大小和複雜度而定,重新放置操作可能需要一些時間才能完成(數小時)。
  • 檢查信譽結果
    • 如果 Reput 回報成功的結果,表示升級已完成,而且使用者應該驗證服務的狀態和可用性。 如果 Reput 回報失敗,則請遵循升級失敗復原一節中的步驟繼續進行。

安全升級重試程式

在 Reput 更新失敗的情況下,可以遵循下列程序來重試該作業。

  • 診斷失敗的 nfApp
    • 藉由分析記錄和其他偵錯資訊來解決 nfApp 失敗的根本原因。
  • 手動略過已完成的圖表
    • 修正失敗的 nfApp 之後,但在嘗試升級重試之前,請考慮變更 applicationEnablement 參數以加速重試行為。 此參數可以設定為 false,以略過 nfApp。 此參數在 nfApp 不需要升級時很有用。
  • 啟動 SNS 重試機制(重複直到成功)
    • 根據預設,除非已使用 applicationEnablement 旗標略過,否則信譽會以宣告的更新順序重試 nfApps。

透過使用 installOptions 和 UpgradeOptions 來控制逾時

當 SNS 作業啟動 helm installhelm 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 範本必須以三種方式更新。 首先,隱含組態參數必須定義為類型物件。 其次, roleOverrideValues0roleOverrideValues1roleOverrideValues2 必須宣告為對應至 config 參數的變數。 第三、 roleOverrideValues0roleOverrideValues1roleOverrideValues2 必須以適當順序參考 ,才能依適當順序進行替代 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,然後再覆寫 hellotesthellotest1 的 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預設為停用。 如果未在 roleOverrideValuesupgradeOptions指定這個選擇性參數,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"
                ]
              }
            }
          }
        }
      }
    }
  ]
}