Helm 套件需求
Helm 是 Kube 的套件管理員,協助您管理 Kube 應用程式。 Helm 套件稱為圖表,包含一些 YAML 設定檔,以及一些轉譯成 Kube 資訊清單檔的範本。 任何人皆可為任何環境重複使用圖表,以降低複雜度並減少重複項目。
登錄 URL 路徑和 imagepullsecrets 需求
開發 Helm 套件時,通常會在數值保留容器登錄伺服器 URL。 將容器登錄伺服器 URL 保留在數值,對於在每個環境容器登錄之間移動成品很有用。 Azure 運算子服務管理員 (AOSM) 使用網路函式管理員 (NFM) 服務部署容器化網路功能 (CNF)。 網路函式管理員 (NFM) 包含的功能,可在網路函式 (NF) 部署期間,將容器登錄伺服器位置和 imagepullsecrets 插入 Helm 值。 imagePullSecret 是一種授權權杖,也稱為祕密,可儲存用來存取登錄的 Docker 認證。 例如,如果您需要透過 Kube 部署來部署應用程式,可以定義部署,如下列範例所示:
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
這個檔案可讓您為 Helm 圖表,在單一位置輕鬆設定值需求和條件約束。 在此檔案中,將 registryPath 和 imagePullSecrets 定義為必要屬性。
{
"$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 要求承載在 registryValuesPaths 提供下列值:
"registryValuesPaths": [ "global.registryPath" ],
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ],
NF 部署期間,網路函式運算子 (NFO) 會將 registryPath 設定為正確的 Azure Container Registry (ACR) 伺服器位置。 例如,NFO 會執行下列對等命令:
$ helm install --set "global.registryPath=<registryURL>" --set "global.imagePullSecrets[0].name=<secretName>" releasename ./releasepackage
注意
registryPath 設定未使用任何前置詞,例如 https:// 或 oci://。 如果 Helm 套件需要前置詞,發行者必須在套件定義此前置詞。
values.yaml
是包含 Helm 圖表預設值的檔案。 它是定義圖表預設值的 YAML 檔案。 在 values.yaml 檔案,必須有兩種類型的變數;imagePullSecrets 和 registryPath。 下表逐一說明。
global:
imagePullSecrets: []
registryPath: “”
名稱 | 類型 | 描述 |
---|---|---|
imagePullSecrets | String | imagePullSecrets 是祕密名稱的陣列,用來提取容器映像 |
registryPath | String | registryPath 是 AzureContainerRegistry 伺服器位置 |
建立 NFDVersion 上線步驟必須提供 imagePullSecrets 和 registryPath。
在叢集執行的 NFO 使用 Helm install –set 命令,在 Helm 發行期間填入這兩個變數 (imagePullSecrets 和 registryPath)。
如需詳細資訊,請參閱:pull-image-private-registry
不變性限制
不變性限制可防止變更檔案或目錄。 例如,無法變更或重新命名不可變的檔案,而且無法刪除、修改或重新命名允許附加作業的檔案。
避免使用可變標籤
使用者應避免使用可變標籤,例如最新、開發或穩定。 例如,如果 deployment.yaml 針對 .Values.image.tag 使用「最新」,部署會失敗。
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“
避免參考外部登錄
使用者應避免使用外部登錄的參考。 例如,如果 deployment.yaml 使用寫入程式碼的登錄路徑或外部登錄參考,則驗證會失敗。
image: http://myURL/{{ .Values.image.repository }}:{{ .Values.image.tag}}
建議
建議的做法是分割自訂資源定義 (CRD) 宣告和使用方式,外加使用手動驗證。 以下各節逐一說明。
分割 CRD 宣告和使用方式
為支援更新,我們建議將 CRD 的宣告和使用方式分割成個別的 Helm 圖表。 如需詳細資訊,請參閱:method-2-separate-charts
手動驗證
檢閱建立的映像和容器規格,確保映像有 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“
或
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“
YAML values.yaml
image:
repository: contosoapp
tag: 1.14.2