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