共用方式為


Helm 需求概觀

Helm 是 Kubernetes 的套件管理員,可協助簡化應用程式生命週期管理。 Helm 套件稱為圖表,由 YAML 組態和範本檔案組成。 執行 Helm 作業時,圖表會轉譯成 Kubernetes 指令清單檔案,以觸發適當的應用程式生命週期動作。 對於與 Azure 作員服務管理員 (AOSM) 最有效率的整合,發行者應該在開發 Helm 圖表時考慮某些最佳做法考慮。

registryUrl 和 imagePullSecrets 的考慮

每個 Helm 圖表通常需要 registryUrl 和 imagePullSecrets。 最常見的是,發行者會在 values.yaml 中公開這些參數。 首先,AOSM 取決於發行者以嚴格的方式公開這些值,因此可以在部署期間取代適當的 Azure 值。 加班,並非所有發行者都可以輕鬆地遵守 AOSM 所需的這些值的嚴格處理。

  • 某些圖表會隱藏條件式後置的 registryUrl 和/或 imagePullSecrets,或不符合其他值限制。
  • 某些圖表不會將 registryUrl 和/或 imagePullSecrets 宣告為預期的具名字符串,而是宣告為數位。

為了減少發行者的嚴格合規性需求,AOSM 稍後引進了兩種改良的方法來處理這些值。 首先 injectArtifactStoreDetail,最後是叢集登錄。 這兩個較新的方法不相依於 Helm 套件中顯示的有效 registryUrl 或 imagePullSecrets。 相反地,這些方法會代表網路函式直接將這些值插入Pod作業中。

registryUrl 和 imagePullSecrets 的方法摘要

本文支援及說明這三種方法。 發行者應該為其網路函式和使用案例選擇最佳選項。

遺產。

  • 要求發行者在 helm 值和部署範本中將 registryUrl 和 imagePullSecrets 參數化,以進行替代。
  • 映射裝載在發行者 Azure Container Registry (ACR) 中。

InjectArtifactStoreDetail。

  • 使用 Webhook 將 registryUrl 和 imagePullSecrets 直接插入 Pod 作業,而 helm 相依性最少。
  • 映像仍裝載於發行者 ACR 中。

叢集登錄。

  • 使用 Webhook 將 registryUrl 和 imagePullSecrets 直接插入 Pod 作業中,且不相依於 helm。
  • 映像裝載於本機 NFO 擴充功能叢集登錄中。

注意

在這三種情況下,AOSM 會取代發行者在範本中公開的任何值 AOSM 值。 唯一的差異是替代的方法。

registryUrl 和 imagePullSecrets 的舊版需求

Azure作員服務管理員 (AOSM) 會使用網路函式管理員 (NFM) 服務來部署容器化網路函式 (CNF)。 使用舊版方法時,NFM 會將 AOSM 容器登錄Url 和 imagePullSecrets 值取代為網路函式 (NF) 部署期間的 helm 作業。

使用舊版方法

下列 Helm 部署範本示範發行者應如何公開 registryPath 和 imagePullSecrets,以與 AOSM 舊版方法相容。

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: nginx-deployment 
  labels: 
    app: nginx 
spec: 
  replicas: 3 
  selector: 
    matchLabels: 
      app: nginx 
  template: 
    metadata: 
      labels: 
        app: nginx 
    spec: 
      {{- if .Values.global.imagePullSecrets }} 
      imagePullSecrets: {{ toYaml .Values.global.imagePullSecrets | nindent 8 }} 
      {{- end }} 
      containers: 
      - name: contosoapp 
        image:{{ .Values.global.registryPath }}/contosoapp:1.14.2 
        ports: 
        - containerPort: 80 

下列 values.schema.json 檔案示範發行者如何輕鬆地設定 registryPath 和 imagePullSecretsvalue 需求,以與 AOSM 舊版方法相容。

{ 
  "$schema": "http://json-schema.org/draft-07/schema#", 
  "title": "StarterSchema", 
  "type": "object", 
  "required": ["global"], 
  "properties": { 
      "global" : {
          "type": "object",
          "properties": {
              “registryPath”: {“type”: “string”}, 
              “imagePullSecrets”: {“type”: “string”}, 
          }
          "required": [ "registryPath", "imagePullSecrets" ], 
      } 
   } 
} 

下列 NFDVersion request payload 範例示範發行者如何提供 registryPath 和 imagePullSecretsvalue 值,以與 AOSM 舊版方法相容。

"registryValuesPaths": [ "global.registryPath" ], 
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ], 

下列 values.yaml 範例示範發行者如何提供 registryPath 和 imagePullSecretsvalue 值,以與 AOSM 舊版方法相容。

global: 
   imagePullSecrets: [] 
   registryPath: “” 

注意

  • registryPath 已設定,沒有任何前置詞,例如 https://oci://。 如有需要,publisher 必須在 helm 套件中定義前置詞。
  • 建立 NFDVersion 上線步驟必須提供 imagePullSecrets 和 registryPath。

舊版方法的其他考慮

發行者在使用舊版方法時,應該考慮下列建議:

  • 避免參考外部登錄
  • 執行手動驗證
  • 確定靜態映像存放庫和標籤

避免參考外部登錄

使用者應避免使用外部登錄的參考。 例如,如果 deployment.yaml 使用寫入程式碼的登錄路徑或外部登錄參考,則驗證會失敗。

執行手動驗證

檢閱建立的映像和容器規格,確保映像有 registryURL 的前置詞,且 imagePullSecrets 會填入 secretName。

 helm template --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryURL>" <release-name> <chart-name> --dry-run

OR

 helm install --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryURL>" <release-name> <chart-name> --dry-run
 kubectl create secret <secretName> regcred --docker-server=<registryURL> --dockerusername=<regusername> --docker-password=<regpassword>

確定靜態映像存放庫和標籤

每份 Helm 圖表都應該包含靜態映像存放庫和標籤。 靜態值設定如下:

  • 在圖像行中設定它們,或
  • 在 values.yaml 中設定它們,而不會在網路函式設計版本 (NFDV) 中公開這些值。

網路函式設計版本 (NFDV) 應對應至一組靜態的 Helm 圖表和映像。 圖表和映像只會透過發佈新的網路函式設計版本 (NFDV) 更新。

 image: "{{ .Values.global.registryPath }}/contosoapp:1.14.2“

Or

 image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“
 
YAML values.yaml
image:
  repository: contosoapp
  tag: 1.14.2
 image: http://myURL/{{ .Values.image.repository }}:{{ .Values.image.tag}}

injectArtifactStoreDetails registryUrl 和 imagePullSecrets 的需求

在某些情況下,第三方 Helm 圖表可能不符合 registryURL 的 AOSM 需求。 在此情況下,injectArtifactStoreDetails 功能可用來避免對 helm 套件進行合規性變更。 啟用 injectArtifactStoreDetails 後,Webhook 方法會用來在 Pod 作業期間動態插入適當的 registryUrl 和 imagePullSecrets。 這會覆寫 helm 封裝中設定的值。

使用 injectArtifactStoreDetails 方法

若要啟用 injectArtifactStoreDetails,請將 NF 資源角色Overrides 區段中的 installOptions 參數設定為 true,如下列範例所示。

resource networkFunction 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = {
  name: nfName
  location: location
  properties: {
    nfviType: 'AzureArcKubernetes'
    networkFunctionDefinitionVersionResourceReference: {
      id: nfdvId
      idType: 'Open'
    }
    allowSoftwareUpdate: true
    nfviId: nfviId
    deploymentValues: deploymentValues
    configurationType: 'Open'
    roleOverrideValues: [
      // Use inject artifact store details feature on test app 1
      '{"name":"testapp1", "deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"atomic":"false","wait":"false","timeout":"60","injectArtifactStoreDetails":"true"},"upgradeOptions": {"atomic": "false", "wait": "true", "timeout": "100", "injectArtifactStoreDetails": "true"}}}}}'
    ]
  }
}

注意

helm 圖表套件仍然必須公開格式正確的 registryURL 和 imagePullSecrets 值。

registryUrl 和 imagePullSecrets 的叢集登錄需求

如需使用叢集登錄的資訊,請參閱 概念檔

圖表不變性限制

不變性限制可防止變更檔案或目錄。 例如,無法變更或重新命名不可變的檔案。 使用者應避免使用可變標記,例如最新、開發或穩定。 例如,如果 deployment.yaml 針對 .Values.image.tag 使用「最新」,部署會失敗。

 image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“

圖表 CRD 宣告和使用方式分割

我們建議將客戶資源定義 (CRD) 的宣告和使用方式分割成個別的 Helm 圖表,以支援更新。 如需詳細資訊,請參閱:method-2-separate-charts