本文由开源摘星打算反对我的项目 Harbor 的贡献者「勾永彪」投稿。

开源摘星打算(WeOpen Star) 是由腾源会 2022 年推出的全新我的项目,旨在为开源人提供成长激励,为开源我的项目提供成长反对,助力开发者更好地理解开源,更快地逾越鸿沟,参加到开源的具体奉献与实际中。

流动详情请见:https://github.com/weopenproj...

【摘要】  基于Harbor离线装置形式的高可用方案设计及部署。

一、环境阐明

1.1 架构图

Harbor高可用架构图

【架构解析】:将Harbor的redis缓存组件、PostgreSQL数据库组件迁徙到零碎内部做高可用,应用内部共享存储实现多个Harbor实例的数据共享,Harbor实例可横向扩大。

1.2 主机清单

IP地址主机名形容
192.168.2.107harbor1Harbor实例1,8021端口
192.168.2.108harbor2Harbor实例2,8021端口
192.168.2.110harbor-data部署Harbor实例的共享存储、内部数据库、内部缓存服务
192.168.2.111/负载平衡VIP,8121端口

1.3 服务版本

服务版本要求装置版本
Harbor/2.3.5
Docker17.06.0+19.03.8
Docker-compose1.18.0+v2.2.3
Redis6.0.166.2.7
PostgreSQLv13.213.5

二、主机初始化

Harbor实例进行初始化

  • 装置docker
  • 装置docker-compose
  • 配置内核参数

2.1 装置docker

$ wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo$ yum install -y docker-ce$ systemctl enable  --now docker$ systemctl status docker$ cat <<EOF > /etc/docker/daemon.json{   "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],   "exec-opts": ["native.cgroupdriver=systemd"],     "registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],    "log-driver": "json-file",   "log-opts": {           "max-size": "500m",           "max-file": "2"         }}EOF $ systemctl daemon-reload$ systemctl restart docker
exec-opts": ["native.cgroupdriver=systemd"],     #驱动器 registry-mirrors: 镜像减速地址,可多个 max-file: log最多保留数量 live-restore: 重启docker不重启容器,多用于k8s上

2.2 装置docker-compose

装置docker-compose 1.18.0以上的版本,本处装置v2.2.3版本。

$ wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64$ mv  docker-compose-linux-x86_64 /usr/local/bin/docker-compose$ chmod +x /usr/local/bin/docker-compose$ docker-compose versionDocker Compose version v2.2.3

2.3 配置内核参数

$ modprobe br_netfilter$ cat >> /etc/sysctl.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1      #路由转发EOF$ sysctl -p

三、应用NFS提供内部共享存储

192.168.2.110部署NFS服务提供共享存储给Harbor1实例、Harbor2实例应用。192.168.2.110作为NFS服务端,harbor实例为客户端。

3.1 部署NFS服务端

1)装置并启动nfs

$ yum  install -y  nfs-utils $ systemctl start nfs && systemctl enable nfs  && systemctl status nfs$ chkconfig nfs on              #设置为开机自启

2)创立共享目录

客户端的数据将近程存入到共享目录下。

$ mkdir -p /data/harbor_data

3)批改配置

$ cat /etc/exports /data/harbor_data  192.168.2.0/24(rw,no_root_squash)  #容许哪个网段的客户端应用指定共享目录$ exportfs -arv            #使配置文件失效exporting 192.168.2.0/24:/data/harbor_data

4)重启nfs服务

$ systemctl restart nfs 

5)查看共享目录信息

$ showmount  -e localhost                    export list for localhost:/data/harbor_data

3.2 部署客户端

在harbor1和harbor2上操作

$ yum -y install nfs-utils$ systemctl start nfs-utils &&  systemctl enable nfs-utils && systemctl status  nfs-utils

3.3 客户端挂载NFS共享存储

在harbor1和harbor2节点操作,创立实例的存储目录,而后挂载到NFS。

$ mkdir -p /data/harbor_data $ cat <<EOF >> /etc/fstab192.168.2.110:/data/harbor_data /data/harbor_data nfs  defaults  0 0EOF $ mount -a
挂载格局:NFSIP:共享目录   本地目录  nfs defaults 0 0
  • 测试是否能够失常应用:
[root@harbor2 ~]# touch  /data/harbor_data/test.txt [root@harbor1 ~]# ls /data/harbor_data/test.txt

四、部署Redis缓存服务(源码)

本处为演示环境,理论生产环境请对Redis服务做高可用数据备份

192.168.2.110部署Redis缓存服务,为harbor1harbor2实例提供内部redis缓存服务。

4.1 下载安装包

$ wget https://download.redis.io/releases/redis-6.2.7.tar.gz

4.2 装置依赖包

$ yum  install  -y  gcc  gcc-c++

4.3 源码编译

$ mkdir -p /app/$ tar zxvf  redis-6.2.7.tar.gz  -C /app$ cd /app/redis-6.2.7/$ make   #编译$ make  install   #装置

4.4 批改配置文件

redis默认只反对本地应用,本处须要批改几个参数:

  • 内部可连贯;
  • redis启动形式;
  • redis近程连贯明码;
$ vim  /app/redis-6.2.7/redis.conf #bind 127.0.0.1 -::1  #75行,正文掉bind的行,容许任何主机连贯;daemonize yes       #259行,将no批改为yes,使redis能够应用守护过程形式启动;requirepass lidabai666   #903行,设置redis连贯的auth明码(lidabai666)

4.5 启动Redis服务

后面配置了应用守护过程形式启动,所以间接应用systemctl则能够启动redis服务。

$ pwd/app/redis-6.2.7$ redis-server redis.conf

4.6 服务验证

1)查看Redis服务版本

$ redis-cli -vredis-cli 6.2.7

2)查看端口

redis默认监听6379端口

$ ps aux | grep  6379root  6200  0.1  0.2 162416 10020 ?  Ssl 17:59  0:00 redis-server *:6379root  6231  0.0  0.0 112720  984 pts/0  R+  18:01  0:00 grep --color=auto 6379

3)客户端连贯Redis

harbor1harbor2作为redis客户端

$ which redis-cli      #查看redis-cli工具地位/usr/local/bin/redis-cli[root@harbor-data redis-6.2.7]# scp /usr/local/bin/redis-cli  192.168.2.107:/usr/local/bin/[root@harbor-data redis-6.2.7]# scp /usr/local/bin/redis-cli  192.168.2.108:/usr/local/bin/

客户端应用redis-cli工具连贯Redis服务器

[root@harbor1 ~]# redis-cli  -h 192.168.2.110 -p 6379 -a lidabai666
-a 参数指定redis连贯明码

五、部署PostgreSQL内部存储服务(源码)

192.168.2.110主机以源码的形式装置PostgreSQL数据库服务,为harbor1和harbor2实例提供共享存储。

5.1 新建postgres用户

默认超级用户(root)不能启动postgresql,须要手动建用户postgres。

$ useradd postgres$ id postgresuid=1000(postgres) gid=1000(postgres) 组=1000(postgres)

5.2 装置依赖包

$ yum -y install readline-devel  zlib-devel  gcc zlib

5.3 下载解压源码包

$ wget https://ftp.postgresql.org/pub/source/v13.5/postgresql-13.5.tar.gz --no-check-certificate$ tar zxvf postgresql-13.5.tar.gz   -C  /app/

5.4 编译装置

$ cd /app/postgresql-13.5/$ ./configure  --prefix=/usr/local/postgresql$ make && make install

5.5 创立数据目录

$ mkdir -p /data/postgresql/data$ chown -R postgres:postgres /usr/local/postgresql/$ chown -R postgres:postgres /data/postgresql/data/

5.6 设置postgres环境变量

[root@harbor-data postgresql-13.5]# su  - postgres[postgres@harbor-data ~]$ vim + .bash_profilePGHOME=/usr/local/postgresql   #psql装置目录export PGHOMEPGDATA=/data/postgresql/data    #数据库目录export PGDATAPATH=$PATH:$HOME/bin:$HOME/.local/bin:$PGHOME/binexport PATH[postgres@harbor-data ~]$ source ./.bash_profile[postgres@harbor-data ~]$ which psql/usr/local/postgresql/bin/psql

查看版本 [postgres@harbor-data ~]$ psql -V psql (PostgreSQL) 13.5

5.7 初始化数据库

因为 Red Hat 系列发行版的政策,PostgreSQL 装置不会启用主动启动或主动初始化数据库。要实现数据库装置,您须要依据您的发行版执行以下步骤:
[postgres@ceph3 ~]$ initdb......You can change this by editing pg_hba.conf or using the option -A, or--auth-local and --auth-host, the next time you run initdb.Success. You can now start the database server using:    #示意初始化胜利    pg_ctl -D /data/postgresql/data -l logfile start

5.8 启动PostgreSQL

依据方才初始化胜利后的提醒执行启动命令!

[postgres@harbor-data ~]$ pg_ctl -D /data/postgresql/data -l logfile startwaiting for server to start.... doneserver started

5.9 设置(批改)Postgresql明码

默认psql本地登录是不须要明码的,即便咱们设置了明码,也不须要明码就能登录。应为配置文件pg_hba.conf中的local设置为trust , 为了平安咱们批改为 password,就是应用明码能力登陆,(当咱们遗记明码的工夫,也能够应用这用形式,先设置为trust之后,批改明码,而后在设置为password。)
[postgres@harbor-data ~]$ psqlpsql (13.5)Type "help" for help.postgres=# \password    Enter new password:     #输出设置的明码 Lidabai666Enter it again:      #确认明码(再次输出)postgres=# \q    #退出

5.10  设置可近程登录PostgreSQL

[postgres@harbor-data ~]$ vim /data/postgresql/data/postgresql.conflisten_addresses = '*'    #60行,监听所有地址[postgres@harbor-data ~]$ vim + /data/postgresql/data/pg_hba.conflocal   all             all                                 passwordhost    all             all             0.0.0.0/0            passwordhost    all             all             ::1/128             password

5.10 重启PostgreSQL

$ pg_ctl -D /data/postgresql/data -l /data/postgresql/data/postgres.log restartwaiting for server to shut down.... doneserver stoppedwaiting for server to start.... doneserver started

5.11 创立数据库

Harbor 2.3.5须要创立的数据库:

  • notaryserver
  • notarysigner
  • registry
目前Harbor仅反对PostgraSQL数据库,须要手动在内部的PostgreSQL上创立registry、notary_signer、notary_servers三个数据库,Harbor启动时会主动在对应数据库下生成表。

因为本处次要是演示环境,PostgreSQL数据库的用户就以超级管理员postgres为例,如果是生产环境,倡议新建用户,并授予harbor、notary_signer、notary_servers三个数据库绝对应的权限。

[postgres@harbor-data ~]$ psqlPassword for user postgres:     #输出明码postgres=# create database  registry;CREATE DATABASEpostgres=# create database notary_signer;CREATE DATABASEpostgres=# create database notary_servers;CREATE DATABASEpostgres=# \l

5.12 创立用户

postgres=# create user server with password 'lidabai666';CREATE ROLEpostgres=# create user signer with password 'lidabai666';CREATE ROLEpostgres=# \du


六、负载平衡设置(Nginx + Keepalived)

应用keepalived和Nginx实现harbor的高可用。在harbor1harbor2节点上装置keepalived服务来提供VIP实现负载平衡。Nginx服务则实现将来到VIP的申请转发到后端服务器组harbor

6.1 装置nginx和keepalived

在harbor1和harbor2操作

$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo$ yum install -y nginx keepalived$ yum -y install nginx-all-modules.noarch     #装置nginx的stream模块

nginx从1.9.0开始新增了steam模块,用来实现四层协定的转发、代理、负载平衡等。二进制装置的nginx则在./configure时增加--with-stream参数来装置stream模块。

6.2 批改nginx配置文件

在harbor1和harbor2的Nginx服务配置文件一样。
$ vim /etc/nginx/nginx.confuser nginx;worker_processes auto;   #主动设置nginx的工作过程数量error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events {    worker_connections 1024;   #工作过程的连接数}# 四层负载平衡,为两台harbor提供负载平衡stream {    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';    access_log  /var/log/nginx/harbor-access.log  main;    upstream harbor{       server 192.168.2.107:8021;   # harbor1       server 192.168.2.108:8021;   # harbor2    }    server {       listen  8121;  #因为nginx与harbor节点复用,这个监听端口不能是8021,否则会抵触       proxy_pass harbor;    }}http {    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    access_log  /var/log/nginx/access.log  main;    sendfile            on;    tcp_nopush          on;    tcp_nodelay         on;    keepalive_timeout   65;    types_hash_max_size 2048;    include             /etc/nginx/mime.types;    default_type        application/octet-stream;    server {        listen       80 default_server;        server_name  _;        location / {        }    }}

检测nginx配置文件语法

$ nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful

6.3 批改keepalived配置

本处以harbor1为keepalived服务的主节点,harbor2为keepalived的备节点。主备节点的keepalived配置文件不一样。

1)主节点(harbor1)

[root@harbor1 ~]# cat  /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   notification_email {     859281177@qq.com   }   router_id master1}vrrp_instance lidabai {    state MASTER    interface ens33    mcast_src_ip:192.168.2.107     virtual_router_id 107    priority 100    advert_int 1    nopreempt    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.2.111/24  #虚构VIP地址    }    track_script {        chk_nginx    }}##### 健康检查vrrp_script chk_nginx {          script "/etc/keepalived/check_nginx.sh"    interval 2    weight -20}

2)备节点(harbor2)

[root@harbor2 ~]# cat  /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {   notification_email {     859281177@qq.com   }   router_id master2}vrrp_instance lidabai {    state BACKUP    interface ens33    mcast_src_ip:192.168.2.108    virtual_router_id 107    priority 80    #权重    advert_int 1    nopreempt    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.2.111/24    }    track_script {    chk_nginx    }}vrrp_script chk_nginx {  script "/etc/keepalived/check_nginx.sh"  interval 2  weight -20}

6.4 编写健康检查脚本

在主备节点(harbor1和harbor2)同样操作。
$ vim /etc/keepalived/check_nginx.sh #!/bin/bash#1、判断Nginx是否存活counter=`ps -C nginx --no-header | wc -l`if [ $counter -eq 0 ]; then    #2、如果不存活则尝试启动Nginx    service nginx start    sleep 2    #3、期待2秒后再次获取一次Nginx状态    counter=`ps -C nginx --no-header | wc -l`    #4、再次进行判断,如Nginx还不存活则进行Keepalived,让地址进行漂移    if [ $counter -eq 0 ]; then        service  keepalived stop    fifi$ chmod +x /etc/keepalived/check_nginx.sh 

6.5 启动服务

先启动master1和master2节点上的nginx服务,再启动keepalived服务

1)启动nginx服务

[root@harbor1 ~]# systemctl enable --now nginx   #启动nginx服务并设置开机自启[root@harbor2 ~]# systemctl enable --now nginx[root@harbor1 ~]# systemctl status nginx.service [root@harbor2 ~]# systemctl status nginx.service

2)启动keepalived服务

[root@harbor1 ~]# systemctl enable --now keepalived[root@harbor2 ~]# systemctl enable --now keepalived[root@harbor1 ~]# systemctl status keepalived.service[root@harbor2 ~]# systemctl status keepalived.service

6.6 查看VIP

在harbor1节点查看VIP是否胜利绑定。
[root@harbor1 ~]# ip addr......2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:f1:a3:65 brd ff:ff:ff:ff:ff:ff    inet 192.168.2.107/24 brd 192.168.2.255 scope global noprefixroute ens33       valid_lft forever preferred_lft forever    inet 192.168.2.111/24 scope global secondary ens33     #VIP地址       valid_lft forever preferred_lft forever    inet6 fe80::80b0:1d7f:b5d4:19e8/64 scope link tentative dadfailed ......
通过ifconfig是无奈查看到VIP的,通过hostname -I命令也能够查看到VIP。

七、部署Harbor实例1

在harbor1 192.168.2.107主机上部署harbor服务

7.1 下载解压离线安装包

$ mkdir /app   #创立装置目录$ wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz$ tar zxvf harbor-offline-installer-v2.3.5.tgz  -C  /app/

7.2 批改配置文件

将配置文件模板复制为配置文件,而后批改对应参数。

[root@harbor1 ~]# cd /app/harbor/[root@harbor1 harbor]# cp harbor.yml.tmpl  harbor.yml[root@harbor1 harbor]# vim harbor.ymlhostname: 192.168.2.107http:  port: 8021#勾销https平安加密拜访形式:#https:#  port: 443#  certificate: /your/certificate/path#  private_key: /your/private/key/path## 启用内部代理,启用后hostname将不再应用external_url: http:192.168.2.111:8121## 配置共享存储,即挂载的NFS目录data_volume: /data/harbor_data_version: 2.3.0## 配置内部数据库external_database:   harbor:     host: 192.168.2.110   # 数据库主机地址     port: 5432    # 数据库端口     db_name: registry    # 数据库名称     username: postgres   # 连贯该数据库的用户名     password: Lidabai666   # 连贯数据库的明码     ssl_mode: disable     max_idle_conns: 2     max_open_conns: 0   notary_signer:        host: 192.168.2.110     port: 5432     db_name: notary_signer     username: postgres     password: Lidabai666     ssl_mode: disable   notary_server:     host: 192.168.2.110     port: 5432     db_name: notary_server     username: postgres     password: Lidabai666     ssl_mode: disable##配置内部Redis实例:external_redis:         host: 192.168.2.110:6379   #redis服务IP地址和端口号。如果redis是哨兵模式,这里应该是host_sentinel1:port_sentinel1,host_sentinel2:port_sentinel2   password:  lidabai666  #连贯内部redis服务的明码#  sentinel_master_set:  #仅在应用 Sentinel模式(哨兵模式)时应用   registry_db_index: 1   jobservice_db_index: 2   #job服务的数据库索引   chartmuseum_db_index: 3  #chartmuseum插件的Redis索引   trivy_db_index: 5   #Trivy扫描器的数据索引   idle_timeout_seconds: 30  #超时工夫#启用metrics数据采集插件:metric:   enabled: true      port: 9090   path: /metrics

7.3 将配置文件注入到组件中

将harbor.yml配置文件的内容注入到各组件的配置文件中。

[root@harbor1 harbor]# ./prepare

7.4 装置Harbor

装置期间会主动导入镜像,执行实现会主动启动Harbor服务。

[root@harbor1 harbor]# ./install.sh --with-trivy --with-chartmuseum

-Harbor has been installed and started successfully.- 示意装置胜利!

7.5 查看服务状态

[root@harbor1 harbor]# docker-compose ps

7.6 浏览器登录Harbor UI

应用实例主机IP+端口在浏览器拜访harbor UI Http://192.168.2.107:8021

用户名:admin\
明码:Harbor12345

八、部署Harbor实例2

操作步骤跟部署Harbor实例1统一,仅将harbor.yml文件中hostname的值批改为以后主机的IP地址即可。

$ mkdir /app$ wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz$ tar zxvf harbor-offline-installer-v2.3.5.tgz  -C  /app/$ scp  192.168.2.107:/app/harbor/harbor.yml /app/harbor/$ vim /app/harbor/harbor.yml’hostname: 192.168.2.108

九、服务验证

9.1 浏览器拜访VIP和端口

http://192.168.2.111:8121

在Harbor UI界面测试镜像推送、拉取、创立用户、创立我的项目等是否失常

9.2 命令行登录Harbor

$ docker login http://192.168.2.111:8121 -u admin -p Harbor12345

呈现报错:\
Error response from daemon: Get https://192.168.2.111:8121/v2/: http: server gave HTTP response to HTTPS client 在docker配置文件中增加参数:

[root@harbor1 harbor]# vim  /etc/docker/daemon.json{   "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],   "exec-opts": ["native.cgroupdriver=systemd"],   "registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],   "insecure-registries": ["192.168.2.111:8121"],   "log-driver": "json-file",   "log-opts": {           "max-size": "500m",           "max-file": "2"        }}[root@harbor1 harbor]# systemctl restart docker   #而后重启docker

9.3 向Harbor推送镜像

[root@harbor1 harbor]# docker pull alpine:3.16[root@harbor1 harbor]# docker tag alpine:3.16 192.168.2.111:8121/library/alpine:3.16[root@harbor1 harbor]# docker  push 192.168.2.111:8121/library/alpine:3.16

而后能够在Harbor UI界面查看到镜像曾经推送胜利!