部署Harbor私有仓库
一、Harbor
1、Harbor简介
Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。
为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。
Harbor的架构示意图:
Harbor的GitHub仓库地址如下:
- https://github.com/goharbor/harbor
- Wiki:https://github.com/goharbor/harbor/wiki
2、Harbor高可用部署
官方的安装文档:
- https://goharbor.io/docs/2.0.2/install-config/
本文采用的高可用方案是Harbor的双主复制,该方案比较简单,需要搭建至少两个Harbor节点,并且节点之间能够互相复制,然后通过nginx代理Harbor节点提供外部访问。这里采用的高可用方案级别没那么高,因为主要是通过Nginx代理其中一个节点,该节点挂掉后需要手动修改Nginx配置文件去代理另一个可用节点。
所以此方案比较适合中小型公司,而且Harbor主要是给公司内部的开发人员使用的,通常只需要保证分钟级的高可用性就可以了。另外还有一点就是,云环境基本无法使用keepalived,因为云服务商一般不支持自定义外网可访问的虚拟IP,要么就是使用起来非常麻烦。这也是为什么没有采用keepalived的原因之一,当然,如果是部署在内网服务器上也是可以采用keepalived的
3、准备工作
我这里使用了三台CentOS-7.9的虚拟机,具体信息如下表:
系统版本 | IP地址 | 节点角色 | CPU | Memory | Hostname |
CentOS-7.9 | 192.168.10.101 | Nginx | \>=2 | \>=2G | Nginx, Docker |
CentOS-7.9 | 192.168.10.102 | Harbor1 | \>=2 | \>=2G | Docker01 |
CentOS-7.9 | 192.168.10.106 | Harbor2 | \>=2 | \>=2G | Docker02 |
二、安装Harbor(worker节点)
在两台worker节点上分别安装Harbor,由于官方提供了安装脚本,安装过程还是比较简单的。具体步骤如下:
1、下载安装包
首先下载官方的离线安装包,当然你能科学上网的话使用在线安装包也可以:
https://github.com/goharbor/harbor/releases/tag/v2.4.3
https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-offline-installer-v2.4.3.tgz
2、下载完成后,将压缩包上传到两个worker节点,并解压
3、配置harbor
3.1、将模板拷贝一份出来
4、运行脚本
./install.sh
5、访问测试
三、安装Nginx
1、拉取nginx的镜像
docker pull nginx:1.13.12
2、编辑配置文件
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}stream {upstream hub {server 192.168.10.102:80;}server {listen 80;proxy_pass hub;proxy_timeout 300s;proxy_connect_timeout 5s;}
}
Tips:这里只所以只代理其中一个Harbor节点是因为Harbor节点之间的同步存在延迟,而且通常镜像都比较大,所以这个延迟也会比较明显。一般镜像推送完马上就会调度拉取,所以这个延迟时间一般是不可接受的。如果让nginx代理两个节点就会出现一会请求A一会请求B的问题,造成镜像pull/push不成功。只代理一个节点也成为了这个方案的缺点,当nginx代理的那个节点宕掉,我们得手动修改nginx的配置代理另一个节点。但由于Harbor是给公司内部的开发人员使用,通常可以允许分钟级别的不可用。
3、编写重启脚本
vim restart.sh
#!/bin/bashdocker stop harbor-nginx
docker rm harbor-nginxdocker run -itd --net=host --name harbor-nginx -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.13.12
4、运行脚本
bash restart.sh
5、使用代理节点IP访问
5.1、创建Harbor项目和用户
将默认的library项目删除掉,然后创建一个新项目,项目名称为kubernetes
5.2、到“用户管理”新建一个用户
5.3、将该用户添加到新建的项目中
6、所有的docker主机设置daemon.json文件
回到命令行上测试一下push和pull。由于我们自己搭建的私有仓库默认是不受Docker信任的,所以需要先在配置文件中增加如下配置项让Docker信任该registry:
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
vim /etc/docker/daemon.json{
"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com"],
"insecure-registries": ["192.168.10.101"]
}
7、重新启动一个容器
bash restart.sh
8、重新跑一遍harbor脚本
./install.sh
docker ps -a
./install.sh
docker ps -a
9、push上传
然后尝试使用命令行push一个镜像到Harbor上
docker login 192.168.10.101
docker pull cirros
docker tag cirros 192.168.10.101/kubernetes/cirros:v1
docker push 192.168.10.101/kubernetes/cirros:v1
10、pull拉取
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker pull 192.168.10.101/kubernetes/cirros:v1
docker images
11、配置Harbor节点互相复制(两个节点都设置,要连接对方的ip)
测试完Harbor的基本功能后,我们接下来配置一下Harbor节点之间的互相复制功能,让两个节点能够同步镜像数据。首先到第一个节点上的“仓库管理”界面中新建一个目标,这个目标就是另一台Harbor节点:
然后到“复制管理”界面中新建复制规则,如下
- 资源过滤器是用于定义只复制哪些镜像的,过滤维度有名称、tag和label。不配置默认复制全部
定义了复制规则后,我们可以在界面上手动触发复制:
复制成功后,到另一个节点上可以看到kubernetes这个项目及项目下的镜像都被复制过去了: