共用方式為


開始使用安全升級做法

本文介紹 Azure 運算子服務管理員 (AOSM) 安全升級做法 (SUP)。 這項功能集可讓使用者安全地執行 Azure作員 Nexus 上裝載的容器網路函式 (CNF) 工作負載的複雜升級,以符合適用的合作夥伴 In Service Software Upgrade (ISSU) 需求。 請留意這些服務中可進一步說明 SUP 特性和功能的未來文章。

安全升級簡介

Azure 運算子服務管理員所支援的給定網路服務會由一到多個容器型網路功能 (CNF) 所組成,而隨著時間推移,這些網路功能會需要軟體更新。 每個更新都必須執行一到多個 Helm 作業,並以對網路服務影響最小的方式,依特定順序升級相依的網路功能應用程式 (NfApp)。 在 Azure 運算子服務管理員中,安全升級做法代表的是一組功能,這組功能可將要在 Azure 運算子連接點上更新網路服務所需的 CNF 作業自動化。

  • SNS Reput 更新 - 在 NFDV 中的所有 NfApp 上執行 Helm 升級作業。
  • 連接點平台 - 在連接點平台目標上支援 SNS Reput 作業。
  • 作業逾時 - 設定每個 NfApp 作業的作業逾時功能。
  • 同步作業 - 一次執行一個序列 NfApp 作業的能力。
  • 失敗時暫停 - 根據旗標,將失敗行為設定為只復原最後一個 NfApp 作業。
  • 單一圖表測試驗證 - 在建立或更新後執行 Helm 測試作業。
  • 重構的 SNS Reput - 經過改良的方法,新增了更新順序和清除檢查。
  • 改善升級選項控制 - 更有效地公開參數。
  • 在沒有變更時略過 NfApp - 當沒有變更結果時略過 NfApp 的處理。
  • 在失敗時執行 NF 層級回復 - 根據旗標,復原所有已完成的 NfApps 失敗。
  • 映射預先載入 - 將映像預先載入邊緣存放庫的能力。

安全升級方法

為了更新現有的 Azure 運算子服務管理員網站網路服務 (SNS),運算子會針對已部署的 SNS 資源執行 Reput 更新要求。 在 SNS 包含具有多個 NfApp 的 CNF 時,要求會展開到網路功能定義版本 (NFDV) 中所定義的所有 NfApp。 根據預設,會依其出現順序展開,或者,也可以選擇依 UpdateDependsOn 參數所定義的順序展開。

對於每個 NfApp,Reput 更新要求會支援增加 Helm 圖表版本、新增/移除 Helm 值,和/或新增/移除任何 NfApp。 根據已知的允許運行時間,每個 NfApp 可以設定逾時,但 NfApps 只能依序處理,一個接一個。 Reput 更新會實作下列處理邏輯:

  • NfApp 會依照 updateDependsOn 順序或依照它們出現的順序加以處理。
  • 略過參數 applicationEnabled 設定為停用的 NfApps。
  • 如果未偵測到任何變更,則會略過設定為已啟用參數 skipUpgrade 的 NfApps。
  • 舊版和新版 NFDV 之間通用的 NFApp 會升級。
  • 僅安裝新 NFDV 中的 NFApps。
  • NFApps 已部署,但不會由新的 NFDV 參考,將會遭到刪除。

為了確保結果,會支援使用 Helm (可以是 Helm 升級前/後測試,或獨立 Helm 測試) 來進行 NfApp 測試。 若為前/後測試失敗,會接受 atomic 參數。 使用 atomic/true 時,會復原失敗的圖表。 使用 atomic/false 時,則不會執行復原。 如需獨立 Helm 測試的詳細資訊,請參閱下列文章: 在安裝或升級之後執行測試

服務內升級的考慮

Azure作員服務管理員通常支援服務升級,這種升級方法會推進部署版本,而不會中斷執行中的服務。 需要一些考慮,以確保 ISSU 作業期間 AOSM 的行為正確。

  • 當 AOSM 針對一組已排序的多個 nfApps 執行升級時,AOSM 會先升級或建立所有新的 nfApps,然後刪除所有舊的 nfApps。 此方法可確保服務不會受到影響,直到所有新的 nfApps 就緒,但需要額外的平臺容量,才能暫時裝載舊版和新 nfApps。
  • 當 AOSM 升級具有多個複本的 NfApp 時,AOSM 會接受輪流或重新建立選項的部署配置檔設定。 使用滾動的位置,公開值 maxUnavailable ,並以 maxSurge CGS 參數的形式公開,然後可在運行時間透過運算符 CGV 來設定。

最後,特定服務在不中斷的情況下升級的能力是服務本身的功能。 請進一步諮詢服務發行者,以瞭解服務內升級功能,並確保它們符合適當的 AOSM 行為選項。

安全升級必要條件

在規劃使用 Azure 運算子服務管理員的升級時,請在執行升級前解決下列需求,以將花在嘗試升級的時間最佳化。

  • 使用發行者和/或設計工具工作流程將更新後的成品上線。

    • 發行者、存放區、網路服務設計 (NSDg) 和網路功能設計群組 (NFDg) 是靜態的,不需要變更。
      • 需要新的成品資訊清單才能儲存新的圖表和影像。 如需詳細資訊,請參閱上線文件,以取得關於上傳新圖表和影像的詳細資料。
    • 需要新的 NFDV 和網路服務設計版本 (NSDV) (在現有的 NFDg 和 NSDg 下)。
      • 我們會在逐步說明章節中討論 NFDV 的基本變更。
      • 只有在會引進新的設定群組結構描述 (CGS) 版本時,才需要新的 NSDV。
    • 如有必要,使用新的 CGS。
      • 如果升級會引進新的已公開設定參數,則有必要這麼做。
  • 使用運算子工作流程建立更新後的成品。

    • 如有必要,請根據新的 CGS 建立新的設定群組值 (CGV)。
    • 藉由確認現有的網站和網站網路服務物件,重複使用和製作承載。
  • 更新範本,以確保升級參數有根據升級信賴度和所需的失敗行為來進行設定。

    • 用於生產環境的設定可以隱藏失敗詳細資料,而用於偵錯或測試的設定則可以選擇公開這些詳細資料。

安全升級程式

請遵循下列程序,以觸發使用 Azure 運算子服務管理員的升級。

建立新的NFDV資源

新的 NFDV 版本必須採用有效的 SemVer 格式,也就是只允許較高遞增值的修補檔和次要版本更新。 不允許較低的 NFDV 版本。 如果有使用 NFDV 2.0.0 所部署的 CNF,則新 NFDV 的版本可以是 2.0.1 或 2.1.0,但不能是 1.0.0 或 3.0.0 版。

更新新的 NFDV 參數

Helm 圖表版本可加以更新,或者,Helm 值可以視需要加以更新或參數化。 您也可以新增新的 NfApp (如果其不存在於已部署的版本中的話)。

更新 NFDV 以獲得所需的 NfApp 順序

UpdateDependsOn 是用來指定更新作業期間 NfApp 順序的 NFDV 參數。 如果未提供 UpdateDependsOn,則會使用 NFDV 中所看到的 CNF 應用程式序列順序。

更新 NFDV 以獲得所需的升級行為

請務必設定任何所需的 CNF 應用程式逾時、不可部分完成的參數,以及 rollbackOnTestFailure 參數。 隨著您對升級越來越有信心,變更這些參數可能會很有用。

發出 SNS Reput

上線完成後,就會提交 Reput 作業。 根據 NfApp 的數目、大小和複雜度而定,Reput 作業可能需要一些時間才能完成 (數小時)。

檢查 Reput 結果

如果 Reput 回報成功的結果,表示升級已完成,而且使用者應該驗證服務的狀態和可用性。 如果 Reput 回報失敗,則請遵循升級失敗復原一節中的步驟繼續進行。

安全升級重試程式

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

診斷失敗的 NfApp

藉由分析記錄和其他偵錯資訊來解決 NfApp 失敗的根本原因。

手動略過已完成的圖表

在修正失敗的 NfApp 之後,但在嘗試重試升級之前,請考慮變更 applicationEnablement 參數以加速重試行為。 此參數可以設定為 false,即應該略過 NfApp。 當 NfApp 不需要升級時,此參數會很有用。

發出 SNS Reput 重試 (重複進行直到成功)

根據預設,除非使用 applicationEnablement 旗標加以略過,否則 Reput 會以宣告的更新順序來重試 NfApp。

使用 applicationEnablement 略過 nfApps

在 NFDV 資源中,deployParametersMappingRuleProfile 底下會有列舉類型的 applicationEnablement 屬性,其接受以下值:Unknown、Enabled 或 Disabled。 它可以用來排除網路函式 (NF) 部署期間的 NfApp 作業。

發行者變更

針對 applicationEnablement 屬性,發行者有兩個選項:提供預設值或將其參數化。

範例 NFDV

發行者會使用 NFDV 來設定 applicationEnablement 的預設值。

{ 
      "location":"<location>", 
      "properties": {
      "networkFunctionTemplate": {
        "networkFunctionApplications": [
          {
            "artifactProfile": {
              "helmArtifactProfile": { 
                "var":"var"
              },
              "artifactStore": {
                "id": "<artifactStore id>"
              }
            },
            "deployParametersMappingRuleProfile": {
              "helmMappingRuleProfile": {
                "releaseNamespace": "{deployParameters.role1releasenamespace}",
                "releaseName": "{deployParameters.role1releasename}"
              },
              "applicationEnablement": "Enabled"
            },
            "artifactType": "HelmPackage",
            "dependsOnProfile": "null",
            "name": "hellotest"
          },
          {
            "artifactProfile": {
              "helmArtifactProfile": {
                 "var":"var"
              },
              "artifactStore": {
                "id": "<artifactStore id>"
              }
            },
            "deployParametersMappingRuleProfile": {
              "helmMappingRuleProfile": {
                "releaseNamespace": "{deployParameters.role2releasenamespace}",
                "releaseName": "{deployParameters.role2releasename}"
              },
              "applicationEnablement": "Enabled"
            },
            "artifactType": "HelmPackage",
            "dependsOnProfile": "null",
            "name": "hellotest1"
          }
        ],
        "nfviType": "AzureArcKubernetes"
      },
      "description": "null",
      "deployParameters": {"type":"object","properties":{"role1releasenamespace":{"type":"string"},"role1releasename":{"type":"string"},"role2releasenamespace":{"type":"string"},"role2releasename":{"type":"string"}},"required":["role1releasenamespace","role1releasename","role2releasenamespace","role2releasename"]},
      "networkFunctionType": "ContainerizedNetworkFunction"
    }
}

範例組態群組架構 (CGS) 資源

發行者會使用 CGS 要求在運行時間由 Operator 提供 roleOverrideValues 變數。 RoleOverrideValues 可以包含 applicationEnablement 的非預設設定。

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string"
    },
    "nfviType": {
      "type": "string"
    },
    "nfdvId": {
      "type": "string"
    },
    "helloworld-cnf-config": {
      "type": "object",
      "properties": {
        "role1releasenamespace": {
          "type": "string"
        },
        "role1releasename": {
          "type": "string"
        },
        "role2releasenamespace": {
          "type": "string"
        },
        "role2releasename": {
          "type": "string"
        },
        "roleOverrideValues1": {
          "type": "string"
        },
        "roleOverrideValues2": {
          "type": "string"
        }
      },
      "required": [
        "role1releasenamespace",
        "role1releasename",
        "role2releasenamespace",
        "role2releasename",
        "roleOverrideValues1",
        "roleOverrideValues2"
      ]
    }
  },
  "required": [
    "nfviType",
    "nfdvId",
    "location",
    "helloworld-cnf-config"
  ]
}

運算子變更

運算子會繼承 NFDV 所定義的預設 applicationEnablement 值。 如果 applicationEnablement 在 CGS 中參數化,則必須在運行時間透過 deploymentValues 屬性傳遞。

範例組態群組值 (CGV) 資源

運算子會使用 CGV 在運行時間設定 roleOverrideValues 變數。 RoleOverrideValues 包含 applicationEnablement 的非預設設定。

{
  "location": "<location>",
  "nfviType": "AzureArcKubernetes",
  "nfdvId": "<nfdv_id>",
  "helloworld-cnf-config": {
    "role1releasenamespace": "hello-test-releasens",
    "role1releasename": "hello-test-release",
    "role2releasenamespace": "hello-test-2-releasens",
    "role2releasename": "hello-test-2-release",
    "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\"}}"
  }
}

範例 NF ARM 範本

作員會使用 NF ARM 範本,將由 CGV 設定的 roleOverrideValues 變數提交至資源提供者 (RP)。 作員可以視需要在 CGV 中變更 applicationEnablement 設定,然後重新提交相同的 NF ARM 範本,以改變反覆專案之間的行為。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "nameValue": {
      "type": "string",
      "defaultValue": "HelloWorld"
    },
    "locationValue": {
      "type": "string",
      "defaultValue": "eastus"
    },
    "nfviTypeValue": {
      "type": "string",
      "defaultValue": "AzureArcKubernetes"
    },
    "nfviIdValue": {
      "type": "string"
    },
    "config": {
      "type": "object",
      "defaultValue": {}
    },
    "nfdvId": {
      "type": "string"
    }
  },
  "variables": {
    "deploymentValuesValue": "[string(createObject('role1releasenamespace', parameters('config').role1releasenamespace, 'role1releasename',parameters('config').role1releasename, 'role2releasenamespace', parameters('config').role2releasenamespace, 'role2releasename',parameters('config').role2releasename))]",
    "nfName": "[concat(parameters('nameValue'), '-CNF')]",
    "roleOverrideValues1": "[string(parameters('config').roleOverrideValues1)]",
    "roleOverrideValues2": "[string(parameters('config').roleOverrideValues2)]"
  },
  "resources": [
    {
      "type": "Microsoft.HybridNetwork/networkFunctions",
      "apiVersion": "2023-09-01",
      "name": "[variables('nfName')]",
      "location": "[parameters('locationValue')]",
      "properties": {
        "networkFunctionDefinitionVersionResourceReference": {
          "id": "[parameters('nfdvId')]",
          "idType": "Open"
        },
        "nfviType": "[parameters('nfviTypeValue')]",
        "nfviId": "[parameters('nfviIdValue')]",
        "allowSoftwareUpdate": true,
        "configurationType": "Open",
        "deploymentValues": "[string(variables('deploymentValuesValue'))]",
        "roleOverrideValues": [
          "[variables('roleOverrideValues1')]",
          "[variables('roleOverrideValues2')]"
        ]
      }
    }
  ]
}

略過沒有變更的 NfApps

此功能 skipUpgrade 的設計目的是優化 CNF 升級所需的時間。 當發行者在 底下roleOverrideValuesupgradeOptions啟用此旗標時,AOSM 服務層會執行特定預先檢查,以判斷是否可以略過特定nFApplication升級。 如果符合所有預先檢查準則,則會略過該應用程式的升級。 否則,升級會在叢集層級執行。

預先檢查準則

如果符合下列所有條件,則可以略過升級:

  1. nfApplication 建狀態為 [成功]。
  2. Helm 圖表名稱或版本沒有變更。
  3. 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 升級。