Harbor是一个用于存储和分发Docker镜像
的企业级Registry
服务器,经过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。html
做为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。前端
提高用户使用Registry构建和运行环境传输镜像的效率。nginx
Harbor支持安装在多个Registry节点的镜像资源复制,镜像所有保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。git
另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。github
harbor官方默认提供主从复制的方案来解决镜像同步问题,经过复制的方式,咱们能够实时将测试环境harbor仓库的镜像同步到生产环境harbor,相似于以下流程:web
imgredis
在实际生产运维的中,每每须要把镜像发布到几十或上百台集群节点上。这时,单个Registry已经没法知足大量节点的下载需求,所以要配置多个Registry实例作负载均衡。手工维护多个Registry实例上的镜像,将是十分繁琐的事情。Harbor能够支持一主多从的镜像发布模式,能够解决大规模镜像发布的难题:sql
只要往一台Harbor上发布,镜像就会像"仙女散花"般地同步到多个Registry中,高效可靠。docker
若是是地域分布较广的集群,还能够采用层次型发布方式,好比从集团总部机房同步到分公司1机房,再从分公司1机房同步到分公司2机房:数据库
然而单靠主从同步,仍然解决不了harbor主节点的单点问题。
所谓的双主复制其实就是复用主从同步实现两个harbor节点之间的双向同步,来保证数据的一致性,而后在两台harbor前端顶一个负载均衡器将进来的请求分流到不一样的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在必定程度上实现了Harbor的高可用性:
这个方案有一个问题就是有可能两个Harbor实例中的数据不一致。假设若是一个实例A挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另一个实例B中,后面即便恢复了挂掉的A实例,Harbor实例B也不会自动去同步镜像,这样只能手动的先关掉Harbor实例B的复制策略,而后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。
另外,这里还须要多吐槽一句:在实际生产使用中,主从复制十分的不靠谱!!因此这里推荐使用下面要说的这种方案。
共享后端存储算是一种比较标准的方案,就是多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,均可被其余实例中读取。经过前置LB进来的请求,能够分流到不一样的实例中去处理,这样就实现了负载均衡,也避免了单点故障。
本次搭建以NFS做为共享存储存放Harbor相关data,并分离PostgreSQL与Redis为多个Harbor共同链接使用,使用Nginx作负载均衡。
img
若是最终生产环境集群中服务器较多,依赖作完LB的Harbor也没法彻底达到需求时,可使用以下架构,部署下级Harbor节点从主节点同步镜像,而后再分发给生产服务器。
这个方案在实际生产环境中部署须要考虑三个问题:
1. 共享存储的选取,Harbor的后端存储目前支持AWS S三、Openstack Swift, Ceph等,在下面的实验环境里,暂且直接使用nfs。
2. Session在不一样的实例上共享,这个如今其实已经不是问题了,在最新的harbor中,默认session会存放在redis中,只须要将redis独立出来便可。能够经过redis sentinel或者redis cluster等方式来保证redis的可用性。在下面的实验环境里,暂且使用单台redis。
3. Harbor多实例数据库问题,这个也只须要将harbor中的数据库拆出来独立部署便可。让多实例共用一个外部数据库,数据库的高可用也能够经过数据库的高可用方案保证。
CentOS 7.6
软件 | 版本 |
---|---|
Docker | 19.03.8 |
docker-compose | 1.25.5 |
Harbor | 1.10.2 |
Nginx | 1.14.0 |
PostgreSQL | 9.6.17 |
Redis | 3.2.12 |
这里主要作Harbor高可用演示,真实生产环境请按需分离NFS与DB单独部署。
IP | 主机名 |
---|---|
192.168.16.141 | Nginx |
192.168.166.122 | NFS |
192.168.166.203 | postgresql |
192.168.166.245 | Redis |
192.168.166.81 | Harbor-01 |
192.168.166.212 | Harbor-02 |
1)安装依赖包:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2)官方一键脚本安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
3)添加内核参数
tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
将net.ipv4.ip_forward
赋值为1
而后刷新内核参数
sysctl -p
4)修改Docker仓库为国内镜像站
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
5)启动Docker
systemctl enable docker && systemctl start docker
compose是Docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用compose,咱们能够经过YAML文件声明式的定义应用程序的各个服务,并由单个命令完成应用的建立和启动。
因为国内政策缘由,可能在海外网站上下载文件速度较慢,建议下载本地后上传至服务器
1)下载docker-compose
并赋予可执行权限
# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
cd /usr/local/bin
scp 192.168.166.96:/usr/local/bin/docker-compose .
注意:因为我其余服务器已经存在,因此我直接拷贝了
2)安装bash补全命令
# curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/
从新链接终端即生效
注意:因为我其余服务器已经存在,因此我直接拷贝了
1)安装必需的RPM包
yum -y install nfs-utils rpcbind
2)建立NFS共享目录
mkdir -p /data/harbor_data
chown nobody:nobody /data/harbor_data/
3)修改NFS服务配置文件
echo "/data/harbor_data 192.168.166.0/24(rw,sync,no_root_squash)" >> /etc/exports
4)启动NFS服务器
systemctl enable rpcbind && systemctl restart rpcbind
systemctl enable nfs && systemctl restart nfs
1)安装nfs-utils
yum -y install nfs-utils
2)在NFS客户端上查看NFS的连通性
# showmount -e 192.168.166.122
Export list for 192.168.166.122:
/data/harbor_data 192.168.166.0/24
3)挂载NFS共享存储
建立挂载目录
mkdir /data
修改/etc/fstab配置文件加入如下内容
192.168.166.122:/data/harbor_data /data nfs defaults 0 0
mount挂载
mount -a
1)下载PostgreSQL官方YUM源配置文件包并安装
wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm
2)安装PostgreSQL
yum -y install postgresql96-server postgresql96-contrib
3)初始化数据库
/usr/pgsql-9.6/bin/postgresql96-setup initdb
4)启动数据库
systemctl enable postgresql-9.6 && systemctl restart postgresql-9.6
5)PostgreSQL数据库配置
# su - postgres
-bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
ALTER ROLE
vi /var/lib/pgsql/9.6/data/postgresql.conf
# listen_addresses = 'localhost' 改成 listen_addresses='*'
vim /var/lib/pgsql/9.6/data/pg_hba.conf
加入:
host all all 192.168.166.203/32 trust
host all all 192.168.166.81/32 trust
host all all 192.168.166.212/32 trust
6)重启PostgreSQL服务
systemctl restart postgresql-9.6
7)验证服务
psql -h 192.168.166.203 -p 5432 -U postgres
8)迁移数据库
简要步骤以下:
# yum install -y yum-utils device-mapper-persistent-data lvm2
# curl -fsSL get.docker.com -o get-docker.sh
# sh get-docker.sh --mirror Aliyun
#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
# systemctl enable docker && systemctl start docker
# cd /usr/local/bin
# scp 192.168.166.96:/usr/local/bin/docker-compose .
# scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/
# cd ~
# scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .
# tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
# cd /usr/local/harbor/
# vim harbor.yml ###修改hostname: 192.168.166.203 ####注释掉https段便可
# ./prepare
# ./install.sh
# docker-compose up -d
# docker container exec -it harbor-db /bin/bash
pg_dump -U postgres registry > /tmp/registry.sql
pg_dump -U postgres notarysigner > /tmp/notarysigner.sql
pg_dump -U postgres notaryserver > /tmp/notaryserver.sql
docker container cp harbor-db:/tmp/registry.sql /tmp
docker container cp harbor-db:/tmp/notarysigner.sql /tmp
docker container cp harbor-db:/tmp/notaryserver.sql /tmp
# psql -h 192.168.166.203 -U postgres
postgres=# create database registry;
CREATE DATABASE
postgres=# create database notarysigner;
CREATE DATABASE
postgres=# create database notaryserver;
CREATE DATABASE
psql -h 192.168.166.203 -U postgres registry < /tmp/registry.sql
psql -h 192.168.166.203 -U postgres notarysigner < /tmp/notarysigner.sql
psql -h 192.168.166.203 -U postgres notaryserver < /tmp/notaryserver.sql
1)安装redis
yum -y install redis
2) 修改配置参数
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.conf
sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf
3)启动并测试redis链接
systemctl enable redis && systemctl restart redis
redis-cli
下载Harbor离线安装包,离线安装包文件较大(约为:590M),建议在本地使用多线程工具下载后上传服务器使用。
1)下载
cd ~
scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .
2)解压
tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
3)修改配置文件
# cd /usr/local/harbor/
# vim harbor.yml
修改的内容有
hostname
修改成本机ip/data
目录下,因此不用动database
clair
external_database
和external_redis
块的注释,并改成刚刚部署的地址修改完的样例文件,以下
hostname: 192.168.166.81
http:
port: 80
harbor_admin_password: Harbor12345
data_volume: /data
jobservice:
max_job_workers: 10
notification:
webhook_job_max_retry: 10
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 1.10.0
external_database:
harbor:
host: 192.168.166.203
port: 5432
db_name: registry
username: postgres
password: postgres
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
clair:
host: 192.168.166.203
port: 5432
db_name: clair
username: postgres
password: postgres
ssl_mode: disable
notary_signer:
host: 192.168.166.203
port: 5432
db_name: notarysigner
username: postgres
password: postgres
ssl_mode: disable
notary_server:
host: 192.168.166.203
port: 5432
db_name: notaryserver
username: postgres
password: postgres
ssl_mode: disable
external_redis:
host: 192.168.166.245
port: 6379
password:
registry_db_index: 1
jobservice_db_index: 2
chartmuseum_db_index: 3
clair_db_index: 4
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- clair
4)生成harbor运行的必要文件(环境)以及docker-compose.yml
文件;执行后会经过网络获取Docker Image,建议提早修改好国内镜像站加速。
./prepare
5)安装Harbor
./install.sh
1)安装nginx
安装能够参考https://wiki.clay-wangzhi.com/7-nginx/1.-chu-shi-nginx#4-bian-yi-an-zhuang-nginx
这里我就再也不详细讲了
2)编写配置文件
# cat harbor.schengle.com.conf
upstream harbor {
ip_hash;
server 192.168.166.81:80;
server 192.168.166.212:80;
}
server {
listen 80;
server_name harbor.***.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name harbor.schengle.com;
ssl_certificate ***.crt;
ssl_certificate_key ***.key;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
proxy_pass http://harbor;
proxy_redirect default;
proxy_http_version 1.1;
}
location /v2/ {
proxy_pass http://harbor/v2/;
proxy_redirect default;
#proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
proxy_buffering off;
proxy_request_buffering off;
}
}
3)平滑重启nginx
nginx -s reload
https://www.cnblogs.com/kevingrace/p/11422710.html
https://juejin.im/post/5d973e246fb9a04dfa0963fb#heading-18
http://dwz-9.cn/_L4me