运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本
引言
在企业级 Kubernetes 环境中,Harbor 作为主流的镜像与 Helm Chart 管理工具,常被用于存储 Helm Charts。但在迁移、备份或离线部署场景中,批量拉取 Harbor 中的 Charts 可能面临效率低下或权限问题。本文将通过 Helm CLI + Shell 脚本的组合方案,实现一键化批量导出操作。
一、环境准备与 Helm 仓库配置
1.1 添加 Harbor 仓库
通过 Helm 命令行工具关联 Harbor 仓库,需指定项目路径和认证信息:
# 配置变量(按实际环境修改)
HARBOR_URL="https://harbor.example.com"
PROJECT_NAME="your-project"
USERNAME="admin"
PASSWORD="your-password"
# 添加 Helm 仓库
helm repo add harbor-repo ${HARBOR_URL}/chartrepo/${PROJECT_NAME} \
--username=${USERNAME} \
--password=${PASSWORD}
# 强制更新仓库索引(避免缓存导致列表不全)
helm repo update --force-update harbor-repo
注意:若 Harbor 版本 ≥2.6.0,需确保已弃用 ChartMuseum 并启用 OCI 兼容模式。
1.2 验证仓库可见性
helm search repo harbor-repo # 应显示 Charts 列表
若列表为空,检查 Harbor 控制台 → 目标项目 → Helm Charts 是否已上传 Charts。
二、自动化批量拉取脚本
2.1 脚本核心逻辑
创建 pull-all-charts.sh,实现以下功能:
• 动态获取 Charts 列表
• 按 Chart 名称创建目录
• 下载所有历史版本
#!/bin/bash
REPO_NAME="harbor-repo"
OUTPUT_DIR="./harbor-charts"
mkdir -p "${OUTPUT_DIR}"
# 获取 Charts 列表(过滤表头)
CHARTS=$(helm search repo ${REPO_NAME} -l | awk 'NR>1 {print $1}')
for CHART in ${CHARTS}; do
SHORT_NAME=$(echo "${CHART}" | sed "s|${REPO_NAME}/||")
CHART_DIR="${OUTPUT_DIR}/${SHORT_NAME}"
mkdir -p "${CHART_DIR}"
# 获取所有版本(JSON 解析)
VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[].version')
# 并行下载(4线程)
echo ${VERSIONS} | xargs -n1 -P4 -I{} helm pull "${CHART}" --version {} --destination "${CHART_DIR}"
done
echo "Download completed! Output directory: ${OUTPUT_DIR}"
2.2 运行脚本
chmod +x pull-all-charts.sh && ./pull-all-charts.sh
输出目录结构示例:
harbor-charts/
├── nginx/
│ ├── nginx-1.2.3.tgz
│ └── nginx-4.5.6.tgz
└── redis/
├── redis-7.0.0.tgz
└── redis-8.1.0.tgz
三、常见问题与解决方案
3.1 权限错误(403 Forbidden)
• 原因:用户权限不足或认证信息过期
• 修复:
# 重新配置仓库凭据
helm repo update harbor-repo --username=${USERNAME} --password=${PASSWORD}
需确保 Harbor 用户至少具备 Guest 角色。
3.2 Charts 列表不全
• 原因:Helm 缓存或分页限制
• 方案:改用 Harbor API 直接获取(示例片段):
# 分页查询仓库列表
PAGE=1
while true; do
REPO_PAGE=$(curl -s -k -u "${USERNAME}:${PASSWORD}" \
"${HARBOR_URL}/api/v2.0/projects/${PROJECT_ID}/repositories?page=${PAGE}&page_size=50")
# 解析并追加到列表...
done
完整脚本可参考网页3的 API 调用逻辑。
3.3 下载中断或超时
• 优化:增加重试机制
for VERSION in ${VERSIONS}; do
until helm pull "${CHART}" --version ${VERSION}; do
echo "Retrying ${VERSION}..."
sleep 10
done
done
四、扩展应用场景
4.1 仅拉取最新版本
修改版本获取逻辑:
VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[0].version')
4.2 与 CI/CD 流水线集成
在 GitLab CI 中配置阶段任务:
pull-charts:
stage: deploy
script:
- apk add helm jq
- ./pull-all-charts.sh
artifacts:
paths:
- harbor-charts/
4.3 离线环境分发
打包成压缩文件后传输:
tar czvf harbor-charts-$(date +%Y%m%d).tgz harbor-charts/
五、总结
通过本文方案,您可以:
- 快速备份:全量保存 Harbor 中的 Helm Charts
- 简化迁移:跨集群或跨 Harbor 实例同步 Charts
- 支持离线部署:与 Air-Gapped 环境无缝衔接
建议将脚本与定时任务结合(如 CronJob),实现定期自动化备份。对于大规模环境,可参考网页7的 API 分页方案优化性能。
运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本的更多相关文章
- centos7系统管理和运维实战——运维必备的网络管理技能(1)
运维必备的网络管理技能 一.网络管理协议: 1.简单的两个概念: DHCP(动态主机配置协议):如果网络结构要更改,需要从新初始化网络参数,手机用动态主机配置协议可以避免这个问题.客户端可以从D ...
- 运维监控-基于yum的方式部署 Zabbix Agent 4.0 版本
运维监控-基于yum的方式部署 Zabbix Agent 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上一篇博客我们分享了如何基于yum的方式部署zabbix 4. ...
- 运维监控-基于yum的方式部署Zabbix Server 4.0 版本
运维监控-基于yum的方式部署Zabbix Server 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如何选择zabbix版本 1>.打开zabbix官方 ...
- 简单记录五个Linux设置定时任务的步骤(自动化运维必备)
这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护.于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的.这个与我们的L ...
- 站长、运维必备| 网站可用性监控产品 OneAPM Cloud Test 上线
白天太忙,到了晚上才发现网站一天都没有访问量? 直到有用户投诉才发现网站完全无法访问? 还要每月付费才能及时了解网站可用情况? 监控频率太低,不能及时发现网站不可用? 第三方服务宕机,导致您的网站不可 ...
- 推荐linux运维必备的几本书
首先,<鸟哥的linux私房菜> 鸟哥 其次,<linux就该这么学> 刘瑞版 然后,<CentOS linux系统运维> 张祥琳版 最后,<CentOS运维 ...
- 日常运维中的相关日志切割处理方法总结 [Logrotate、python、shell脚本实现 ]
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
- Linux运维实战之DNS(bind)服务器的安装与配置
转自http://sweetpotato.blog.51cto.com/533893/1598225 上次博文我们讨论了DNS的基础,本次博文我们重点来看看如何配置一台DNS服务器. [本次博文的主要 ...
- 关于使用kubeoperator搭建k8s集群使用containerd作为容器运行时,从自己搭建的habor仓库拉取镜像的有关说明
1.kubepi界面添加habor仓库信息,并授权给k8s集群 这一步的操作是当在工作负载选择从harbor仓库拉取镜像时会自动创建有关的secrets信息,从而不用事先手动创建了(有别于kuboar ...
- CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解
前言 如果要给很多台客户端主机安装操作系统,要是每一台都拿张安装光盘一台一台主机的去装系统那就太浪费时间和精力了.在生产环境中也不实际,要实现为多台主机自动安装操作系统,那我们怎么实现自动化安装 ...
随机推荐
- const 用法详解
1. 类的成员函数声明为const类型,在类外定义的时候,也需要添加const 2. 如果常成员函数修改了成员变量,会在编译的时候检查出来错误! 其实关于const用错的报错都是在编译阶段出现的!(大 ...
- Kotlin:【数字类型】安全转换函数
- 重写equals()方法(idea生成的高效方法)
equals 方法Object 类中的 equals 方法用于检测一个对象是否等于另外一个对象.在 Object 类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用, 它们一定 ...
- Assignment pg walkthrough Easy 通配符提权变种
nmap 扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.224 Starting Nmap 7.94SVN ( https://nmap.org ...
- 变量-python
变量-python 1. 变量的定义 变量是存储数据的地方,在程序运行时,变量的值可以改变.变量的定义格式如下: 变量名 = 数据 例如: a = 10 b = "hello" c ...
- 从 Windows Forms 到微服务的经验教训
Photo by Dan Counsell on Unsplash 如果说软件开发中有什么不变的东西,那就是变化. 在 .NET 生态系统中摸爬滚打的这二十年里,我见证了各种框架的起起落落,目睹了容器 ...
- HttpWebRequest 返回BadRequest(400)
问题背景: 使用 HttpWebRequest 调用 GetResponse() 方法,返回 WebException,HttpStatusCode 是 400,无法获取返回的错误信息: 解决方式: ...
- Aspire+扣子智能体实现AI自动CodeReview
一.引言 Code Review在软件开发中扮演着至关重要的角色,它不仅能够提升代码质量,确保代码的可维护性和一致性,还能促进团队成员之间的知识共享和技术提升. 传统的代码审查过程面临着诸多挑战和局限 ...
- [BZOJ3811] 玛里苟斯 题解
不得不说这题的确挺苟的. 注:下述"引理"表示: 对于长度为 \(n\) 的数组 \(V\),其线性基为 \(B\),定义 \(c_v=\bigoplus\limits_{a\in ...
- Typecho 数据备份及程序升级详细步骤教程
数据库备份看自己,习惯性更新前都备份,出错直接滚回去 数据库备份 直接在宝塔数据库那个模块备份即可,备份完建议下载本地或者保存到OSS 备份网站文件 理论上只需要备份/usr/目录即可,因为这个目录包 ...