跳至主要內容

搭建高可用Harbor

知识库运维技巧开发搭建Harbor大约 4 分钟

在实际生产使用中,主从复制十分的不靠谱!!所以这里推荐使用多实例共享后端存储的高可用方案。

本次搭建以 NFS 作为共享存储存放 Harbor 相关 data,并分离 PostgreSQL 与 Redis 为多个 Harbor 共同连接使用,使用 Nginx 做负载均衡。

这个方案在实际生产环境中部署需要考虑三个问题:

  1. 共享存储的选取,Harbor 的后端存储目前支持 AWS S3、Openstack Swift, Ceph 等,在下面的实验环境里,暂且直接使用 nfs。
  2. Session 在不同的实例上共享,这个现在其实已经不是问题了,在最新的 harbor 中,默认 session 会存放在 redis 中,只需要将 redis 独立出来即可。可以通过 redis sentinel 或者 redis cluster 等方式来保证 redis 的可用性。在下面的实验环境里,暂且使用单台 redis。
  3. Harbor 多实例数据库问题,这个也只需要将 harbor 中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。

方案设计

这里准备三台 Linux 服务器,规划如下

IP 地址hostname用途
192.16.18.101harbor.101.comopen in new windowdocker、docker-compose、harbor、NFS 客户端
192.16.18.102harbor.102.comopen in new windowdocker、docker-compose、harbor、NFS 客户端
192.16.18.103harbor.web.comopen in new windownginx、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