Kubernetes容器集羣 - harbor倉庫高可用集羣部署說明

 

以前介紹Harbor私有倉庫的安裝和使用,這裏重點說下Harbor高可用集羣方案的部署,目前主要有兩種主流的Harbor高可用集羣方案:1)雙主複製;2)多harbor實例共享後端存儲
html

1、Harbor雙主複製高可用集羣前端

1)主從同步
harbor官方默認提供主從複製的方案來解決鏡像同步問題,經過複製的方式,咱們能夠實時將測試環境harbor倉庫的鏡像同步到生產環境harbor,相似於以下流程:mysql

在實際生產運維的中,每每須要把鏡像發佈到幾十或上百臺集羣節點上。這時,單個Registry已經沒法知足大量節點的下載需求,所以要配置多個Registry實例作負載均衡。手工維護多個Registry實例上的鏡像,將是十分繁瑣的事情。Harbor能夠支持一主多從的鏡像發佈模式,能夠解決大規模鏡像發佈的難題:linux

只要往一臺Harbor上發佈,鏡像就會像"仙女散花"般地同步到多個Registry中,高效可靠。nginx

若是是地域分佈較廣的集羣,還能夠採用層次型發佈方式,好比從集團總部機房同步到分公司1機房,再從分公司1機房同步到分公司2機房:redis

然而單靠主從同步,仍然解決不了harbor主節點的單點問題。sql

2)雙主複製說明
所謂的雙主複製其實就是複用主從同步實現兩個harbor節點之間的雙向同步,來保證數據的一致性,而後在兩臺harbor前端頂一個負載均衡器將進來的請求分流到不一樣的實例中去,只要有一個實例中有了新的鏡像,就是自動的同步複製到另外的的實例中去,這樣實現了負載均衡,也避免了單點故障,在必定程度上實現了Harbor的高可用性:docker

這個方案有一個問題就是有可能兩個Harbor實例中的數據不一致。假設若是一個實例A掛掉了,這個時候有新的鏡像進來,那麼新的鏡像就會在另一個實例B中,後面即便恢復了掛掉的A實例,Harbor實例B也不會自動去同步鏡像,這樣只能手動的先關掉Harbor實例B的複製策略,而後再開啓複製策略,才能讓實例B數據同步,讓兩個實例的數據一致。另外,這裏還須要多吐槽一句:在實際生產使用中,主從複製十分的不靠譜!!因此這裏推薦使用下面要說的這種方案數據庫

2、多harbor實例共享後端存儲的高可用集羣(推薦方案)vim

方案說明
共享後端存儲算是一種比較標準的方案,就是多個Harbor實例共享同一個後端存儲,任何一個實例持久化到存儲的鏡像,均可被其餘實例中讀取。經過前置LB進來的請求,能夠分流到不一樣的實例中去處理,這樣就實現了負載均衡,也避免了單點故障:

這個方案在實際生產環境中部署須要考慮三個問題:
1. 共享存儲的選取,Harbor的後端存儲目前支持AWS S三、Openstack Swift, Ceph等,在下面的實驗環境裏,暫且直接使用nfs。
2. Session在不一樣的實例上共享,這個如今其實已經不是問題了,在最新的harbor中,默認session會存放在redis中,只須要將redis獨立出來便可。能夠經過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實驗環境裏,暫且使用單臺redis。
3. Harbor多實例數據庫問題,這個也只須要將harbor中的數據庫拆出來獨立部署便可。讓多實例共用一個外部數據庫,數據庫的高可用也能夠經過數據庫的高可用方案保證。

部署記錄

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. 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
 
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 * * * * *)
"同步管理"規則裏的"源資源過濾器"(若是沒有過濾需求,就不要配置這一項)
  
4. LB配置
=======================================================================================
在兩個harbor節點的前面部署LB負載均衡層,經過VIP提供統一入口 (如域名),實現harbor訪問的負載均衡和高可用。
能夠經過綁定hosts到不一樣的節點來驗證兩個節點的負載均衡效果。
 
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版本配置)
相關文章
相關標籤/搜索