引言

在企业级 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/

五、总结

通过本文方案,您可以:

  1. 快速备份:全量保存 Harbor 中的 Helm Charts
  2. 简化迁移:跨集群或跨 Harbor 实例同步 Charts
  3. 支持离线部署:与 Air-Gapped 环境无缝衔接

建议将脚本与定时任务结合(如 CronJob),实现定期自动化备份。对于大规模环境,可参考网页7的 API 分页方案优化性能。

运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本的更多相关文章

  1. centos7系统管理和运维实战——运维必备的网络管理技能(1)

    运维必备的网络管理技能 一.网络管理协议: 1.简单的两个概念:    DHCP(动态主机配置协议):如果网络结构要更改,需要从新初始化网络参数,手机用动态主机配置协议可以避免这个问题.客户端可以从D ...

  2. 运维监控-基于yum的方式部署 Zabbix Agent 4.0 版本

    运维监控-基于yum的方式部署 Zabbix Agent 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上一篇博客我们分享了如何基于yum的方式部署zabbix 4. ...

  3. 运维监控-基于yum的方式部署Zabbix Server 4.0 版本

    运维监控-基于yum的方式部署Zabbix Server 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如何选择zabbix版本 1>.打开zabbix官方 ...

  4. 简单记录五个Linux设置定时任务的步骤(自动化运维必备)

    这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护.于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的.这个与我们的L ...

  5. 站长、运维必备| 网站可用性监控产品 OneAPM Cloud Test 上线

    白天太忙,到了晚上才发现网站一天都没有访问量? 直到有用户投诉才发现网站完全无法访问? 还要每月付费才能及时了解网站可用情况? 监控频率太低,不能及时发现网站不可用? 第三方服务宕机,导致您的网站不可 ...

  6. 推荐linux运维必备的几本书

    首先,<鸟哥的linux私房菜> 鸟哥 其次,<linux就该这么学> 刘瑞版 然后,<CentOS linux系统运维> 张祥琳版 最后,<CentOS运维 ...

  7. 日常运维中的相关日志切割处理方法总结 [Logrotate、python、shell脚本实现 ]

    对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...

  8. Linux运维实战之DNS(bind)服务器的安装与配置

    转自http://sweetpotato.blog.51cto.com/533893/1598225 上次博文我们讨论了DNS的基础,本次博文我们重点来看看如何配置一台DNS服务器. [本次博文的主要 ...

  9. 关于使用kubeoperator搭建k8s集群使用containerd作为容器运行时,从自己搭建的habor仓库拉取镜像的有关说明

    1.kubepi界面添加habor仓库信息,并授权给k8s集群 这一步的操作是当在工作负载选择从harbor仓库拉取镜像时会自动创建有关的secrets信息,从而不用事先手动创建了(有别于kuboar ...

  10. CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解

    前言    如果要给很多台客户端主机安装操作系统,要是每一台都拿张安装光盘一台一台主机的去装系统那就太浪费时间和精力了.在生产环境中也不实际,要实现为多台主机自动安装操作系统,那我们怎么实现自动化安装 ...

随机推荐

  1. 阿里云-数据库-表格存储Tablestore

    入门篇一 初步调研了解 Step.1 场景锲合度判断选择使用表格存储前关键需要明确你的场景是否适合.表格存储是阿里云自2010起自研使用的一个多模型NoSQL数据库,面向海量大数据存储,身经百战.非常 ...

  2. 如何快速的开发一个完整的iOS直播app(创建房间)

    直播(创建房间) 1.进入主播界面,首先创建房间 2.设计房间模型(key,名称),key作为房间的唯一标识,用来找到房间 3.用socket创建房间,导入socket.io框架 4.一般一个客户端一 ...

  3. Java经典面试36题和答案

    1."static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成员 ...

  4. Vanity Intermediate 统配符提权

    nmap扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.167.234 Starting Nmap 7.94SVN ( https://nmap.org ) ...

  5. Oracle生成awr报告操作步骤

    1.cmd命令窗口 以sysdba身份登录Oracle 2.执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML.输入天数以选择生成报告的时间段,一般默认为最近7天.输入报告开 ...

  6. 超详细,DeepSeep 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入),建议收藏!

    在当今数字化时代,AI编程助手已成为提升开发效率的利器.DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选.今天,就让我们一起探索如何将DeepSeek接入 ...

  7. MySQL数据库datetime类型不能为空值的问题

    修改mysql的配置文件:my.ini 将其只的: sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUT ...

  8. AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

    一.前言:AI编程时代的双雄争霸 2025年3月,字节跳动推出的Trae以"国内首个AI原生IDE"之名杀入战场,直指海外明星产品Cursor的软肋.这场工具革命背后,是免费与付费 ...

  9. dcgm-exporter:Collect Switch Metrics和Collect Link Metrics

    在 DCGM(Data Center GPU Manager)中,"Collect Switch Metrics" 和 "Collect Link Metrics&quo ...

  10. mac更新本地时间

    前言 选取苹果菜单 >"系统偏好设置",然后点按"日期与时间". 点按窗口角落处的锁形图标 ,然后输入您的管理员密码以解锁设置. 在"日期与时 ...