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

news2025/5/21 8:13:34

在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问,可以通过以下几种方式实现:

1. 在 values.yaml 中定义多个 Registry

values.yaml 中定义主 Registry 和备用 Registry,以便在部署时灵活切换:

# values.yaml
image:
  primaryRegistry: "primary-registry.example.com"  # 主 Registry
  secondaryRegistry: "secondary-registry.example.com"  # 备用 Registry
  name: "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-registry
          image: alpine:3.14
          command: ["/bin/sh", "-c"]
          args:
            - |
              # 检查主 Registry 是否可访问
              if wget -q --spider ${image.primaryRegistry}/${image.name}:${image.tag}; then
                echo ${image.primaryRegistry}/${image.name}:${image.tag} > /tmp/image
              else
                echo ${image.secondaryRegistry}/${image.name}:${image.tag} > /tmp/image
              fi
          env:
            - name: image
              value: {{ .Values.image.primaryRegistry }}
            - name: name
              value: {{ .Values.image.name }}
            - name: tag
              value: {{ .Values.image.tag }}
          volumeMounts:
            - name: image-config
              mountPath: /tmp
      containers:
        - name: {{ .Chart.Name }}
          image: $(cat /tmp/image)  # 使用 Init Container 确定的镜像地址
          volumeMounts:
            - name: image-config
              mountPath: /tmp
      volumes:
        - name: image-config
          emptyDir: {}

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-registry
  annotations:
    "helm.sh/hook": pre-upgrade,pre-install
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
        - name: check
          image: alpine:3.14
          command: ["/bin/sh", "-c"]
          args:
            - |
              if ! wget -q --spider {{ .Values.image.primaryRegistry }}/{{ .Values.image.name }}:{{ .Values.image.tag }}; then
                echo "主 Registry 不可用,将使用备用 Registry"
                helm upgrade {{ .Release.Name }} . --set useSecondaryRegistry=true
              fi
      restartPolicy: Never

6. 在 CI/CD 流程中动态选择

在 CI/CD 脚本中根据 Registry 状态决定使用哪个 Registry:

# .gitlab-ci.yml 示例
deploy:
  script:
    - if wget -q --spider ${PRIMARY_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}; then
        helm install my-release . --set image.registry=${PRIMARY_REGISTRY};
      else
        helm 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.coloradmin.cn/o/2380579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ 类的语法4

测试析构函数、虚函数、纯虚函数&#xff1a; void testClass5() {class Parent {public:Parent(int x) { cout << "Parent构造: " << x << endl; }~Parent() {cout << "调用Parent析构函数" << endl;}virtual string toSt…

NMOS和PMOS的区别

1 区分NMOS和PMOS&#xff1a;衬底箭头指向G级的是NMOS&#xff0c;衬底箭头背向G级的是PMOS 2 区分D和S级&#xff1a;针对NMOS&#xff0c;体二极管的正方向为S级&#xff1b;针对PMOS&#xff0c;体二极管正的方向为D级 3 区分电流方向&#xff1a;针对NMOS&#xff0c;电…

java云原生实战之graalvm 环境安装

windows环境安装 在Windows环境下安装GraalVM并启用原生镜像功能时&#xff0c;需要Visual Studio的组件支持。具体要点如下&#xff1a; 核心依赖&#xff1a; 需要安装Visual Studio 2022或更新版本&#xff0c;并确保勾选以下组件&#xff1a; "使用C的桌面开发"…

2025年电工杯新规发布-近三年题目以及命题趋势

电工杯将于2025.5.23 周五早八正式开赛&#xff0c;该竞赛作为上半年度竞赛规模最大的竞赛&#xff0c;因免报名费、一级学会承办等因素&#xff0c;被众多高校认可。本文将在从2025年竞赛新规、历史赛题选题分析、近年优秀论文分享、竞赛模板分析等进行电工杯备赛&#xff0c;…

替换word中的excel

PostMapping("/make/report/target/performance/first") public AjaxResult makeTargetReportFirst(RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap new HashMap<>();// 替换日期LocalDateTime nowData LocalDateTime…

大模型服务如何实现高并发与低延迟

写在前面 大型语言模型(LLM)正以前所未有的速度渗透到各行各业,从智能客服、内容创作到代码生成、企业知识库,其应用场景日益丰富。然而,将这些强大的 AI 能力转化为稳定、高效、可大规模应用的服务,却面临着巨大的挑战,其中高并发处理能力和低响应延迟是衡量服务质量的…

OBS Studio:windows免费开源的直播与录屏软件

OBS Studio是一款免费、开源且跨平台的直播与录屏软件。其支持 Windows、macOS 和 Linux。OBS适用于&#xff0c;有直播需求的人群或录屏需求的人群。 Stars 数64,323Forks 数8413 主要特点 推流&#xff1a;OBS Studio 支持将视频实时推流至多个平台&#xff0c;如 YouTube、…

经典面试题:TCP 三次握手、四次挥手详解

在网络通信的复杂架构里&#xff0c;“三次握手”与“四次挥手”仿若一座无形的桥梁&#xff0c;它们是连接客户端与服务器的关键纽带。这座“桥梁”不仅确保了连接的稳固建立&#xff0c;还保障了连接的有序结束&#xff0c;使得网络世界中的信息能够顺畅、准确地流动。 在面…

高光谱数据处理技术相关

一、Savitzky-Golay(SG)平滑 1. 基本概念 Savitzky-Golay(SG)平滑是一种基于局部多项式拟合的卷积算法,主要用于信号处理(如光谱、色谱数据)的去噪和平滑。其核心思想是通过滑动窗口内的多项式拟合来保留信号的原始特征(如峰形、宽度),同时抑制高频噪声。 2. 技术原…

机器视觉的PVC卷对卷丝印应用

在现代工业制造领域&#xff0c;PVC卷对卷丝印工艺凭借其高效、灵活的特点&#xff0c;广泛应用于广告制作、包装印刷、电子产品装饰等多个行业。然而&#xff0c;在高速连续的丝印过程中&#xff0c;如何确保印刷图案的精准定位、色彩一致性以及质量稳定性&#xff0c;一直是困…

LabVIEW数据库使用说明

介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询&#xff0c;适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit&#xff0c;可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述&#xff1a;实现向数据库表中插入数据的操作。当输入…

25考研经验贴(11408)

声明&#xff1a;以下内容都仅代表个人观点 数学一&#xff08;130&#xff09; 25考研数学一难度介绍&#xff1a;今年数学一整体不难&#xff0c;尤其是选填部分&#xff0c;大题的二型线面和概率论大题个人感觉比较奇怪&#xff0c;其他大题还是比较容易的。.26如何准备&a…

java中的Filter使用详解

Filter&#xff08;过滤器&#xff09;是 Java Web 开发的核心组件之一&#xff0c;用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析&#xff1a; 一、Filter 的作用与原理 核心作用 Filter 充当请求与响应之间的…

css使用clip-path属性切割显示可见内容

1. 需求 想要实现一个渐变的箭头Dom&#xff0c;不想使用svg、canvas去画&#xff0c;可以考虑使用css的clip-path属性切割显示内容。 2. 实现 <div class"arrow">箭头 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…

Linux 文件(2)

文章目录 1. 文件描述符1.1 文件描述符是什么1.2 文件描述符如何分配 2 重定向2.1 输出重定向2.2 输入重定向2.3 使用dup2进行重定向 3. 文件、父子进程和进程替换 1. 文件描述符 1.1 文件描述符是什么 什么是文件描述符呢&#xff1f; 我们先来看之前所介绍的系统级别的文件…

基于Springboot + vue3实现的工商局商家管理系统

项目描述 本系统包含管理员、商家两个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 许可证申请管理&#xff1a;管理商家的许可证申请&#xff0c;包括搜索、修改或删除许可证申请。 许可证审批管理…

【Java ee初阶】HTTP(2)

一、HTTP的方法 方法 说明 支持的HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道…

idea本地debug断点小技巧

idea本地debug断点小技巧 简单的设置断点条件 断点后&#xff0c;右键这个断点&#xff0c;可以在 condition 中填写能得出布尔的表达式 a 1 你如果写如下&#xff0c;表示先给他赋值&#xff0c;然后断住 a 2; true 断点后设置某个变量的值 在 debug 区域可以设置变量…

21. 自动化测试框架开发之Excel配置文件的测试用例改造

21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…