搭建高可用Harbor
大约 4 分钟
在实际生产使用中,主从复制十分的不靠谱!!所以这里推荐使用多实例共享后端存储的高可用方案。
本次搭建以 NFS 作为共享存储存放 Harbor 相关 data,并分离 PostgreSQL 与 Redis 为多个 Harbor 共同连接使用,使用 Nginx 做负载均衡。
这个方案在实际生产环境中部署需要考虑三个问题:
- 共享存储的选取,Harbor 的后端存储目前支持 AWS S3、Openstack Swift, Ceph 等,在下面的实验环境里,暂且直接使用 nfs。
- Session 在不同的实例上共享,这个现在其实已经不是问题了,在最新的 harbor 中,默认 session 会存放在 redis 中,只需要将 redis 独立出来即可。可以通过 redis sentinel 或者 redis cluster 等方式来保证 redis 的可用性。在下面的实验环境里,暂且使用单台 redis。
- Harbor 多实例数据库问题,这个也只需要将 harbor 中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。

方案设计
这里准备三台 Linux 服务器,规划如下
IP 地址 | hostname | 用途 |
---|---|---|
192.16.18.101 | harbor.101.com | docker、docker-compose、harbor、NFS 客户端 |
192.16.18.102 | harbor.102.com | docker、docker-compose、harbor、NFS 客户端 |
192.16.18.103 | harbor.web.com | nginx、redis、NFS 服务端 |
docker 安装
安装略过
dockers-Compose 安装
安装略过
Redis
安装略过
firewall-cmd --zone=public --permanent --add-port=6379/tcp && firewall-cmd --reload
NFS
##服务端
# 1)安装必需的RPM包
yum install -y nfs-utils rpcbind
# 2)创建NFS共享目录
mkdir -p /data/harbor_data
chown nobody:nobody /data/harbor_data/
# 3)修改NFS服务配置文件
echo "/data/harbor_data *(rw,no_root_squash)" >> /etc/exports
# 4)启动NFS服务器
systemctl enable rpcbind && systemctl restart rpcbind
systemctl enable nfs && systemctl restart nfs
# 5)开启防火墙
firewall-cmd --add-service=nfs --permanent --zone=public
firewall-cmd --add-service=mountd --permanent --zone=public
firewall-cmd --add-service=rpc-bind --permanent --zone=public
firewall-cmd --reload
##客户端
# 1)安装nfs-utils
yum -y install nfs-utils
# 2)在NFS客户端上查看NFS的连通性
showmount -e 192.16.18.103
# 3)挂载NFS共享存储
mkdir -p /data/harbor_data && mount -t nfs 192.16.18.103:/data/harbor_data /data/harbor_data
# 或者 写入fstab文件,永久挂载
# mkdir -p /data/harbor_data && echo "192.16.18.103:/data/harbor_data /data/harbor_data nfs defaults 0 0" > /etc/fstab && mount -a
# 取消挂载
umount /data/harbor_data
PostgreSQL
# 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 # 进入,输入 `psql` 和 `ALTER USER postgres WITH PASSWORD 'root123';`
# 开启远程访问
vi /var/lib/pgsql/9.6/data/postgresql.conf # listen_addresses = 'localhost' 改为 listen_addresses='*'
# 信任远程连接
cat >> /var/lib/pgsql/9.6/data/pg_hba.conf << EOF
host all all 192.16.18.101/32 trust
host all all 192.16.18.102/32 trust
host all all 192.16.18.103/32 trust
EOF
# 6)重启PostgreSQL服务
systemctl restart postgresql-9.6
# 7)验证服务 及其 创建空间
psql -h 192.16.18.103 -p 5432 -U postgres
postgres=# create database registry;
CREATE DATABASE
postgres=# create database notarysigner;
CREATE DATABASE
postgres=# create database notaryserver;
CREATE DATABASE
# 8)防火墙开启端口
firewall-cmd --zone=public --permanent --add-port=5432/tcp && firewall-cmd --reload
# 9)迁移数据库(历史数据,没有请忽略)
# 进入harbor-db容器导出相关表及数据
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外部
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
# 将数据导入至外部PostgreSQL数据库
psql -h 192.16.18.103 -U postgres registry < /tmp/registry.sql
psql -h 192.16.18.103 -U postgres notarysigner < /tmp/notarysigner.sql
psql -h 192.16.18.103 -U postgres notaryserver < /tmp/notaryserver.sql
Harbor
安装略过
# 修改配置文件
cat >> /usr/src/harbor/harbor.yml <<EOF
hostname: 192.16.18.101
https:
port: 443
certificate: /data/certs/server.crt
private_key: /data/certs/server.key
harbor_admin_password: Harbor12345
database:
password: root123
max_idle_conns: 50
max_open_conns: 1000
data_volume: /data/harbor_data
trivy:
ignore_unfixed: false
skip_update: false
insecure: false
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: 2.2.0
external_database:
harbor:
host: 192.16.18.103
port: 5432
db_name: registry
username: postgres
password: root123
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
clair:
host: 192.16.18.103
port: 5432
db_name: clair
username: postgres
password: root123
ssl_mode: disable
notary_signer:
host: 192.16.18.103
port: 5432
db_name: notarysigner
username: postgres
password: root123
ssl_mode: disable
notary_server:
host: 192.16.18.103
port: 5432
db_name: notaryserver
username: postgres
password: root123
ssl_mode: disable
external_redis:
host: 192.16.18.103
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
- trivy
EOF
# 4)生成harbor运行的必要文件(环境)以及docker-compose.yml文件;执行后会通过网络获取Docker Image,建议提前修改好国内镜像站加速。
./prepare
# 5)安装Harbor
./install.sh
# 6)防火墙端口
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --reload
Nginx
安装略过
# 编写配置文件
cat >> nginx.conf << EOF
upstream harbor {
ip_hash;
server 192.16.18.101:80;
server 192.16.18.102:80;
}
server {
listen 80;
server_name harbor.web.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;
}
}
EOF
# 加载配置
nginx -s reload
# 防火墙端口
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --zone=public --permanent --add-port=443/tcp
firewall-cmd --reload