在 Helm Chart 中配置多個 Docker Registry 地址以實現備用訪問,可以通過以下幾種方式實現:
1. 在 values.yaml 中定義多個 Registry
在 values.yaml
中定義主 Registry 和備用 Registry,以便在部署時靈活切換:
# values.yaml
image:primaryRegistry: "primary-registry.example.com" # 主 RegistrysecondaryRegistry: "secondary-registry.example.com" # 備用 Registryname: "my-image"tag: "v1.0.0"pullPolicy: IfNotPresent
2. 在 Deployment 中通過環境變量選擇 Registry
在 templates/deployment.yaml
中根據條件選擇使用主 Registry 或備用 Registry:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:template:spec:containers:- name: {{ .Chart.Name }}image: {{ if .Values.useSecondaryRegistry }}{{ .Values.image.secondaryRegistry }}{{ else }}{{ .Values.image.primaryRegistry }}{{ end }}/{{ .Values.image.name }}:{{ .Values.image.tag }}imagePullPolicy: {{ .Values.image.pullPolicy }}
部署時通過 --set
參數指定使用備用 Registry:
helm install my-release . --set useSecondaryRegistry=true
3. 使用 Init Container 動態選擇 Registry
通過 Init Container 檢查主 Registry 可用性,不可用時切換到備用 Registry:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:template:spec:initContainers:- name: check-registryimage: alpine:3.14command: ["/bin/sh", "-c"]args:- |# 檢查主 Registry 是否可訪問if wget -q --spider ${image.primaryRegistry}/${image.name}:${image.tag}; thenecho ${image.primaryRegistry}/${image.name}:${image.tag} > /tmp/imageelseecho ${image.secondaryRegistry}/${image.name}:${image.tag} > /tmp/imagefienv:- name: imagevalue: {{ .Values.image.primaryRegistry }}- name: namevalue: {{ .Values.image.name }}- name: tagvalue: {{ .Values.image.tag }}volumeMounts:- name: image-configmountPath: /tmpcontainers:- name: {{ .Chart.Name }}image: $(cat /tmp/image) # 使用 Init Container 確定的鏡像地址volumeMounts:- name: image-configmountPath: /tmpvolumes:- name: image-configemptyDir: {}
4. 使用 Helm 模板函數實現條件選擇
在 _helpers.tpl
中定義輔助函數,根據 Registry 可用性返回正確的地址:
# templates/_helpers.tpl
{{/* 獲取可用的鏡像地址 */}}
{{- define "mychart.image" -}}
{{- if .Values.useSecondaryRegistry -}}
{{ .Values.image.secondaryRegistry }}/{{ .Values.image.name }}:{{ .Values.image.tag }}
{{- else -}}
{{ .Values.image.primaryRegistry }}/{{ .Values.image.name }}:{{ .Values.image.tag }}
{{- end -}}
{{- end -}}
在 Deployment 中引用該函數:
# templates/deployment.yaml
containers:- name: {{ .Chart.Name }}image: {{ include "mychart.image" . }}
5. 通過 Helm Hooks 實現故障轉移
使用 Pre-Upgrade/Pre-Rollback Hooks 在部署前檢查 Registry 可用性:
# templates/hooks/check-registry.yaml
apiVersion: batch/v1
kind: Job
metadata:name: {{ .Release.Name }}-check-registryannotations:"helm.sh/hook": pre-upgrade,pre-install"helm.sh/hook-delete-policy": hook-succeeded
spec:template:spec:containers:- name: checkimage: alpine:3.14command: ["/bin/sh", "-c"]args:- |if ! wget -q --spider {{ .Values.image.primaryRegistry }}/{{ .Values.image.name }}:{{ .Values.image.tag }}; thenecho "主 Registry 不可用,將使用備用 Registry"helm upgrade {{ .Release.Name }} . --set useSecondaryRegistry=truefirestartPolicy: Never
6. 在 CI/CD 流程中動態選擇
在 CI/CD 腳本中根據 Registry 狀態決定使用哪個 Registry:
# .gitlab-ci.yml 示例
deploy:script:- if wget -q --spider ${PRIMARY_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}; thenhelm install my-release . --set image.registry=${PRIMARY_REGISTRY};elsehelm install my-release . --set image.registry=${SECONDARY_REGISTRY};fi
最佳實踐
- 優先使用動態檢查:通過 Init Container 或 CI/CD 腳本實時檢查 Registry 可用性,避免硬編碼。
- 配置鏡像拉取密鑰:確保兩個 Registry 都配置了正確的
imagePullSecrets
。 - 監控備用 Registry 使用頻率:通過 Prometheus 等工具監控備用 Registry 的使用情況,及時排查主 Registry 問題。
- 測試故障轉移邏輯:在 CI/CD 中添加模擬故障測試,驗證備用機制的可靠性。
通過以上方法,你可以在 Helm Chart 中靈活配置多個 Docker Registry 地址,實現高可用性的鏡像拉取策略。