当前位置: 首页 > article >正文

Helm Chart 中配置多个 Docker Registry 地址以实现备用访问

在 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

最佳实践

  1. 优先使用动态检查:通过 Init Container 或 CI/CD 脚本实时检查 Registry 可用性,避免硬编码。
  2. 配置镜像拉取密钥:确保两个 Registry 都配置了正确的 imagePullSecrets
  3. 监控备用 Registry 使用频率:通过 Prometheus 等工具监控备用 Registry 的使用情况,及时排查主 Registry 问题。
  4. 测试故障转移逻辑:在 CI/CD 中添加模拟故障测试,验证备用机制的可靠性。

通过以上方法,你可以在 Helm Chart 中灵活配置多个 Docker Registry 地址,实现高可用性的镜像拉取策略。

http://www.lryc.cn/news/2380579.html

相关文章:

  • FreeSWITCH rtcp-mux 测试
  • c++ 类的语法4
  • NMOS和PMOS的区别
  • java云原生实战之graalvm 环境安装
  • 2025年电工杯新规发布-近三年题目以及命题趋势
  • python打卡day30@浙大疏锦行
  • 替换word中的excel
  • 大模型服务如何实现高并发与低延迟
  • 异丙肌苷市场:现状、挑战与未来展望
  • OBS Studio:windows免费开源的直播与录屏软件
  • [ 计算机网络 ] | 宏观谈谈计算机网络
  • 经典面试题:TCP 三次握手、四次挥手详解
  • 高光谱数据处理技术相关
  • 【动态规划】P10988 [蓝桥杯 2023 国 Python A] 走方格|普及+
  • Rocketmq leader选举机制,通过美国大选解释
  • 机器视觉的PVC卷对卷丝印应用
  • 利用 SQL Server 作业实现异步任务处理,简化系统架构
  • LabVIEW数据库使用说明
  • MATLAB实现GAN用于图像分类
  • 25考研经验贴(11408)
  • java中的Filter使用详解
  • PostgreSQL初体验
  • css使用clip-path属性切割显示可见内容
  • 新京东,正在成为一种生活方式
  • Linux 文件(2)
  • 分析 redis 的 exists 命令有一个参数和多个参数的区别
  • 《具身智能机器人:自修复材料与智能结构设计的前沿探索》
  • Java 10IO流
  • @ColorRes和@ColorInt什么区别
  • 基于Springboot + vue3实现的工商局商家管理系统