Harbor高可用集群设计及部署(基于离线安装方式二)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 基于Harbor离线安装方式的高可用方案设计及部署。

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

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

5.1 新建postgres用户

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

$ useradd postgres
$ id postgres
uid=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_profile
PGHOME=/usr/local/postgresql   #psql安装目录
export PGHOME
PGDATA=/data/postgresql/data    #数据库目录
export PGDATA
PATH=$PATH:$HOME/bin:$HOME/.local/bin:$PGHOME/bin
export 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 start
waiting for server to start.... done
server started

5.9 设置(修改)Postgresql密码

默认psql本地登录是不需要密码的,即使我们设置了密码,也不需要密码就能登录。应为配置文件pg_hba.conf中的local设置为trust , 为了安全我们修改为 password,就是使用密码才能登陆,(当我们忘记密码的时间,也可以使用这用方式,先设置为trust之后,修改密码,然后在设置为password。)

[postgres@harbor-data ~]$ psql
psql (13.5)
Type "help" for help.
postgres=# \password    
Enter new password:     #输入设置的密码 Lidabai666
Enter it again:      #确认密码(再次输入)
postgres=# \q    #退出

5.10  设置可远程登录PostgreSQL

[postgres@harbor-data ~]$ vim /data/postgresql/data/postgresql.conf
listen_addresses = '*'    #60行,监听所有地址
[postgres@harbor-data ~]$ vim + /data/postgresql/data/pg_hba.conf
local   all             all                                 password
host    all             all             0.0.0.0/0            password
host    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.... done
server stopped
waiting for server to start.... done
server 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 ~]$ psql
Password for user postgres:     #输入密码
postgres=# create database  registry;
CREATE DATABASE
postgres=# create database notary_signer;
CREATE DATABASE
postgres=# create database notary_servers;
CREATE DATABASE
postgres=# \l

5.12 创建用户

postgres=# create user server with password 'lidabai666';
CREATE ROLE
postgres=# create user signer with password 'lidabai666';
CREATE ROLE
postgres=# \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.conf
user 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 -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: 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 keepalived
global_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 keepalived
global_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
    fi
fi
$ 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.yml
hostname: 192.168.2.107
http:
  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界面查看到镜像已经推送成功!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
存储 运维 Kubernetes
服务搭建篇(十二) Kubernetes集群的安装及部署
在所有k8s node机器执行上图第三个红框里的命令 将node节点加入进master节点的集群里,复制上图第三个红框里的命令执行(执行自己的命令)
181 0
|
8月前
|
存储 缓存 NoSQL
Harbor高可用集群设计及部署(基于离线安装方式一)
基于Harbor离线安装方式的高可用方案设计及部署。
163 0
|
3月前
|
网络协议 API 数据安全/隐私保护
Rancher 系列文章 -RHEL7.8 离线有代理条件下安装单节点 Rancher
Rancher 系列文章 -RHEL7.8 离线有代理条件下安装单节点 Rancher
|
6天前
|
Kubernetes 负载均衡 应用服务中间件
部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下
部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下
部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下
|
6天前
|
Kubernetes 安全 前端开发
部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)上
部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)上
|
28天前
|
数据安全/隐私保护 Docker 容器
离线方式部署harbor
离线方式部署harbor
40 1
|
2月前
|
存储 Kubernetes 监控
K8S集群上安装KubeSphere的详细过程
K8S集群上安装KubeSphere的详细过程
30 0
|
2月前
|
负载均衡 容灾 安全
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
71 2
|
7月前
|
关系型数据库 MySQL Nacos
生产环境下的终极指南:在生产环境部署 Nacos 集群和高可用 MySQL 使用 Docker
生产环境下的终极指南:在生产环境部署 Nacos 集群和高可用 MySQL 使用 Docker
317 0
|
7月前
|
Kubernetes 调度 容器
kubeadm方式搭建的k8s集群升级——2023.05
kubeadm方式搭建的k8s集群升级——2023.05
150 1