開始使用安全升級做法

概觀

本文介紹 Azure 運算子服務管理員 (AOSM) 安全升級做法 (SUP)。 此功能集可讓終端使用者在符合合作夥伴 ISSU 需求的情況下,針對裝載於 Azure 運算子連接點上的 CNF 工作負載,安全地執行複雜升級。 請留意這些服務中可進一步說明 SUP 特性和功能的未來文章。

簡介

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

  • SNS Reput 更新 - 在 NFDV 中的所有 NfApp 上執行 Helm 升級作業。
  • 連接點平台 - 在連接點平台目標上支援 SNS Reput 作業。
  • 作業逾時 - 為每個 NfApp 作業設定作業逾時的能力。
  • 同步作業 - 一次執行一個序列 NfApp 作業的能力。
  • 失敗時暫停 - 根據旗標,將失敗行為設定為只復原最後一個 NfApp 作業。
  • 單一圖表測試驗證 - 在建立或更新後執行 Helm 測試作業。
  • 重構的 SNS Reput - 經過改良的方法,新增了更新順序和清除檢查。

升級方法

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

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

  • 對於將 applicationEnablement 設定為 false 的 NFApp,會略過。
  • 對於在新舊網路功能定義版本 (NFDV) 之間通用的 NFApp,會觸發升級元件。
  • 對於在新的 NFDV 中新增的 NFApp,會觸發建立元件。

為了確保結果,會支援使用 Helm (可以是 Helm 升級前/後測試,或獨立 Helm 測試) 來進行 NfApp 測試。 若為前/後測試失敗,會接受 atomic 參數。 使用 atomic/true 時,會復原失敗的圖表。 使用 atomic/false 時,則不會執行復原。 若為獨立 Helm 測試,則接受 rollbackOnTestFailure 參數。 使用 rollbackOnTestFailure/true 時,會復原失敗的圖表。 使用 rollbackOnTestFailure/false 時,則不會執行復原。

必要條件

在規劃使用 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 應用程式逾時、atomic 參數和 rollbackOnTestFailure 參數。 隨著您對升級越來越有信心,變更這些參數可能會很有用。

發出 SNS Reput

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

檢查 Reput 結果

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

重試程序

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

診斷失敗的 NfApp

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

手動略過已完成的圖表

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

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

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

如何使用 applicationEnablement

在 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 的非 dedfault 設定。

{
  "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 的非 dedfault 設定。

{
  "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')]"
        ]
      }
    }
  ]
}

支援服務中升級

可能的話,Azure 運算子服務管理員會支援服務中升級,這種升級方法可在不中斷服務的情況下推進部署版本。 不過,給定服務能否在不中斷的情況下升級是服務本身的功能。 請進一步諮詢服務發行者,以了解服務中升級功能。

前瞻性目標

Azure 運算子服務管理員會持續擴大「安全升級做法」功能集,並推動所提供更新服務的改進。 以下是目前有考慮會在未來推出的功能:

  • 改善升級選項控制 - 更有效地公開參數。
  • 在沒有變更時略過 NfApp - 當沒有變更結果時略過 NfApp 的處理。
  • 在失敗時執行 NFDV 復原 - 根據旗標,於失敗時復原所有已完成的 NfApp。
  • 以非同步方式操作 - 能夠一次執行多個 NfApp 作業。
  • 下載映像 - 能夠將映像預先載入到邊緣存放庫。
  • 鎖定要進行驗證的圖表 - 能夠只對特定 NfApp 執行 Helm 測試。