时间:2025-04-10 10:52
人气:
作者:admin
在企业级 Kubernetes 环境中,Harbor 作为主流的镜像与 Helm Chart 管理工具,常被用于存储 Helm Charts。但在迁移、备份或离线部署场景中,批量拉取 Harbor 中的 Charts 可能面临效率低下或权限问题。本文将通过 Helm CLI + Shell 脚本的组合方案,实现一键化批量导出操作。
通过 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 兼容模式。
helm search repo harbor-repo # 应显示 Charts 列表
若列表为空,检查 Harbor 控制台 → 目标项目 → Helm Charts 是否已上传 Charts。
创建 pull-all-charts.sh,实现以下功能:
• 动态获取 Charts 列表
• 按 Chart 名称创建目录
• 下载所有历史版本
#!/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}"
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
• 原因:用户权限不足或认证信息过期
• 修复:
# 重新配置仓库凭据
helm repo update harbor-repo --username=${USERNAME} --password=${PASSWORD}
需确保 Harbor 用户至少具备 Guest 角色。
• 原因: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 调用逻辑。
• 优化:增加重试机制
for VERSION in ${VERSIONS}; do
until helm pull "${CHART}" --version ${VERSION}; do
echo "Retrying ${VERSION}..."
sleep 10
done
done
修改版本获取逻辑:
VERSIONS=$(helm search repo "${CHART}" --versions -o json | jq -r '.[0].version')
在 GitLab CI 中配置阶段任务:
pull-charts:
stage: deploy
script:
- apk add helm jq
- ./pull-all-charts.sh
artifacts:
paths:
- harbor-charts/
打包成压缩文件后传输:
tar czvf harbor-charts-$(date +%Y%m%d).tgz harbor-charts/
通过本文方案,您可以:
建议将脚本与定时任务结合(如 CronJob),实现定期自动化备份。对于大规模环境,可参考网页7的 API 分页方案优化性能。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/18818027
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)