当前位置: 首页 > 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 地址,实现高可用性的镜像拉取策略。

相关文章:

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

在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问,可以通过以下几种方式实现: 1. 在 values.yaml 中定义多个 Registry 在 values.yaml 中定义主 Registry 和备用 Registry,以便在部署时灵活切换: # values.yaml …...

FreeSWITCH rtcp-mux 测试

rtcp 跟 rtp 占用同一个端口,这就是 rtcp 复用 Fs 呼出是这样的: originate [rtcp_muxtrue][rtcp_audio_interval_msec5000]user/1001 &echo 需要同时指定 rtcp_audio_interval_msec,否则 rtcp_mux 不能生效 Fs 呼入不需要配置&#xf…...

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;…...

python打卡day30@浙大疏锦行

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 具体操作步骤&#xff1a; 在桌面…...

替换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 能力转化为稳定、高效、可大规模应用的服务,却面临着巨大的挑战,其中高并发处理能力和低响应延迟是衡量服务质量的…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

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

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

[ 计算机网络 ] | 宏观谈谈计算机网络

&#xff08;目录占位&#xff09; 网络间通信&#xff0c;本质是不同的两个用户通信&#xff1b;本质是两个不同主机上的两个进程间通信。 因为物理距离的提升&#xff0c;就衍生出了很多问题。TCP/IP协议栈 / OSI七层模型&#xff0c;将协议分层&#xff0c;每一层都是为了…...

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

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

高光谱数据处理技术相关

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

【动态规划】P10988 [蓝桥杯 2023 国 Python A] 走方格|普及+

本文涉及知识点 C动态规划 P10988 [蓝桥杯 2023 国 Python A] 走方格 题目描述 给定一个 N N N 行 N N N 列的方格&#xff0c;第 i i i 行第 j j j 列的方格坐标为 ( i , j ) (i, j) (i,j)&#xff0c;高度为 H i , j H_{i,j} Hi,j​。小蓝从左上角坐标 ( 0 , 0 ) …...

Rocketmq leader选举机制,通过美国大选解释

通过2020年美国大选的比喻&#xff0c;可以形象地解释RocketMQ的Leader选举机制&#xff08;以DLedger模式为例&#xff09;。我们将美国大选中的关键角色和流程映射到RocketMQ的集群中&#xff0c;帮助理解其工作原理。 1. 角色类比 美国大选RocketMQ DLedger集群说明选民&am…...

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

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

利用 SQL Server 作业实现异步任务处理,简化系统架构

在现代企业系统中&#xff0c;异步任务是不可或缺的组成部分&#xff0c;例如&#xff1a; 电商系统中的订单超时取消&#xff1b; 报表系统中的异步数据导出&#xff1b; CRM 系统中的客户积分计算。 传统的实现方式通常涉及引入消息队列&#xff08;如 RabbitMQ、Kafka&a…...

LabVIEW数据库使用说明

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

MATLAB实现GAN用于图像分类

生成对抗网络&#xff08;GAN&#xff09;是一种强大的生成模型&#xff0c;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;组成。生成器用于生成图像&#xff0c;判别器用于判断图像是真实的还是生成的。在MATLAB中实现GAN用于图像…...

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 充当请求与响应之间的…...

PostgreSQL初体验

目录 一、PostgreSQL 核心概述 &#xff08;一&#xff09;定义与定位 &#xff08;二&#xff09;核心特性与优势 &#xff08;三&#xff09;应用场景 二、PostgreSQL 安装实战&#xff08;基于 OpenEuler 24&#xff09; &#xff08;一&#xff09;编译安装&#xff…...

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; 我们先来看之前所介绍的系统级别的文件…...

分析 redis 的 exists 命令有一个参数和多个参数的区别

在 redis 中&#xff0c;exists 命令是用来查询某个或多个 key 是否存在的&#xff0c;返回存在的 key 的个数。 由于 redis 是按照键值对方式存储数据的&#xff0c;于是一个 key 只能对应一组数据&#xff0c;那么上述的 key 的个数指的即是需要查询的 key 中有几个 key 是存…...

《具身智能机器人:自修复材料与智能结构设计的前沿探索》

在具身智能机器人的研发进程中&#xff0c;自修复材料与智能结构设计无疑是极具挑战性与创新性的关键领域&#xff0c;吸引着无数科研人员投身其中&#xff0c;探寻未知。 传统机器人在复杂多变的环境中执行任务时&#xff0c;一旦材料出现损伤&#xff0c;如外壳刮擦、内部线…...

Java 10IO流

IO流 input输入 output输出场景1&#xff1a;读写配置文件、日志文件 场景2&#xff1a;客户端与服务端的通讯 场景3&#xff1a;文件上传和下载io流体系结构 字节流 万能流&#xff0c;适合除纯文本文件外的储存字符流 纯文本文件字节流 FileOutputStream字节输出流 构造…...

@ColorRes和@ColorInt什么区别

ColorRes 和 ColorInt 都是 Android 的注解&#xff08;Annotations&#xff09;&#xff0c;用于标记你传递的参数到底是什么类型的“颜色”信息——资源 ID 还是实际颜色值。 ✅ 一句话理解 注解代表含义举例通常用在ColorRes表示这是一个颜色资源 ID&#xff08;如 R.colo…...