一、背景介绍

在软件开发和部署的过程中,容器技术变得越来越重要。Harbor 作为一个企业级的 Docker 镜像仓库,能够帮助我们高效地管理和存储容器镜像。不过,随着业务的发展,镜像数量会不断增加,占用的存储空间也会越来越大。所以,优化 Harbor 的存储策略来节省空间就显得尤为重要了。

1.1 应用场景

想象一下,你所在的公司有多个开发团队,每个团队都在不断地开发和测试新的应用。这些应用的容器镜像都存储在 Harbor 仓库里。随着时间的推移,仓库里的镜像越来越多,存储空间变得紧张起来。这时候,就需要优化存储策略来节省空间,避免因为存储空间不足而影响业务的正常运行。

比如,某电商公司在进行促销活动期间,开发团队会频繁地更新应用镜像以修复漏洞和添加新功能。如果不优化存储策略,Harbor 仓库很快就会被大量的镜像占满,导致无法正常存储新的镜像。

1.2 技术优缺点

优点

  • 节省成本:优化存储策略可以减少对存储设备的需求,从而降低企业的存储成本。例如,原本需要购买大容量的存储设备来存储镜像,通过优化后,可能只需要较小容量的设备就能满足需求。
  • 提高性能:减少不必要的镜像存储,可以加快镜像的上传和下载速度。因为仓库中的镜像数量减少了,查找和传输镜像的时间也会相应减少。

缺点

  • 配置复杂:优化存储策略可能需要对 Harbor 进行一些复杂的配置,对于一些技术水平较低的管理员来说,可能会有一定的难度。
  • 数据丢失风险:在清理镜像的过程中,如果操作不当,可能会导致重要的镜像被误删除,从而影响业务的正常运行。

二、优化存储策略的方法

2.1 清理无用镜像

在 Harbor 中,有很多镜像可能是测试用的或者已经不再使用的,这些镜像占用了大量的存储空间。我们可以定期清理这些无用的镜像。

示例(Shell 脚本技术栈)

#!/bin/bash
# 定义 Harbor 的 API 地址和认证信息
HARBOR_API="https://your-harbor-server/api/v2.0"
USERNAME="your-username"
PASSWORD="your-password"

# 获取所有项目列表
PROJECTS=$(curl -s -u $USERNAME:$PASSWORD $HARBOR_API/projects | jq -r '.[].name')

# 遍历每个项目
for PROJECT in $PROJECTS; do
    # 获取项目下的所有仓库
    REPOSITORIES=$(curl -s -u $USERNAME:$PASSWORD $HARBOR_API/projects/$PROJECT/repositories | jq -r '.[].name')
    for REPOSITORY in $REPOSITORIES; do
        # 获取仓库下的所有镜像标签
        TAGS=$(curl -s -u $USERNAME:$PASSWORD $HARBOR_API/projects/$PROJECT/repositories/$REPOSITORY/tags | jq -r '.[].name')
        for TAG in $TAGS; do
            # 这里可以添加判断条件,比如只删除特定时间之前的镜像
            # 示例:删除 30 天前的镜像
            CREATED_TIME=$(curl -s -u $USERNAME:$PASSWORD $HARBOR_API/projects/$PROJECT/repositories/$REPOSITORY/tags/$TAG | jq -r '.created')
            CREATED_TIMESTAMP=$(date -d "$CREATED_TIME" +%s)
            NOW_TIMESTAMP=$(date +%s)
            DIFF_DAYS=$(( (NOW_TIMESTAMP - CREATED_TIMESTAMP) / 86400 ))
            if [ $DIFF_DAYS -gt 30 ]; then
                # 删除镜像
                curl -X DELETE -u $USERNAME:$PASSWORD $HARBOR_API/projects/$PROJECT/repositories/$REPOSITORY/tags/$TAG
                echo "Deleted $PROJECT/$REPOSITORY:$TAG"
            fi
        done
    done
done

这个脚本的作用是遍历 Harbor 中的所有项目、仓库和镜像标签,删除 30 天前创建的镜像。

2.2 启用镜像分层存储

Harbor 支持镜像分层存储,即多个镜像可以共享相同的基础层。这样可以避免重复存储相同的内容,从而节省存储空间。

示例

假设我们有两个镜像,一个是基于 Ubuntu 18.04 的 Python 3.7 镜像,另一个是基于 Ubuntu 18.04 的 Node.js 12 镜像。这两个镜像都包含了 Ubuntu 18.04 的基础层。如果启用了镜像分层存储,Harbor 只会存储一份 Ubuntu 18.04 的基础层,两个镜像共享这份基础层,从而节省了存储空间。

2.3 配置存储配额

为每个项目设置存储配额可以有效地控制每个项目的存储空间使用。当项目的存储使用量达到配额时,就不能再上传新的镜像了。

示例(通过 Harbor 管理界面)

  1. 登录 Harbor 管理界面。
  2. 进入项目管理页面,选择要设置配额的项目。
  3. 在项目设置中,找到“存储配额”选项,设置合适的配额大小,比如 10GB。
  4. 保存设置后,该项目的存储使用量就会受到限制。

三、注意事项

3.1 备份重要镜像

在清理镜像之前,一定要备份重要的镜像。可以将这些镜像导出到本地或者其他存储设备上,以防误删。

3.2 测试清理脚本

在正式运行清理脚本之前,最好先在测试环境中进行测试,确保脚本的正确性和安全性。

3.3 监控存储使用情况

定期监控 Harbor 的存储使用情况,及时发现存储空间不足的问题,并采取相应的措施。

四、文章总结

优化 Harbor 的存储策略是一项非常重要的工作,可以帮助我们节省存储空间,降低成本,提高性能。通过清理无用镜像、启用镜像分层存储和配置存储配额等方法,可以有效地优化 Harbor 的存储使用。在实施这些策略的过程中,需要注意备份重要镜像、测试清理脚本和监控存储使用情况等事项,以确保操作的安全性和有效性。