跳转至

国内在离线安装Harbor容器镜像仓库,真的比想象中的简单

容器镜像仓库是当今云原生时代的基础服务之一,它存储和分发着云原生最为核心的制品--容器镜像。

本文根据经验提供镜像仓库的选型方案、实际实践经验案例,以及如何在国内快速进行 Harbor 服务搭建,同时提供 Harbor HTTPS 合法证书的解决思路。

镜像仓库方案选型

公共镜像仓库使用便捷,可实时跟随社区更新。企业私有的容器镜像仓库可以提供容器镜像安全保障、托管企业私有镜像、提升镜像拉取的效率,以及解决海外镜像获取困难等问题。

而且对于上诉解决的一系列问题中,“解决海外镜像获取困难” 可能是一个普适性的痛点。特别是对于 Docker Hub、Google GCR 等的全球镜像仓库中优质的镜像,若无法正常的获取和使用,会对企业的实际生产运营带来一定的影响。

在前面文章中提供了解决方案: DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案

推荐有条件的企业都建设私有的容器镜像仓库。建立企业私有容器镜像仓库的技术选型有:原始Registry、 Harbor、Nexus、公有云镜像仓库,以及一些商业化制品库等方案,本文推荐基于 Harbor 的方案。

基于开源Harbor方案在安全性、开源开放、合规性、数据私有化,以及厂商绑定等方面有一定的优势。

Harbor实际生产经验(坑)

Harbor的安装部署方案主要有两种,Docker Compose 安装方案和基于Kubernetes Helm Chart 安装方案。

根据经验来看,建议企业至少有一套基于 Docker Compose 部署的初始的镜像仓库,生产环境可以选择基于 Kubernetes 搭建高可用,高性能的 Harbor 镜像仓库服务。将集群中etcd和kubernetes相关组件镜像存储在docker compose部署的镜像仓库中。

之前有遇到过由于 Harbor 安装方案不合理导致的生产环境问题的实践经验教训。

当时给客户交付了一套基于kubernetes的云原生环境,在一次机房掉电恢复时,etcd和kubernetes启动的镜像拉取策略imagePullPolicy没有设置,默认为Always,所以在启动时需要到harbor中拉取镜像。

而Harbor自己也运行在这个kubernetes中,甚至harbor自己启动也要到harbor中拉取镜像,这就出现了循环依赖问题。Harbor无法自动恢复,其他依赖 Harbor 的服务业务都无法正常启动。

最后临时解决方案是通过重上传离线的 etcd、k8s、ingress等镜像后先恢复kubernetes,然后才恢复好harbor,其他服务才陆续恢复。这个事故导致掉电恢复的时长比预期的长很多,SLA 损失惨重。

经过这次经验后,后续项目交付时都会通过 docker compose 部署初始harbor保存环境基础的镜像,确实没有资源条件时也会通过原始的registry或save的镜像文件进行兜底。

Harbor 的 Docker Compose 安装

官网介绍的详细安装步骤 https://harbor.website.cncfstack.com/docs/2.13.0/install-config/ (注: 该Harbor的官网文档已经在藏云阁建立了镜像站点,国内可以高速访问)

使用 Docker Compose 安装Harbor步骤主要有以下几个关键步骤

  • 步骤一:下载并解压harbor安装工具包
  • 步骤二:准备 HTTPS证书
  • 步骤三:修改配置文件
  • 步骤四:执行安装
  • 步骤五:查看并分析部署运行的Harbor服务
  • 后续可选的配置与优化

步骤一:下载并解压harbor安装工具包

在 Harbor Github Release 页面(https://github.com/goharbor/harbor/releases)选择需要的版本安装工具包。 安装工具包分为在线安装版本和离线安装版本,他们的之间的差异是“离线安装版本中包含 docker save 出来的容器镜像离线包”。 图片 推荐下载离线的安装包( https://github.com/goharbor/harbor/releases/download/v2.13.0/harbor-offline-installer-v2.13.0.tgz ) 下载后解压后的内容如图:

harbor-download-url

藏云阁提供 harbor 离线安装包下载,在公众号中发送关键词【harbor】 即可获取下载链接。

步骤二:准备HTTPS证书

根据规划的 Harbor 域名准备 HTTPS 证书,并放置在指定的路径下,在该路径下包含证书文件和私钥key文件。 例如

证书: /data/harbor/cert/harbor.cloud.cncfstack.com.pem
私钥: /data/harbor/cert/harbor.cloud.cncfstack.com.key 

对于证书文件可以使用自签证书和合法证书,文章末尾有免费合法证书的申请说明。

步骤三:修改配置文件

首先基于安装包中 harbor.yml.tmpl 复制一份 harbor.yml 文件

# cp harbor.yml.tmpl harbor.yml

然后对复制的 harbor.yml 文件进行配置修改

虽然整个文件配置项有很多,实际需要修改的配置主要就3项

  • harbor域名
  • 证书配置
  • admin账号登录密码

其他配置项保持默认即可

步骤四:执行安装

对于离线安装需要先导入离线镜像,在线安装默认会从 Docker Hub 中拉取镜像进行安装。

docker load -i ./harbor.v2.13.0.tar.gz

然后,执行安装直接执行 install.sh 脚本即可

sudo ./install.sh

安装完成后会提示安装成功,并自动通过 docker compose up -d 启动服务。

步骤五:查看并分析部署运行的Harbor服务

harbor 安装完成后即可通过步骤三中的域名和密码登录harbor页面,对于后台启动的容器服务如下

  • harbor-jobservice:harbor任务服务。执行异步任务,如镜像复制、漏洞扫描、垃圾回收等后台作业。
  • nginx-photon:Nginx服务。包含harbor的代理配置,可以使用外部 Nginx 替换。
  • harbor-core:Harbor的核心业务逻辑服务,包含权限、元数据、webhook、token等管理。
  • harbor-db: PostgreSQL数据库。可以使用外部 PostgreSQL 替换。
  • harbor-registryctl:控制Registry的运行状态,提供API接口执行管理操作。
  • registry-photon: Registry 服务。Docker 开源的 Registry 。
  • harbor-portal:Harbor页面服务。
  • redis-photon:Redis数据库。可以使用外部 Redis 替换。
  • harbor-log:Harbor各组件日志管理服务。

在 Harbor 中 Nginx、PostgreSQL、Redis 是开源的方案实现,可以通过外部服务替代,如云产品服务。特别是 PostgreSQL和Redis也是高可用部署时核心要解决的问题

后续可选的配置与优化

  • 给 Harbor 申请合法HTTPS证书
  • 可以给 Harbor 配置对象存储来保存镜像数据,加速镜像上传下载性能。如阿里云OSS/腾讯云COS等云产品,或者使用 minio 等。
  • 给 Harbor 配置 SSO 登录

关于Harbor HTTPS证书问题

注意Harbor运行是强依赖HTTPS的,所以部署必须提供HTTPS证书。而提供证书有两种方式,自签证书与申请合法证书。

自签证书使用时比较麻烦,需要所有客户端在访问时配置insecret忽略不安全证书提醒,有些场景没有修改文件权限时就比较麻烦。即需要在 /etc/docker/daemon.json 中添加 "insecure-registries" 配置并重启服务,而且是所有客户的节点都要配置。

推荐使用合法证书,HTTPS合法证书是可以免费申请,无限续签的,且不限制域名数量,也可以申请通配符域名证书,没有特殊情况不建议花钱购买证书。关于免费HTTPS证书的申请方法,会在后续文章中详细展开。