引言

在企业级 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. Kotlin:【初始化】延时初始化、惰性初始化、初始化的三个陷阱

  2. webstorm前端vue项目安装依赖包总结

    npm install提示错误信息,与node.js版本有关.以下是用到的一些命令行参数: 1.清除npm的缓存:npm cache clean --force 2.设置npm下载镜像:npm con ...

  3. uni-app在小程序上遇见的坑(a-b页面频繁跳转)

    功能描述 uni-app在小程序中. A页面跳B页面.B页面在调A页面.这样来回跳转. 多调几次,会有问题的. 出现的问题是,调不动了. 因为 这个方法是 uni.navigateTo 保留当前页.( ...

  4. 认识soui4js(第4篇):定义一个窗口类,响应控件的事件

    soui4js基于soui4设计实现. 首先我们看一下soui4中如何定义一个窗口类. soui4最基本的窗口类是SHostWnd和SHostDialog,它需要一个布局xml. 假定布局xml在资源 ...

  5. CDN与云计算技术的结合:专业视角下的深度融合

    本文分享自天翼云开发者社区<CDN与云计算技术的结合:专业视角下的深度融合>,作者:大利 随着信息技术的不断发展,内容分发网络(CDN)与云计算技术作为两种重要的互联网基础设施,其结合已成 ...

  6. 2021 OWASP TOP 10

    OWASP TOP 10 2021年版Top 10有哪些变化? 2021年版Top 10产生了三个新类别,原有四个类别的命名和范围也发生了变化,且进行了一些 整合. 2017年 TOP 10 top ...

  7. Nmap 脚本使用

    Nmap 脚本使用 使用 Nmap 脚本是扩展 Nmap 功能的一种高效方式,允许用户执行从简单的服务检测到复杂的漏洞利用的各种任务.通过指定 --script 选项,并结合相应的脚本名称或类型,用户 ...

  8. Q:如何实现notepad++列编辑模式

    列编辑: txt编辑器大家都非常熟悉,当需要修改多行的时候只能一行一行的修改.而notepad 可以同时修改多行的数据. 1.鼠标移动光标到要选择的列 2.按住 alt 键,从上到下选择多列,光标会变 ...

  9. 文本处理命令head tail more less tr cut paste wc

    文本处理命令 命令**head tail more less tr cut paste wc** 磁盘分区利用率 df|tr -s ' ' :|cut -d : -f5 df|tr -s ' ' :| ...

  10. Mac安装Hadoop

    软件版本 hadoop3.2.1 一.打开本地ssh登录 # 生成公钥默认 $ ssh-keygen -t rsa -C "robots_wang@163.com" -b 4096 ...