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

引言

在企业级 Kubernetes 环境中,Harbor 作为主流的镜像与 Helm Chart 管理工具,常被用于存储 Helm Charts。但在迁移、备份或离线部署场景中,批量拉取 Harbor 中的 Charts 可能面临效率低下或权限问题。本文将通过 Helm CLI + Shell 脚本的组合方案,实现一键化批量导出操作。


一、环境准备与 Helm 仓库配置

1.1 添加 Harbor 仓库

通过 Helm 命令行工具关联 Harbor 仓库,需指定项目路径和认证信息:

bash 复制代码
# 配置变量(按实际环境修改)
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 验证仓库可见性

bash 复制代码
helm search repo harbor-repo  # 应显示 Charts 列表

若列表为空,检查 Harbor 控制台 → 目标项目 → Helm Charts 是否已上传 Charts。


二、自动化批量拉取脚本

2.1 脚本核心逻辑

创建 pull-all-charts.sh,实现以下功能: • 动态获取 Charts 列表 • 按 Chart 名称创建目录 • 下载所有历史版本

bash 复制代码
#!/bin/bash

# 定义变量
REPO_NAME="harbor"    # Helm 仓库名称
OUTPUT_DIR="./harbor-charts"
mkdir -p "${OUTPUT_DIR}"

# 获取所有 Charts 列表(格式:仓库名/Chart名)
CHARTS=$(helm search repo ${REPO_NAME} -l | awk 'NR>1 {print $1}')

# 遍历每个 Chart
for CHART in ${CHARTS}; do
  # 提取 Chart 名称(去掉仓库名前缀)
  SHORT_NAME=$(echo "${CHART}" | sed "s|${REPO_NAME}/||")
  
  # 获取该 Chart 的所有版本
  VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[].version')
  
  # 下载每个版本
  for VERSION in ${VERSIONS}; do
    echo "正在拉取: ${SHORT_NAME} (版本 ${VERSION})"
    helm pull "${CHART}" --version "${VERSION}" --destination "${OUTPUT_DIR}"
  done
done

echo "所有 Charts 已下载到: ${OUTPUT_DIR}"

2.2 运行脚本

bash 复制代码
chmod +x pull-all-charts.sh && ./pull-all-charts.sh

输出目录结构示例:

markdown 复制代码
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)

• 原因 :用户权限不足或认证信息过期 • 修复:

bash 复制代码
# 重新配置仓库凭据
helm repo update harbor-repo --username=${USERNAME} --password=${PASSWORD}

需确保 Harbor 用户至少具备 Guest 角色。

3.2 Charts 列表不全

• 原因 :Helm 缓存或分页限制 • 方案:改用 Harbor API 直接获取(示例片段):

bash 复制代码
# 分页查询仓库列表
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 下载中断或超时

• 优化:增加重试机制

bash 复制代码
for VERSION in ${VERSIONS}; do
  until helm pull "${CHART}" --version ${VERSION}; do
    echo "Retrying ${VERSION}..."
    sleep 10
  done
done

四、扩展应用场景

4.1 仅拉取最新版本

修改版本获取逻辑:

bash 复制代码
VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[0].version')

4.2 与 CI/CD 流水线集成

在 GitLab CI 中配置阶段任务:

yaml 复制代码
pull-charts:
  stage: deploy
  script:
    - apk add helm jq
    - ./pull-all-charts.sh
  artifacts:
    paths:
      - harbor-charts/

4.3 离线环境分发

打包成压缩文件后传输:

bash 复制代码
tar czvf harbor-charts-$(date +%Y%m%d).tgz harbor-charts/

五、总结

通过本文方案,您可以:

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

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

相关推荐
Android系统攻城狮11 分钟前
Linux FFmpeg深度解析之avcodec_alloc_context3调用流程与实战(十四)
linux·运维·ffmpeg·车载音视频·音视频进阶·ffmpeg音视频进阶
自由彩虹33 分钟前
靶场通关15--bossplayersctf
linux·服务器·网络·安全·web安全·网络安全
叼烟扛炮35 分钟前
Linux 学习笔记(四十五):Web 安全基石——Cookie、Session 与 HTTPS 原理解析
linux·前端·网络·笔记·学习·tcp/ip·安全
Linux_cy1 小时前
nginx 502 排查手册:九种原因分类、定位命令与检查顺序
linux·运维·服务器·网络·数据库·nginx·ssh
椒颜皮皮虾྅1 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
垆边人似月.2 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
Lazionr2 小时前
【Linux 修炼录】:文件查看、时间查询与查找
linux
corey932 小时前
Linux 学习 - 第十四周作业
linux·运维·学习
可乐_不渴2 小时前
# C语言文件操作全解析:从 fopen 到 fclose,一文吃透文件 IO
linux·服务器·c语言
草莓熊Lotso3 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生