1. 前言

Harbor 1.4.0版本开始提供了HA部署方式,和非HA的主要区别就是把有状态的服务分离出来,使用外部集群,而不是运行在本地的容器上。而无状态的服务则可以部署在多个节点上,通过配置上层Load Balancer构成HA。

这些有状态的服务包括:

  • Harbor database(MariaDB)
  • Clair database(PostgresSQL)
  • Notary database(MariaDB)
  • Redis

我们的Harbor没有使用notary和clair,所以只需要预先准备高可用的MariaDB和Redis集群。多个Harbor节点配置使用相同的MariaDB和Redis地址,就构成了HA集群。

另外多个Registry需要使用共享存储,可选的有Swift、NFS、S3、azure、GCS、Ceph和OSS。我们选择使用Ceph。

docker-registry在2.4.0版本之后移除了rados storage driver,推荐使用Swift API gateway替代,因为Ceph在rados之上提供了兼容Swift和S3的接口。Harbor是在docker-registry的基础之上做的扩展,我们用的Harbor 1.5.1所使用的registry是2.6.2版本,因此无法配置rados storage,只能使用Swift driver或者S3 driver,我们选择Swift driver。

2. 配置Ceph radosgw用户

在Ceph Radosgw上为Harbor Registry创建一个user和subuser

# radosgw-admin user create --uid=registry --display-name="registry"
# radosgw-admin subuser create --uid=registry --subuser=registry:swift --access=full

其中user用于访问S3接口,subuser用于访问Swift接口。我们将使用radosgw的Swift接口,记录下subuser的secret_key。

3. 部署HA的MariaDB集群

1) 安装配置MariaDB

# yum install MariaDB-server MariaDB-client
# cat /etc/my.cnf.d/server.cnf
[mariadb-10.1]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/var/log/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
max_connections=
binlog_format=ROW
expire_logs_days =
character-set-server = utf8
collation-server = utf8_general_ci
default-storage-engine=innodb
init-connect = 'SET NAMES utf8'
innodb_file_per_table
innodb_autoinc_lock_mode=
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address='gcomm://172.21.10.11,172.21.10.12,172.21.10.13?pc.wait_prim=no'
wsrep_cluster_name='Harbor'
wsrep_node_address=172.21.10.11
wsrep_node_name='registry01-prod-rg3-b28'
wsrep_sst_method=rsync
wsrep_sst_auth=galera:galera_sync
wsrep_slave_threads=
innodb_flush_log_at_trx_commit=
default-storage-engine=INNODB
innodb_large_prefix=on
innodb_file_format=BARRACUDA slow_query_log=
slow_query_log_file=/var/log/mysql/mysql-slow.log
log_queries_not_using_indexes=
long_query_time=

其他两个节点相同配置,注意修改wsrep_node_address和wsrep_node_name。

2) 启动MariaDB集群

在一个节点上初始化:

# mysql_install_db --defaults-file=/etc/my.cnf.d/server.cnf --user=mysql
# mysqld_safe --defaults-file=/etc/my.cnf.d/server.cnf --user=mysql --wsrep-new-cluster & # 启动MariaDB服务并建立集群
# mysql_secure_installation # 设置root密码和初始化 # mysql
MariaDB [(none)]> grant all privilidges on *.* to 'galera'@'%' identified by 'galera_sync';

在其他两个节点上启动MariaDB服务:

# systemctl start mariadb

3) 验证集群状态

MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | |
+--------------------+-------+ MariaDB [(none)]> show global status like 'ws%';
+------------------------------+-------------------------------------------------------+
| Variable_name | Value |
+------------------------------+-------------------------------------------------------+
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 1.000000 |
| wsrep_causal_reads | |
| wsrep_cert_deps_distance | 20.630228 |
| wsrep_cert_index_size | |
| wsrep_cert_interval | 0.003802 |
| wsrep_cluster_conf_id | |
| wsrep_cluster_size | |
| wsrep_cluster_state_uuid | f785b691--11e8-bfdf-c2caa6c57ac0 |
| wsrep_cluster_status | Primary |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 1.000000 |
| wsrep_connected | ON |
| wsrep_desync_count | |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | //// |
| wsrep_evs_state | OPERATIONAL |
| wsrep_flow_control_paused | 0.000091 |
| wsrep_flow_control_paused_ns | |
| wsrep_flow_control_recv | |
| wsrep_flow_control_sent | |
| wsrep_gcomm_uuid | 39a7ce90--11e8-bbbc-feb5b5a38145 |
| wsrep_incoming_addresses | 10.212.29.38:,10.212.29.40:,10.212.29.39: |
| wsrep_last_committed | |
| wsrep_local_bf_aborts | |
| wsrep_local_cached_downto | |
| wsrep_local_cert_failures | |
| wsrep_local_commits | |
| wsrep_local_index | |
| wsrep_local_recv_queue | |
| wsrep_local_recv_queue_avg | 2.058603 |
| wsrep_local_recv_queue_max | |
| wsrep_local_recv_queue_min | |
| wsrep_local_replays | |
| wsrep_local_send_queue | |
| wsrep_local_send_queue_avg | 0.000000 |
| wsrep_local_send_queue_max | |
| wsrep_local_send_queue_min | |
| wsrep_local_state | |
| wsrep_local_state_comment | Synced |
| wsrep_local_state_uuid | f785b691--11e8-bfdf-c2caa6c57ac0 |
| wsrep_protocol_version | |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 25.3.(r3667) |
| wsrep_ready | ON |
| wsrep_received | |
| wsrep_received_bytes | |
| wsrep_repl_data_bytes | |
| wsrep_repl_keys | |
| wsrep_repl_keys_bytes | |
| wsrep_repl_other_bytes | |
| wsrep_replicated | |
| wsrep_replicated_bytes | |
| wsrep_thread_count | |
+------------------------------+-------------------------------------------------------+
rows in set (0.00 sec)

wsrep_cluster_size为3,表示集群有三个节点。

wsrep_cluster_status为Primary,表示节点为主节点,正常读写。

wsrep_ready为ON,表示集群正常运行。

4. 部署HA的Redis集群

Harbor 1.5.0和1.5.1版本有bug,不支持使用redis集群,只能用单个redis,详情查看这个issue。除了Issue中提到的Job Service,UI组件也使用redis保存token数据,同样不支持redis集群,会登录时会报错找不到token:

Jun  :: 172.18.0.1 ui[]: // :: #[;31m[E] [server.go:] MOVED  172.21.10.12:#[0m
Jun :: 172.18.0.1 ui[]: // :: #[;44m[D] [server.go:] | 172.21.10.13|#[41m #[0m| .771µs| nomatch|#[44m GET #[0m /service/token#[0m

官方计划在Sprint 35解决这个问题。在此之前,可以不用下面的步骤部署redis集群,而是运行一个单独的redis。

1) 编译redis

# yum install gcc-c++ tcl ruby rubygems
# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
# tar xzvf redis-4.0..tar.gz
# cd redis-4.0.
# make
# make PREFIX=/usr/local/redis/ install

2) 准备redis集群环境

# mkdir -p /usr/local/redis-cluster/{,}
# find /usr/local/redis-cluster -mindepth -maxdepth -type d | xargs -n cp /usr/local/redis/bin/*
# find /usr/local/redis-cluster -mindepth 1 -maxdepth 1 -type d | xargs -n 1 cp redis.conf
# cp src/redis-trib.rb /usr/local/redis-cluster/

进入/usr/local/redis-cluster/{7001,7002}目录,修改redis.conf中的以下四个参数,其中port与目录名对应:

bind 0.0.0.0
port
daemonize yes
cluster-enabled yes

3) 安装依赖

redis-trib.rb使用了redis gem,redis-4.0.1.gem依赖ruby2.2.2以上的版本,而ruby22又依赖openssl-libs-1.0.2,所以需要按以下顺序安装:

# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/openssl-1.0.2k-12.el7.x86_64.rpm
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/openssl-libs-1.0.2k-12.el7.x86_64.rpm
# yum localinstall openssl-1.0.2k-.el7.x86_64.rpm openssl-libs-1.0.2k-.el7.x86_64.rpm
# yum install centos-release-scl-rh
# yum install rh-ruby25
# scl enable rh-ruby25 bash
# gem install redis

4) 运行redis-server

在所有节点上执行:

# cd /usr/local/redis-cluster//; ./redis-server redis.conf
# cd /usr/local/redis-cluster//; ./redis-server redis.conf

5) 创建集群

# ./redis-trib.rb create --replicas  172.21.10.11: 172.21.10.12: 172.21.10.13: 172.21.10.11: 172.21.10.12: 172.21.10.13:

5. 部署Harbor集群

以下操作在所有Harbor节点上执行。

1) 下载Harbor installer

可以从Harbor Releases页面查看release信息,Harbor installer分为offline installer和online installer,区别是offline installer中包含了部署所用到的docker image,而online installer需要在部署过程中从docker hub下载。我们选择使用1.5.1版本的offline installer:

# wget https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.1.tgz
# tar xvf harbor-offline-installer-v1.5.1.tgz

2) 编辑harbor.cfg

harbor.cfg文件包含了一些会在Harbor组件中使用的参数,关键的有域名、数据库、Redis、后端存储和LDAP。

域名,需要能解析到节点IP或者VIP:

hostname = registry.example.com

数据库:

db_host = 172.21.10.11
db_password = password
db_port =
db_user = registry

Redis:

redis_url = 172.21.10.11:

后端存储:

registry_storage_provider_name = swift
registry_storage_provider_config = authurl: http://172.21.1.10:7480/auth/v1, username: registry:swift, password: xFTlZ1Lc5tgH78E7SSHYDmRuUyDK08BariFuR6jO, container: registry.example.com

LDAP(不使用ldap认证则不需要配置这些参数):

auth_mode = ldap_auth
ldap_url = ldap://172.21.2.101:389
ldap_searchdn = CN=admin,OU=Infra, OU=Tech,DC= example,DC=com
ldap_search_pwd = password
ldap_basedn = OU=Tech,DC=example,DC=com
ldap_filter = (objectClass=person)
ldap_uid = sAMAccountName
ldap_scope =
ldap_timeout =
ldap_verify_cert = false
ldap_group_basedn = OU=Tech,DC=example,DC=com
ldap_group_filter = (objectclass=group)
ldap_group_gid = sAMAccountName
ldap_group_scope =

3) 初始化数据库

MariaDB [(none)]> source harbor/ha/registry.sql
MariaDB [(none)]> grant all privileges on registry.* to 'registry'@'%' identified by 'password';

4) 部署Harbor

# cd harbor
# ./install.sh --ha

部署分为四步,主要就是根据harbor.cfg生成一系列容器的yml文件,然后使用docker-compose拉起。因为使用离线部署,无需从外网下载镜像,部署过程非常快,只需要几分钟。部署完成后,使用docker-compose查看容器状态:

# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up (healthy)
harbor-db /usr/local/bin/docker-entr ... Up (healthy) /tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:->/tcp
harbor-ui /harbor/start.sh Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:->/tcp, 0.0.0.0:->/tcp, 0.0.0.0:->/tcp
redis docker-entrypoint.sh redis ... Up /tcp
registry /entrypoint.sh serve /etc/ ... Up (healthy) /tcp

看到所有组件的容器都是up状态,此时用浏览器访问节点IP、VIP或者域名,就能看到Harbor的界面了。

要注意部署过程中会生成一个ui、adminserver和jobservice共用的secretkey,默认保存在/data/secretkey。部署多个节点时,要保证各个节点使用相同的secretkey。

使用自己熟悉的Load Balancer,将MariaDB、Redis、Ceph Radosgw和Harbor http都配置上VIP,同时将harbor.cfg里指向的地址都改成VIP地址,就可以实现完全的HA模式。

参考资料

Harbor High Availability Guide

CentOS 7.2部署MariaDB Galera Cluster(10.1.21-MariaDB) 3主集群环境

redis单机及其集群的搭建

Registry Configuration Reference #storage

Harbor HA部署-使用Ceph RADOS后端的更多相关文章

  1. Hadoop 学习笔记 (九) hadoop2.2.0 生产环境部署 HDFS HA部署方法

    step1:将安装包hadoop-2.2.0.tar.gz存放到某一个目录下,并解压 step2:修改解压后的目录中的文件夹/etc/hadoop下的xml配置文件(如果文件不存在,则自己创建) 包括 ...

  2. 012.Docker私有仓库多Harbor同步部署

    一 Harbor主从介绍 harbor官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将测试环境harbor仓库的镜像同步到生产环境harbor,类似于如下流程: Harbo ...

  3. 在kolla中配置cinder ceph多后端

    原文链接:在kolla中配置cinder ceph多后端

  4. docker-compose 部署 Vue+SpringBoot 前后端分离项目

    一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...

  5. [大数据] hadoop高可用(HA)部署(未完)

    一.HA部署架构 如上图所示,我们可以将其分为三个部分: 1.NN和DN组成Hadoop业务组件.浅绿色部分. 2.中间深蓝色部分,为Journal Node,其为一个集群,用于提供高可用的共享文件存 ...

  6. linux项目部署(非前后端分离crm)

    参考博客 参考博客2---部署过程 导论:看参考博客1 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收 ...

  7. 企业级Registry仓库Harbor的部署与简介

    Harbor 是Vmware公司开源的企业级Docker Registry管理项目,开源项目地址:https://github.com/vmware/harbor Harbor的所有组件都在Docke ...

  8. Harbor快速部署到Kubernetes集群及登录问题解决

    Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...

  9. Harbor安装部署--基于 Docker Distribution 的企业级 Registry 服务

    harbor简介 Harbor 是一个企业级 Registry 服务.它对开源的 Docker Registry 服务进行了扩展,添加了更多企业用户需要的功能.Harbor 被设计用于部署一套组织内部 ...

随机推荐

  1. Java中的do-while循环——通过示例学习Java编程(11)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=22&cid=0 在上一篇教程中,我们讨论了w ...

  2. hibernate课程 初探单表映射1-5 hibernate第一个demo

    hibernate 开发步骤:(hibernate4.2+mysql6.0) 1 hibernate配置文件(hibernate.cfg.xml) 2 持久化类 3 对象-关系映射文件 4 hiber ...

  3. Linux常用操作2

    第1章 find命令扩展 转自:https://www.cnblogs.com/clsn/p/7520333.html 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面. [ ...

  4. HTTP缓存技术,304和200有何区别

    为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag.移除了,就总是 200 OK (from c ...

  5. Node.js连接MongoDB

    使用monk访问mongodb mongodb.monk都安装了依赖的前提下: 首先启动MongoDB 服务:mongod: 进入了mongodb后台管理,再通过终端创建数据库:use monk-ap ...

  6. visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用

    写了个标题好长啊~~~~ 这两天又认识了一个新玩意,记录一下下,啦啦啦~~~~~ 话说,认识arcgis快十年了,从桌面版到engine的二次开发,其实不过才认识到它的冰山一角, 它总是能带来很多还未 ...

  7. C#运算符、控制流

    1 运算符 1.1 一元运算符: -(负号).+(正号):可以省略 1.2 二元运算符:     优先级,*(乘)./(除).%(取余).+(加).-(减).=(赋值) 二元赋值运算符,=.+=.-= ...

  8. 报错:Program bash is not found in PATH

    (如果按照我的方法来的话是没有这个错误的,我之前用别的方法的时候有但是后来还是没解决,写出来放到这里做参考吧) 参考原文:http://blog.csdn.net/fuyongbing1986/art ...

  9. 再次尝试windows下msys+MinGW编译ffmpeg

    电脑上安装太多的开源库,环境变量里面一些常用的头文件都有几种,以前使用的编译ffmpeg的方法现在常常提示错误.从config.log中看,这些错误往往都是一些头文件引用错误导致.由于项目中继续编译自 ...

  10. IDEA 编辑器如何将tabs 分行显示

    https://jingyan.baidu.com/article/49ad8bcebd9e7c5834d8faac.html