Harbor高可用实践

2020-06-02

相信日常工作涉及到容器Docker的人,都会用到镜像中心,Harbor是CNCF里处于incubating状态的项目,其目标是成为对Kubernetes而言可靠的云原生镜像仓库,其功能足够稳定,可用于生产环境。

本篇博客将把博主工作经历中,有关Harbor使用的情况做一些简单介绍,不涉及具体的安装步骤(互联网上教你部署harbor的博客文章可以有100篇,博主建议通过官网【Getting started】模块完成部署),只记录博主遇到的一些问题和一些使用体验。

harbor版本:v1.2.2

此阶段是博主刚进入公司时,公司正在用的harbor版本,此版本的harbor功能及其有限,大致只有用户管理、镜像存储、镜像同步(该功能非常鸡肋,只能作全量同步,也是后面升级到v1.8.1的动力主要动力所在)等模块的功能。

  • 部署方式:Docker-Compose

  • 镜像清理

    • 逻辑删除,通过API删除指定的镜像

    • 物理删除,在物理机上执行下面的脚本可真正释放磁盘空间

      docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect  /etc/registry/config.yml
      

harbor版本:v1.8.1

日常使用中发现【镜像同步】的需求开始迫切,因为我们的开发环境和自动化测试环境搭建在自己本地的机器上,本地机器不够稳定,出现过磁盘故障、内存条升级、因为内存条不兼容导致机器不定时的重启等问题,而我们的开发自动化环境用的harbor也部署在本地的机器上,基于稳定性的考虑,我们需要保障Harbor的高可用。

官方提供的Harbor高可用方案链接: https://goharbor.io/docs/1.10/install-config/harbor-ha-helm/

HA架构图:

upload successful

官网说的很清楚,“As for storage layer, it is expected that the user provide high available PostgreSQL, Redis cluster for application data and PVCs or object storage for storing images and charts”,大意是存储层的高可用需要用户自己去保证,Harbor并没有提供现成的方案。

对照我们自己的场景来看,我们可以用阿里云的OSS服务来做持久化层,足够稳定可靠,但基于1. 成本 2. 网络带宽 的考虑,我们本地机房里的Harbor不适用官方提供的这种高可用方案。

我们采用的方案是:主备Harbor互相镜像同步,搭配nginx作故障切换。

  • 主Harbor(172.16.90.5)配置镜像同步:

upload successful

  • 从Harbor(172.16.40.81)配置镜像同步:

upload successful

  • nginx配置

    upstream harbor {
      server 172.16.90.5  weight=1  max_fails=5   fail_timeout=30s;
      server 172.16.40.81  weight=1  max_fails=5   fail_timeout=30s backup;
    }
    server {
      listen       80;
      server_name harbor-dev-k8s.dui88.com;
    
      charset utf-8;
      location / {
          proxy_pass http://harbor;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-Proto $scheme;
          client_max_body_size 2G;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    }
    server {
      listen       443;
      server_name harbor-dev-k8s.dui88.com;
      ssl on;
      ssl_certificate ./certs/dui88.com.pem;
      ssl_certificate_key ./certs/dui88.com.key;
      ssl_session_timeout 5m;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
      ssl_prefer_server_ciphers on;
    
      charset utf-8;
      location / {
          proxy_pass http://harbor;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-Proto $scheme;
          client_max_body_size 2G;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    }

注意事项:

  • 主从Harbor不要开启https访问,https证书校验放在nginx层做
  • harbor镜像同步支持pull和push两种方式,我两种都配了,push是事件驱动,当有新镜像推到仓库中,会立刻向目标仓库同步,pull方式作为补偿,比如主harbor挂了五分钟,这五分钟内的镜像都推送到了从harbor中,当主harbor恢复后,这五分钟内产生的镜像会通过pull的方式同步到主harbor中
  • harbor升到1.8的版本后,不再需要通过shell脚本来清理物理磁盘空间,自带了Job组件,可定时或者自定义cron表达式用于磁盘清理,可在界面上进行配置,非常方便

harbor版本:v1.10.1

该版本是我们当前所有环境正在用的版本,该版本提供了更细致的功能,如项目定额(限制最大使用的磁盘空间)、审查服务(扫描镜像中的漏洞)等

此版本也已经支持了helm charts的上传和下载功能,可以说功能很完善了,不过博主依然没有发现告警模块,只有一个 /api/health 接口可以用来检测应用健康情况。期待Harbor项目可以在告警方面推出更多实用的功能

注意事项:

  • 这一版本中,博主全都用了helm部署harbor到Kubernetes,在实际应用中,曾遇到redis组件没有权限访问某个目录的问题,后来通过对harbor的数据目录/data执行了命令【chmod 777 /data/*】解决了问题
  • 生产环境中,公司全面上了阿里云(之前搞过一段时间的混合云(阿里云、华为云),后来因上层计划调整,华为云的服务已全部下线,将在另一篇博客中说明混合云的实践情况),博主是通过挂载阿里云云盘来做PVC持久化存储,设置云盘不随Pod实例释放,可保证一定的可用性

结语

Harbor虽然还没从CNCF毕业,但其功能丰富性和稳定性已得到时间的考验,最新的Harbor-Operator项目在今年3月被提出,目前仍在火热的开发中,可实现组件的弹性伸缩、数据的自动备份,期待它的第一个正式版正式推出,博主也在努力学习Go语言中,希望为云原生社区贡献自己的一份力量。