Harbor高可用方案設計

1. 系統(tǒng)架構(gòu)

本文檔參照Harbor官方高可用方案說明,并且在Kubernetes集群通過helm來部署Harbor刻坊。

Harbor的大部分組件都是無狀態(tài)的應用谭胚,針對該種應用比如portal灾而、core旁趟、nginx等只需要增加其相應的副本數(shù)量即可锡搜;在存儲數(shù)據(jù)層面耕餐,需要提供高可用的Postgresql肠缔、redis集群桩砰,另外針對鏡像和chart服務也需要提供可持久的存儲(PVCs)亚隅。鑒于以上理論,也就有了下面的Harbor高可用方案設計架構(gòu)圖(摘自Harbor官網(wǎng)):

既然有了上圖的系統(tǒng)架構(gòu)設計行疏,下面開始著手具體部署實現(xiàn)。

另外本文只針對Harbor高可用的設置贞让,其它部署可參照Harbor NFS部署Harbor CEPH部署喳张。

2. 部署準備

2.1 Chart下載

首先下載Harbor Chart销部,參照如下操作即可:

# 添加helm harbor repo
helm repo add harbor https://helm.goharbor.io

# 下載chart
helm fetch harbor/harbor

# 解壓縮
tar xvf harbor-xxx.tgz
cd harbor-xxx/

2.2 Harbor參數(shù)配置

跟常規(guī)部署一樣,需要修改values.yaml文件:

  • 修改Harbor對外暴露方式:上面提到的兩篇博文都是采用NodePort的暴露方式擂涛,此處建議采用Ingress,于是需要修改expose.ingress.hosts.coreexpose.ingress.hosts.notary這兩個字段踩身;
  • 修改externalURL:修改成expose.ingress.hosts.core字段的值挟阻,但是前面加上協(xié)議名稱附鸽;
  • 修改PostgreSQL配置:首先修改database.type --> external熄浓,然后填入database.external區(qū)域的信息比如訪問數(shù)據(jù)庫的host赌蔑、端口竟秫、用戶名肥败、密碼等信息皿哨,另外注意:這一塊需要提前手動創(chuàng)建四個空數(shù)據(jù)庫:harbor Core往史、Clair佛舱、Notary Server椎例、Notary Signer,然后把數(shù)據(jù)庫的名稱填入database.external區(qū)域请祖,至于PostgreSQL高可用部署下文會進一步說明订歪;
  • 修改Redis配置:首先修改redis.type --> external,然后填入redis.external區(qū)域信息肆捕,高可用方案下如果采用Redis Sentinal方案刷晋,因為Harbor上游項目代碼的Redis客戶端不支持Sentinal,所以可以考慮使用HAProxy慎陵;
  • 持久化存儲配置:這一塊配置跟上面所提兩篇博文一致,預先安裝對應存儲的驅(qū)動插件,然后依據(jù)StorageClass創(chuàng)建PVC進而提供PV方式甥厦;
  • 修改其他組件的副本數(shù)量:修改 portal.replicas , core.replicas , jobservice.replicas , registry.replicas , chartmuseum.replicas , clair.replicas , notary.server.replicas and notary.signer.replicas to n(n>=2谦秧,這里是3)

配置完之后亏娜,我們需要在環(huán)境中搭建高可用的數(shù)據(jù)庫:PostgreSQL和Redis溯泣。

3. PostgreSQL高可用部署

這里采用stolon來部署PostgreSQL的高可用,具體部署步驟可參考Stolon Inside Kubernetes

一點說明:盡管helm hub上已經(jīng)有stolon的chart咱圆,但是不建議使用忱详,本人曾經(jīng)嘗試安裝過幾次航唆,不過最后都沒安裝成功,原因未知。

3.1 下載源碼和鏡像

按如下操作即可:

# 源碼下載
git clone https://github.com/sorintlab/stolon.git

# stolon鏡像下載
docker pull sorintlab/stolon:v0.13.0-pg10  # 網(wǎng)上隨便找的一個鏡像虐译,實際使用時可根據(jù)需求修改stolon/examples/kubernetes/image/docker/Dockerfile實現(xiàn)訂制

# 進入kubernetes部署目錄
cd stolon/examples/kubernetes/

3.2 初始化Stolon集群

# stolon集群初始化
kubectl run -i -t stolonctl --image=sorintlab/stolon:v0.13.0-pg10 --restart=Never --rm -- /usr/local/bin/stolonctl --cluster-name=kube-stolon --store-backend=kubernetes --kube-resource-kind=configmap init

3.3 參數(shù)配置

進入stolon kubernetes安裝目錄后供鸠,可以看到:

需要修改出不多:

  • 鏡像信息:此處均修改成sorintlab/stolon:v0.13.0-pg10

  • postgres數(shù)據(jù)庫用戶名稱:默認stolon繁堡,可通過修改stolon-keeper.yaml文件配置項完成設置绳矩;

  • postgres數(shù)據(jù)庫訪問密碼:默認password1审姓,在secret.yaml中存儲,如需更改先base64轉(zhuǎn)碼后存入魔吐;

  • 后端存儲配置:HA方案采用共享存儲酬姆,這里提前預先安裝ceph驅(qū)動插件只需在stolon-keeper.yaml文件做如下圖示修改即可立美,至于容量大小按需填入蔫巩;

  • 副本數(shù)量:按需填入嫌松,這里默認都是2沪曙;

3.4 組件安裝

下面開始stolon各個組件的部署,依次執(zhí)行如下命令即可:

 kubectl create -f stolon-sentinel.yaml
 kubectl create -f secret.yaml
 kubectl create -f stolon-keeper.yaml
 kubectl create -f stolon-proxy.yaml 
 kubectl create -f stolon-proxy-service.yaml

# RBAC相關
kubectl create -f role.yaml
kubectl create -f role-binding.yaml

如果出現(xiàn)如下結(jié)果說明安裝基本上是ok了:

并且我們還可以通過kubectl logs命令發(fā)現(xiàn)兩個keeper一個是master萎羔,而另一個則是standby液走。

3.5 Harbor高可用準備及相關參數(shù)調(diào)整

3.5.1 Harbor參數(shù)調(diào)整

更新values.yaml文件:

  • database.external.host --> stolon-proxy-service即stolon-proxy的service名稱;
  • database.external.username --> stolon贾陷;
  • database.external.password --> password1缘眶;

3.5.2 Postgres初始化

如上面所說,需要預先在Postgres集群中創(chuàng)建幾個空數(shù)據(jù)庫髓废,可借助kubernetes Job來完成巷懈。因為Postgres客戶端命令行工具支持以文件傳入SQL命令的方式,所以只需把創(chuàng)建數(shù)據(jù)庫的命令放入幾個文件里慌洪,然后通過一個腳本調(diào)用它們即可:

  • 幾個sql命令文件:
  • 初始化腳本程序

#!/bin/bash
# postgresql.sh

host="stolon-proxy-service"
user="stolon"
db="postgres"
export PGPASSWORD="password1"

args=(
        # force postgres to not use the local unix socket (test "external" connectibility)
        --host "$host"
        --username "$user"
        --dbname "$db"
        --quiet --no-align --tuples-only
)

if select="$(echo 'SELECT 1' | psql "${args[@]}")" && [ "$select" = '1' ]; then
   psql -h stolon-proxy-service -p 5432 postgres -U stolon -f "/docker-entrypoint-initdb.d/notary_server.sql"
   psql -h stolon-proxy-service -p 5432 postgres -U stolon -f "/docker-entrypoint-initdb.d/notary_signer.sql"
   psql -h stolon-proxy-service -p 5432 postgres -U stolon -f "/docker-entrypoint-initdb.d/registry.sql"
   psql -h stolon-proxy-service -p 5432 postgres -U stolon -f "/docker-entrypoint-initdb.d/clair.sql"   
   exit 0
fi
exit 1
  • Job yaml文件
apiVersion: batch/v1
kind: Job
metadata:
  name: stolon-init-database-job
spec:
  template:
    spec:
      containers:
      - name: stolon-proxy
        image: sorintlab/stolon:master-pg10
        command:
          - "/bin/bash"
          - "/docker-entrypoint-initdb.d/postgresql.sh"
        volumeMounts:
        - mountPath: /docker-entrypoint-initdb.d
          name: database
      restartPolicy: OnFailure     #失敗重啟
      volumes:
        - name: database
          hostPath:
            path: /postgres_init  # 把之前準備的sql和腳本文件放置這個目錄下顶燕,總共5個文件
  activeDeadlineSeconds: 600   #10分鐘沒有complete,不再重啟并移除Pod

把之前準備好的sql和腳本文件拷貝到各個worker節(jié)點/postgres_init目錄蒋譬,然后再master執(zhí)行批處理任務即可完成數(shù)據(jù)庫的初始化工作割岛,另外如果新建的數(shù)據(jù)庫名稱跟Harbor配置不一致注意更新,自此Postgresql高可用部署完成犯助。

4. Redis高可用部署

4.1 Redis哨兵集群部署

直接采用helm部署即可癣漆,操作步驟可參考如下:

helm repo add stable `https://kubernetes-charts.storage.googleapis.com` 
helm fetch stable/redis-ha
tar xvf redis-ha-xxx.tgz
cd redis-ha

修改values.yaml配置,修改的地方不多絕大部分默認配置即可剂买,其中有兩處額外注意一下:

  • redis訪問密碼設置:需提前創(chuàng)建一個包含redis密碼信息的secret對象惠爽,比如下面這樣:

然后通過kubectl create -f redis-secret.yaml創(chuàng)建癌蓖,之后根據(jù)secret修改values.yaml對應認證信息即可:

(secret中密碼都是base64轉(zhuǎn)碼之后的結(jié)果,此處redis密碼: password1 )
注意:如果如本文redis集群最終要對接Harbor且采用haproxy tcp-check來偵測redis master婚肆,此處auth--> false租副。

  • 持久化存儲設置:因為數(shù)據(jù)庫后端采用共享存儲,設置好PVC對應的storageclass和容量即可:

然后開始部署:

# 可以先檢查下配置
helm install --name vienfu-redis-cluster . --debug --dry-run
# 正式安裝
helm install --name vienfu-redis-cluster .

等待一會而便會發(fā)現(xiàn)部署完成了:


下面做個簡單測試:


4.2 Harbor高可用準備及參數(shù)調(diào)整

一般情況下只需訪問redis-sentinal集群服務便可對redis master進行讀寫较性,但是由于Harbor內(nèi)置的redis客戶端不支持sentinal用僧,所以直接訪問redis sentinal服務是不行的。那么直接訪問redis-server的服務可以嗎赞咙?答案也是不可以的责循,因為這有可能后端最終訪問到redis slave節(jié)點,而slave節(jié)點卻是只讀的攀操,所以需要其他一種方式能夠從redis server節(jié)點中找出redis master院仿,根據(jù)官方文檔提示采用HAProxy,仔細查閱下HAProxy配置官方文檔速和,可以通過haproxy tcp-check功能來鎖定redis master歹垫,如下是可參照的haproxy配置:

# cat /etc/haproxy/conf.d/redis-ha.conf

frontend ft_redis
 bind 10.0.2.15:6379 name redis
 default_backend bk_redis

backend bk_redis
 option tcp-check
 tcp-check connect
 tcp-check send PING\r\n
 tcp-check expect string +PONG
 tcp-check send info\ replication\r\n
 tcp-check expect string role:master
 tcp-check send QUIT\r\n
 tcp-check expect string +OK
 server R1 vienfu-redis-cluster-redis-ha-server-0.vienfu-redis-cluster-redis-ha.default.svc.cluster.local:6379 check inter 1s
 server R2 vienfu-redis-cluster-redis-ha-server-1.vienfu-redis-cluster-redis-ha.default.svc.cluster.local:6379 check inter 1s
 server R3 vienfu-redis-cluster-redis-ha-server-2.vienfu-redis-cluster-redis-ha.default.svc.cluster.local:6379 check inter 1s

然后設置開機啟動及重啟haproxy服務即可。

注意此處也要對應調(diào)整Harbor參數(shù)配置:redis.external.host --> 上面haproxy配置的VIP:10.0.2.15颠放。

4.2.1 其它說明

此外如你所見排惨,此處haproxy后端server的配置采用的是對應server的域名,直接使用POD IP也可以慈迈,不過考慮到該IP可能會變若贮,所以建議使用域名來配置haproxy后端server,那么節(jié)點如何解析kubernetesservice域名呢痒留?對,通過CoreDNS蠢沿。

首先伸头,需要獲取CoreDNS對應的nameserver,很簡單執(zhí)行如下命令即可:

kubectl get svc -n kube-system

把結(jié)果dns服務對應的CLUSTER-IP作為新增的nameserver配置到節(jié)點的域名配置文件中(一般默認/etc/resolve.conf)舷蟀,不過高版本的linux一般都是通過systemd來控制域名解析服務恤磷,如果直接修改該文件重啟域名服務是不生效的,在此提供一個簡單方法直接關掉systemd-resolved并且禁用開機啟動野宜,這樣直接修改/etc/resolve.conf就立刻生效了扫步,其他方法可參照Ubuntu 18.04修改DNS

之后匈子,重啟haproxy服務的過程中可能會碰到如下問題:提示后端server的域名無法解析河胎,但是執(zhí)行nslookup命令卻能解析域名,發(fā)現(xiàn)也ping不通虎敦,最終參照網(wǎng)上nslookup works but can not ping問題最終得以解決游岳。

5. Harbor HA安裝

按照如下命令執(zhí)行完成最終部署:

# 可先檢查下Harbor配置
helm install --name harbor-ha . --debug --dry-run

# 正式部署
helm install --name harbor-ha . 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末政敢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胚迫,更是在濱河造成了極大的恐慌喷户,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件访锻,死亡現(xiàn)場離奇詭異褪尝,居然都是意外死亡,警方通過查閱死者的電腦和手機期犬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門河哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哭懈,你說我怎么就攤上這事灾馒。” “怎么了遣总?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵睬罗,是天一觀的道長。 經(jīng)常有香客問我旭斥,道長容达,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任垂券,我火速辦了婚禮花盐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菇爪。我一直安慰自己算芯,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布凳宙。 她就那樣靜靜地躺著熙揍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏涩。 梳的紋絲不亂的頭發(fā)上届囚,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音是尖,去河邊找鬼意系。 笑死,一個胖子當著我的面吹牛饺汹,可吹牛的內(nèi)容都是我干的蛔添。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼作郭!你這毒婦竟也來了陨囊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤夹攒,失蹤者是張志新(化名)和其女友劉穎蜘醋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咏尝,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡压语,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了编检。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胎食。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖允懂,靈堂內(nèi)的尸體忽然破棺而出厕怜,到底是詐尸還是另有隱情,我是刑警寧澤蕾总,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布粥航,位于F島的核電站,受9級特大地震影響生百,放射性物質(zhì)發(fā)生泄漏递雀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一蚀浆、第九天 我趴在偏房一處隱蔽的房頂上張望缀程。 院中可真熱鬧,春花似錦市俊、人聲如沸杨凑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢甲。三九已至,卻和暖如春据忘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搞糕。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工勇吊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍仰。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓汉规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子针史,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容