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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM