K8s 容器集群 - harbor 仓库高可用集群部署说明

本文重点说下 Harbor 高可用集群方案的部署,目前主要有两种主流的 Harbor 高可用集群方案:1)双主复制;2)多 harbor 实例共享后端存储。

一、Harbor 双主复制高可用集群

1.1 主从同步

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

 

在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。这时,单个 Registry 已经无法满足大量节点的下载需求,因此要配置多个 Registry 实例做负载均衡。手工维护多个   Registry 实例上的镜像,将是十分繁琐的事情。Harbor 可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题:

只要往一台 Harbor 上发布,镜像就会像"仙女散花"般地同步到多个 Registry 中,高效可靠。

如果是地域分布较广的集群,还可以采用层次型发布方式,比如从集团总部机房同步到分公司1机房,再从分公司1机房同步到分公司2机房:

然而单靠主从同步,仍然解决不了 harbor 主节点的单点问题。

1.2 双主复制说明

所谓的双主复制其实就是复用主从同步实现两个 harbor 节点之间的双向同步,来保证数据的一致性,然后在两台 harbor 前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor 的高可用性:

这个方案有一个问题就是有可能两个 Harbor 实例中的数据不一致。假设如果一个实例 A 挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另外一个实例B中,后面即使恢复了挂掉的A实例,Harbor 实例 B 也不会自动去同步镜像,这样只能手动的先关掉 Harbor 实例 B 的复制策略,然后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。另外,这里还需要多吐槽一句:在实际生产使用中,主从复制十分的不靠谱!所以这里推荐使用下面要说的这种方案。

二、多 harbor 实例共享后端存储的高可用集群(推荐方案)

2.1 方案说明

共享后端存储算是一种比较标准的方案,就是多个 Harbor 实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置 LB 进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障:

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

  1. 共享存储的选取,Harbor 的后端存储目前支持 AWS S3、Openstack Swift, Ceph 等,在下面的实验环境里,暂且直接使用 nfs。

  2. Session 在不同的实例上共享,这个现在其实已经不是问题了,在最新的 harbor 中,默认 session 会存放在 redis 中,只需要将 redis 独立出来即可。可以通过 redis sentinel 或者 redis cluster 等方式来保证 redis 的可用性。在下面的实验环境里,暂且使用单台 redis。

  3. Harbor 多实例数据库问题,这个也只需要将 harbor 中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。

2.2 部署记录

2.2.1 环境说明

ip                  hostname         role
172.16.60.240       host-240         harbor
172.16.60.244       host-244         harbor
172.16.60.245       host-245         nfs

需要注意:

这里的环境中,不包括 LB 负载均衡器的配置,两台 harbor 前面需要架设一个 LB 层(比如 Nginx+Keepalived),配置这里省略~

[root@host-240 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@host-240 ~]# systemctl stop firewalld
[root@host-240 ~]# systemctl disable firewalld
[root@host-240 ~]# firewall-cmd --state
not running
[root@host-240 ~]# setenforce 0
[root@host-240 ~]# cat /etc/sysconfig/selinux
SELINUX=disabled

2.2.2 172.16.60.245 节点机操作

1) 安装配置 nfs

[root@host-245 ~]# yum install -y rpcbind nfs-utils

编辑 /etc/exports 文件

[root@host-245 ~]# vim /etc/exports
/kevin   *(rw,no_root_squash)
    
[root@host-245 ~]# mkdir /kevin
[root@host-245 ~]# chmod -R 777 /kevin

开启 nfs 的 RCP 服务和查看 rpcbind 服务端口

[root@host-245 ~]# systemctl start rpcbind
[root@host-245 ~]# systemctl enable rpcbind

开启 nfs 服务

[root@host-245 ~]# systemctl start nfs
[root@host-245 ~]# systemctl enable nfs

2.2.3 172.16.60.240/244 两台 harbor 节点机操作

1)在两个 harbor 节点上挂载 nfs 目录

[root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data
mount: wrong fs type, bad option, bad superblock on 172.16.60.245:/kevin,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)
    
       In some cases useful info is found in syslog - try
       dmesg | tail or so.
   
[root@host-240 harbor]# yum install nfs-utils
[root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data

2)安装 harbor

可以参考:https://www.cnblogs.com/kevingrace/p/6547616.html

两个节点 harbor 相互配置同步,实现 harbor 主主复制

安装 harbor 后,可以在 host-240 和 host-245 节点上查看harbor 容器情况:

[root@host-240 harbor]# docker-compose ps
      Name                     Command                  State                 Ports      
---------------------------------------------------------------------------------------------
harbor-core         /harbor/start.sh                 Up (healthy)                        
harbor-db           /entrypoint.sh postgres          Up (healthy)   5432/tcp             
harbor-jobservice   /harbor/start.sh                 Up                                  
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)   80/tcp               
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->80/tcp   
redis               docker-entrypoint.sh redis ...   Up             6379/tcp             
registry            /entrypoint.sh /etc/regist ...   Up (healthy)   5000/tcp             
registryctl         /harbor/start.sh                 Up (healthy)

可以尝试登录容器

[root@host-240 harbor]# docker ps|grep harbor-db   
680bd1ed9e48        goharbor/harbor-db:v1.8.0     "/entrypoint.sh post…"   6 days ago          Up 6 days (healthy)   5432/tcp                    harbor-db
[root@host-240 harbor]# docker exec -ti harbor-db bash
root [ / ]#

这里需要注意:

harbor 同步配置可以参考:https://www.cnblogs.com/kevingrace/p/10995648.html

harbor 主主复制(两个 harbor 节点相互配置到对方的同步策略)时,注意:

"同步管理"规则里的"同步模式"(建议使用 push 推送模式。push  模式是推到目标仓库,pull 模式是从源仓库拉取过来)

"同步管理"规则里的"触发模式" (建议采用定时模式,比如每10秒钟同步一次:*/10 * * * * *)

"同步管理"规则里的"源资源过滤器"(如果没有过滤需求,就不要配置这一项)

   

2.2.4 LB 配置

在两个 harbor 节点的前面部署 LB 负载均衡层,通过 VIP 提供统一入口 (如域名),实现 harbor 访问的负载均衡和高可用。

可以通过绑定 hosts 到不同的节点来验证两个节点的负载均衡效果。

  

2.2.5 额外需要注意

这里使用 nfs 作为 harbor 的后端,还可以使用 ceph 作为后端存储(ceph 部署可参考:https://www.cnblogs.com/kevingrace/p/9141432.html)

这里没有考虑到 harbor 高可用时的 session 问题,如果要解决   session 问题,可以使用外部的 mysql 和 redis!!

1)比如在172.16.60.245 机器上再部署 mysql 和 redis(需提前安全 docker 和 docker 和 docker-compose)

docker-compose.yml文件内容如下:
[root@host-245 ~]# vim docker-compose.yml
version: '3'
services:
  mysql-server:
    hostname: mysql-server
    container_name: mysql-server
    image: mysql:5.7
    network_mode: host
    volumes:
      - /mysql57/kevin:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
  redis:
    hostname: redis-server
    container_name: redis-server
    image: redis:3
    network_mode: host

启动 docker-compose

[root@host-245 ~]# docker-compose up -d

启动后查看

[root@host-245 ~]# docker-compose ps
    Name                  Command               State   Ports
-------------------------------------------------------------
mysql-server   docker-entrypoint.sh --cha ...   Up       
redis-server   docker-entrypoint.sh redis ...   Up

可以尝试登录 mysql 容器数据库中

[root@host-245 ~]# docker-compose exec mysql-server bash
root@mysql-server:/# mysql -p123456

或者直接登录

[root@host-245 ~]# docker-compose exec mysql-server mysql -p123456

2)接着需要往172.16.60.245上部署的 mysql 数据库中导入harbor 节点的 registry 数据库

在两台 harbor 节点上导出数据库,并将 registry.dump 复制出来

# docker exec -it harbor_db /bin/bash

登陆 harbor_db 容器后执行:

mysqldump -uroot -p --databases registry > registry.dump
# docker cp  harbor_db:/registry.dump ./

再将 registry.dump 复制到 245 节点的 mysql 容器中

# scp ./registry.dump root@172.16.60.245:/root

在 245 节点上,将 registry 数据库导入到 mysql 容器中

# docker cp /root/registry.dump mysql-server:/registry.dump
# docker exec -it mysql-server /bin/bash

 登陆到 mysql 容器后执行:

mysql -uroot -p123456
mysql> source /registry.dump

3) 在两个 harbor 节点上,修改 harbor.yml 文件,需要修改成使用外部数据库及 redis

db_host = 172.16.60.245
db_password = 123456
db_port = 3306
db_user = root
redis_url = 172.16.60.245:6379

修改 docker-compose.yml 配置

由于 harbor 集群已使用外部的数据库和 redis 解决 session 问题,故需要将 docker-compose.yml 文件里关于数据库和 redis   的配置去掉。

由于 Harbor 新版本里增加了对 PostgreSQL 数据库的支持, 不使用 mysql 数据库。

可以在 docker-compose.yml 文件里将对应的 postgresql 容器改为 mysql 容器(参考之前的 harbor 版本配置)

出处:http://1t.click/aH2z

https://mp.weixin.qq.com/s?__biz=MzA4MjkxMzMyNg==&mid=2654075026&idx=1&sn=14891234711e04ae97e58e2e695df5c9&chksm=843b29d3b34ca0c5acade683aa56c1b9439a2caf3fc95fc3158b9b98bfd507eb9e8bb8c281b6&mpshare=1&scene=1&srcid=&sharer_sharetime=1571834839418&sharer_shareid=8f95a3831742e52aa2aedd0722ab6e84&key=3d64c8ab0dfd206a55ecd1eea9befe586bc8094faf97b054dd06f8779288b1f3e95a58afcc79789404e31a7d1ad940cd91da22d1142bcf4eae85c7ad52bca94deefe9a785f380601e7cecbe3e0619cb5&ascene=1&uin=NzA1ODM3NDAw&devicetype=Windows+10&version=62070152&lang=zh_CN&pass_ticket=ObWO8C7OZ3yNVSW71rW1vUzDv0TTPo%2B7b6NxkRU1Tf3Ab%2BnwxZK0odehfiuY0crw

猜你喜欢

转载自www.cnblogs.com/sandshell/p/11762610.html