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

打印 上一主题 下一主题

主题 1673|帖子 1673|积分 5019

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
弁言

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

1.1 添加 Harbor 堆栈

通过 Helm 命令行工具关联 Harbor 堆栈,需指定项目路径和认证信息:
  1. # 配置变量(按实际环境修改)
  2. HARBOR_URL="https://harbor.example.com"
  3. PROJECT_NAME="your-project"
  4. USERNAME="admin"
  5. PASSWORD="your-password"
  6. # 添加 Helm 仓库
  7. helm repo add harbor-repo ${HARBOR_URL}/chartrepo/${PROJECT_NAME} \
  8.   --username=${USERNAME} \
  9.   --password=${PASSWORD}
  10. # 强制更新仓库索引(避免缓存导致列表不全)
  11. helm repo update --force-update harbor-repo
复制代码
注意:若 Harbor 版本 ≥2.6.0,需确保已弃用 ChartMuseum 并启用 OCI 兼容模式。
1.2 验证堆栈可见性
  1. helm search repo harbor-repo  # 应显示 Charts 列表
复制代码
若列表为空,查抄 Harbor 控制台 → 目标项目 → Helm Charts 是否已上传 Charts。
二、主动化批量拉取脚本

2.1 脚本核心逻辑

创建 pull-all-charts.sh,实现以下功能:
动态获取 Charts 列表
按 Chart 名称创建目录
下载所有历史版本
  1. #!/bin/bash
  2. REPO_NAME="harbor-repo"
  3. OUTPUT_DIR="./harbor-charts"
  4. mkdir -p "${OUTPUT_DIR}"
  5. # 获取 Charts 列表(过滤表头)
  6. CHARTS=$(helm search repo ${REPO_NAME} -l | awk 'NR>1 {print $1}')
  7. for CHART in ${CHARTS}; do
  8.   SHORT_NAME=$(echo "${CHART}" | sed "s|${REPO_NAME}/||")
  9.   CHART_DIR="${OUTPUT_DIR}/${SHORT_NAME}"
  10.   mkdir -p "${CHART_DIR}"
  11.   # 获取所有版本(JSON 解析)
  12.   VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[].version')
  13.   
  14.   # 并行下载(4线程)
  15.   echo ${VERSIONS} | xargs -n1 -P4 -I{} helm pull "${CHART}" --version {} --destination "${CHART_DIR}"
  16. done
  17. echo "Download completed! Output directory: ${OUTPUT_DIR}"
复制代码
2.2 运行脚本
  1. chmod +x pull-all-charts.sh && ./pull-all-charts.sh
复制代码
输出目录结构示例:
  1. harbor-charts/
  2. ├── nginx/
  3. │   ├── nginx-1.2.3.tgz
  4. │   └── nginx-4.5.6.tgz
  5. └── redis/
  6.     ├── redis-7.0.0.tgz
  7.     └── redis-8.1.0.tgz
复制代码
三、常见题目与解决方案

3.1 权限错误(403 Forbidden)

原因:用户权限不足或认证信息过期
修复
  1. # 重新配置仓库凭据
  2. helm repo update harbor-repo --username=${USERNAME} --password=${PASSWORD}
复制代码
需确保 Harbor 用户至少具备 Guest 角色。
3.2 Charts 列表不全

原因:Helm 缓存或分页限制
方案:改用 Harbor API 直接获取(示例片段):
  1. # 分页查询仓库列表
  2. PAGE=1
  3. while true; do
  4.   REPO_PAGE=$(curl -s -k -u "${USERNAME}:${PASSWORD}" \
  5.     "${HARBOR_URL}/api/v2.0/projects/${PROJECT_ID}/repositories?page=${PAGE}&page_size=50")
  6.   # 解析并追加到列表...
  7. done
复制代码
完整脚本可参考网页3的 API 调用逻辑。
3.3 下载停止或超时

优化:增加重试机制
  1. for VERSION in ${VERSIONS}; do
  2.   until helm pull "${CHART}" --version ${VERSION}; do
  3.     echo "Retrying ${VERSION}..."
  4.     sleep 10
  5.   done
  6. done
复制代码
四、扩展应用场景

4.1 仅拉取最新版本

修改版本获取逻辑:
  1. VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[0].version')
复制代码
4.2 与 CI/CD 流水线集成

在 GitLab CI 中设置阶段任务:
  1. pull-charts:
  2.   stage: deploy
  3.   script:
  4.     - apk add helm jq
  5.     - ./pull-all-charts.sh
  6.   artifacts:
  7.     paths:
  8.       - harbor-charts/
复制代码
4.3 离线情况分发

打包成压缩文件后传输:
  1. tar czvf harbor-charts-$(date +%Y%m%d).tgz harbor-charts/
复制代码
五、总结

通过本文方案,您可以:

  • 快速备份:全量保存 Harbor 中的 Helm Charts
  • 简化迁移:跨集群或跨 Harbor 实例同步 Charts
  • 支持离线部署:与 Air-Gapped 情况无缝衔接
发起将脚本与定时任务联合(如 CronJob),实现定期主动化备份。对于大规模情况,可参考网页7的 API 分页方案优化性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表