高可用Harbor搭建

思路及介绍
Harbor官方有推出主从架构和双主架构来实现Harbor的高可用及数据备份。
 
一、主从架构:
 说白了,就是往一台Harbor仓库中push镜像,然后再通过这台Harbor分散下发至所有的从Harbor,类似下图:
这个方法保证了数据的冗余性,但是仍然解决不了Harbor主节点的单点问题,当业务量足够大时,甚至会引起主节点崩溃。
 

二、双主架构:

双主复制就是两套Harbor的数据互相同步,来保证数据的一致性,然后两套Harbor的前端再挂一层负载,来达到分均流量、减轻某一台压力过大的现象,也避免了单点故障,类似于下图:
这个方案有一个问题:假设有实例A和实例B互为主备,当A挂掉后,所有的业务流量就会流向B,当A修复后,B不会自动同步A新push的镜像,还要手动将B的同步策略关闭,重新开启才能开始同步。
 

三、还有一种就是利用共享存储和共享数据库来实现服务的高可用性和数据的冗余:

思路如下:
  1. 将PostgreSQL服务单独部署出来,并将Harbor中默认创建在PostgreSQL的所有表的结构、初始数据等导入进单独部署的PostgreSQL服务中,PostgreSQL数据的冗余就完全可以使用PostgreSQL的同步策略来实现;
  2. Redis服务单独部署出来,其他特殊操作无需执行,Redis的高可用也可直接使用其集群解决方案;
  3. 最后存储后端要使用共享存储,来实现数据的统一;

具体操作

环境介绍
Harbor基于Docker环境运行,所使用的机器必须有docker及docker-compose
ip
系统版本
服务
192.168.24.253(post1)
Centos7
PostgreSQL、Redis、Harbor
192.168.24.252(post2)
Centos8
NFS、Harbor
在此所有其他服务均搭建在post1中,并且是搭建单机,仅为演示使用,生产中数据的备份等再自行研究。
我这里post1 和 post2的域名分别为:
    hub.vfancloud1.com;hub.vfancloud2.com,记得先要写入hosts文件中以防解析不到。
 
1、先部署一套Harbor,用于将其所有表结构导出,部署过程上文已给出:
https://www.cnblogs.com/v-fan/p/13034272.html
2、进入导出PostgreSQL表结构
## 进入PostgreSQL容器
docker exec -it xxxx bash ## 执行 psql 进入数据库
postgres [ / ]$ psql
psql (9.6.14)
Type "help" for help. ## 查看当前所有的数据库,postgres、template0、template1为默认数据库
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
notaryserver | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | server=CTc/postgres
notarysigner | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | signer=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
registry | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(6 rows) ## 导出表结构及数据
postgres [ / ]$ pg_dump -U postgres registry > /tmp/registry.sql
postgres [ / ]$ pg_dump -U postgres notaryserver > /tmp/notaryserver.sql
postgres [ / ]$ pg_dump -U postgres notarysigner > /tmp/notarysigner.sql
-U 数据库用户
-p 访问端口
-f 指定文件,和 > 功能一样
-h 指定数据库地址
-s 表示只导出表结构,不导数据 ## 导出到宿主机
docker cp [容器id]:/tmp/registry.sql ./
docker cp [容器id]:/tmp/notaryserver.sql ./
docker cp [容器id]:/tmp/notarysigner.sql ./
3、单独部署一套PostgreSQL服务
# Install RPM
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # Install server
sudo yum install -y postgresql13-server # init db
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb # 修改远程访问配置
vim /var/lib/pgsql/13/data/postgresql.conf
...
将 listen_addresses = 'localhost' 修改为
listen_addresses = '*'
... # 添加信任的远程连接,生产中不要添加0.0.0.0
vim /var/lib/pgsql/13/data/pg_hba.conf
...
host all all 0.0.0.0/0 trust
# host all all 0.0.0.0/0 md5
# 最后一列如果是trust,则登录pg不需要密码,若为md5,则需要密码
... # start and enable server
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13 # 检查服务是否启动成功
ps看进程 或 ss看端口号
4、给postgresql设置密码,增强安全性
## 直接写入新密码
postgres=# \password
输入新的密码:
再次输入:
5、将备份的数据,导入进单独部署的postgresql中
## 创建数据库
postgres=# CREATE DATABASE registry;
postgres=# CREATE DATABASE notaryserver;
postgres=# CREATE DATABASE notarysigner; ## 导入数据
psql -h post1 -U postgres -p 5432 -d registry -f registry.sql
psql -h post1 -U postgres -p 5432 -d notaryserver -f notaryserver.sql
psql -h post1 -U postgres -p 5432 -d notarysigner -f notarysigner.sql
-U 数据库用户
-p 访问端口
-f 指定文件,和 < 功能一样
-h 指定数据库地址
-d 指定数据库名
6、搭建共享存储(在此以nas为例)
## 安装nfs工具
yum -y install nfs-utils rpcbind ## 编辑共享目录
vim /etc/exports
...
/alibaba *(rw,no_root_squash,no_all_squash,sync)
... ## 挂载
mkdir /alibaba
mount -t nfs post2:/alibaba/ /alibaba/
7、搭建Redis
## 安装 || 或源码安装自行选择
yum -y install redis ##
vim /etc/redis
...
bind 0.0.0.0 # 设置所有主机可以连接
requirepass redis # 设置客户端连接密码
daemonize yes # 打开守护进程模式
... ## 启动redis
systemctl start redis ## 查看端口状态
[root@centos7 src]# ss -tnlp | grep 6379
LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=3405,fd=6))
8、配置Harbor
## 自行下载源码包
https://github.com/goharbor/harbor/releases ## 解压进入
tar zxvf harbor-offline-installer-v2.1.2.tgz && cd harbor/ ## 导入镜像
docker load -i harbor.v2.1.2.tar.gz ## 编辑配置文件,需要更改的主要有以下几点:
1.hostname 改为主机ip或完全限定域名,不要使用127.0.0.1或localhost
2.https选项,如需要,指定crt和key的路径,若不需要,直接注释掉
3.harbor_admin_password,默认密码,可以更改
4.data_volume,数据默认存储位置,设计为共享路径
5.注释掉database模块 及 Clair模块
6.开启external_database 和 external_redis模块及正确配置其中参数
7.集群内所有harbor配置均一样,改一下hostname值即可
下边进行实际修改,以下为我的配置:
vim harbor.yml.tmpl
hostname: hub.vfancloud1.com

https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/cert/server.crt
private_key: /data/cert/server.key harbor_admin_password: Harbor12345 data_volume: /alibaba external_database:
harbor:
host: 192.168.24.253
port: 5432
db_name: external_redis
username: postgres
password: 123456
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
clair:
host: 192.168.24.253
port: 5432
db_name: clair
username: postgres
password: 123456
ssl_mode: disable
notary_signer:
host: 192.168.24.253
port: 5432
db_name: notarysigner
username: postgres
password: 123456
ssl_mode: disable
notary_server:
host: 192.168.24.253
port: 5432
db_name: notaryserver
username: postgres
password: 123456
ssl_mode: disable external_redis:
# support redis, redis+sentinel
# host for redis: <host_redis>:<port_redis>
# host for redis+sentinel:
# <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>
host: 192.168.24.253:6379
password: redis
# sentinel_master_set must be set to support redis+sentinel
#sentinel_master_set:
# db_index 0 is for core, it's unchangeable
registry_db_index: 1
jobservice_db_index: 2
chartmuseum_db_index: 3
clair_db_index: 4
trivy_db_index: 5
idle_timeout_seconds: 30
开始安装:
./install.sh
----Harbor has been installed and started successfully.---- [root@kubenode2 harbor]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fffdbdc1efd goharbor/harbor-jobservice:v2.1.2 "/harbor/entrypoint.…" 3 minutes ago Up 3 minutes (healthy) harbor-jobservice
330d73923321 goharbor/nginx-photon:v2.1.2 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp nginx
f6511d387e7f goharbor/harbor-core:v2.1.2 "/harbor/entrypoint.…" 3 minutes ago Up 3 minutes (healthy) harbor-core
2fe648a128da goharbor/harbor-registryctl:v2.1.2 "/home/harbor/start.…" 3 minutes ago Up 3 minutes (healthy) registryctl
62c6de742d9b goharbor/registry-photon:v2.1.2 "/home/harbor/entryp…" 3 minutes ago Up 3 minutes (healthy) registry
f5e6b82363bb goharbor/harbor-portal:v2.1.2 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes (healthy) harbor-portal
bb0fb84251f1 goharbor/harbor-log:v2.1.2 "/bin/sh -c /usr/loc…" 3 minutes ago Up 3 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
 
第一台机器安装完毕,可以简单测试一下各项功能,正常后继续部署其他服务器
开始部署第二台,相同的配置,改一下hostname即可:
hostname: hub.vfancloud2.com

测试

9、在vfancloud1机器push镜像,在vfancloud2查看是否可以同步并pull
## 在192.168.24.253中push镜像
## 先在/etc/docker/daemon.json文件添加以下内容
vim /etc/docker/daemon.json
...
{
"insecure-registries": ["https://hub.vfancloud1.com","https://hub.vfancloud2.com"]
}
... ## 重新加载docker服务
systemctl daemon-reload
systemctl restart docker ## 登录harbor
[root@centos7 harbor]# docker login hub.vfancloud1.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded ## push镜像
[root@centos7 alibaba]# docker tag hub.vfancloud.com/test/myapp:v1 hub.vfancloud1.com/library/myapp:v1
[root@centos7 alibaba]# docker push hub.vfancloud1.com/library/myapp:v1
The push refers to repository [hub.vfancloud1.com/library/myapp]
a0d2c4392b06: Pushed
05a9e65e2d53: Pushed
68695a6cfd7d: Pushed
c1dc81a64903: Pushed
8460a579ab63: Pushed
d39d92664027: Pushed
v1: digest: sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e size: 1569
 
push成功,仓库1中已有此镜像
查看仓库2:

注意看域名不同

 
在post2导入仓库2的镜像:
[root@kubenode2 harbor]# docker pull hub.vfancloud2.com/library/myapp:v1
v1: Pulling from library/myapp
550fe1bea624: Pull complete
af3988949040: Pull complete
d6642feac728: Pull complete
c20f0a205eaa: Pull complete
438668b6babd: Pull complete
bf778e8612d0: Pull complete
Digest: sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Status: Downloaded newer image for hub.vfancloud2.com/library/myapp:v1
hub.vfancloud2.com/library/myapp:v1

至此Harbor高可用完成!实际使用中将两台Harbor前边加一层负载即可!

Kubernetes-5-2:Harbor仓库的几种高可用方案与搭建的更多相关文章

  1. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  2. Oracle的三种高可用集群方案

    浏览了一下Oracle官方的网页以及非官方的ppt,简单了解了一下Oracle提供的高可用方案. 主要有三种: 1. RAC RAC,  Real Application Clusters 多个Ora ...

  3. [经验交流] kubernetes v1.11 更新了高可用方案

    kubernetes v1.11已经发布了一段时间,和以前相比,一个显著亮点是更新了高可用方案: https://kubernetes.io/docs/setup/independent/high-a ...

  4. (转载)MySQL数据库的几种常见高可用方案

    转自: https://yq.aliyun.com/articles/74454   随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化. ...

  5. Linux搭建Nexus仓库+高可用方案

    Linux搭建nexus仓库 1.安装jdk 1.1 获取安装包,解压到指定目录: tar xf jdk.tar.gz -C /opt/export 1.2 配置环境变量: # vim /etc/pr ...

  6. 014.Docker Harbor+Keepalived+LVS+共享存储高可用架构

    一 多Harbor高可用介绍 共享后端存储是一种比较标准的方案,将多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取.通过前置LB组件,如Keepalived ...

  7. kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x

    1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...

  8. harbor高可用集群搭建

    高可用harbor集群搭建 一.安装部署 1.节点角色 角色 数量 名称 备注 harbor主节点 2 harbor-1 harbor-2 双主模式 haproxy 2 HA-1 HA-2 需要通过k ...

  9. kubernetes实战(二十五):kubeadm 安装 高可用 k8s v1.13.x

    1.系统环境 使用kubeadm安装高可用k8s v.13.x较为简单,相比以往的版本省去了很多步骤. kubeadm安装高可用k8s v.11 和 v1.12 点我 主机信息 主机名 IP地址 说明 ...

随机推荐

  1. 3.k8s存储之ConfigMap、Secret

    1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...

  2. LeetCode225 用队列实现栈

    使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...

  3. PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索

    题目分析: 一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小 ...

  4. 关于BAPI_TRANSACTION_COMMIT一点说明

    我们调用bapi做了相关的业务操作后,通常都要在后面调用 BAPI_TRANSACTION_COMMIT来提交所做得更改 然而,有时候,在程序中需要调用多个不同的BAPI实现不同的功能,那么这个时候就 ...

  5. Windows10下Canvas对象获得屏幕坐标不正确的原因排查与处理

    因为Canvas没有直接将画布内容保存为图片的方法,所以很多时候是通过获得Canvas画布的坐标,然后通过截图的方式来将画布内容保存为本地图片. 如何取得Canvas画布的坐标呢,比较简单实用的方式如 ...

  6. STL_string容器

    一.string概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别. ...

  7. Python爬虫:数据分析小能手:JSON库的用法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 给大家推荐一个Python交流的q裙,大家在学习遇到了什么问题都可以进群一起交流,大家 ...

  8. pymysql模块使用介绍

    pymysql ​ 我们要学的pymysql就是用来在python程序中如何操作mysql,本质上就是一个套接字客户端,只不过这个套接字客户端是在python程序中用的,既然是客户端套接字,应该怎么用 ...

  9. ant design vue 地区选择(级联)

    city.js const options = [ { value:'北京市', label:'北京市', children:[ { value:'北京市', label:'北京市', childre ...

  10. 基于Abp React前端的项目建立与运行——React框架分析

    基于Abp React前端的项目建立与运行 目录 基于Abp React前端的项目建立与运行 1 Abp项目配置 2 运行WebApi后端项目 2.1 创建C3D数据库,并且将数据库对应链接字符串替换 ...