Jenkins開源版系統高可用架構設計
- 2019 年 11 月 12 日
- 筆記
前言
本篇文章主要內容來自《How to configure Jenkins with High Availability?》,周末經過個人參考進行實踐,對內容做了一些補充,希望有幫助。 原文地址:https://www.opcito.com/blogs/how-to-configure-jenkins-with-high-availability/
1 背景
為了追求更快的應用程式開發,我們發明,測試和實施了幾種實踐,這些實踐徹底改變了我們開發應用程式的方式。持續集成(CI)就是這樣的DevOps實踐之一,它通過將開發人員的技能與大量工具結合起來,提高了應用程式開發的速度。Jenkins是一種流行的CI工具,用於自動執行複雜任務。隨著基礎架構的發展,您必須開始考慮使用Jenkins保護和負載平衡CI / CD工具,這是任何DevOps文化的核心。
在給DevOps管道帶來的所有便利中,Jenkins的單點故障可能會破壞整個DevOps流程。因此,重要的是要確保您的詹金斯是萬無一失的。現在有多種方法可以實現這一目標。您可以使用企業Jenkins產品,但這會增加成本。對我而言,我建議的最簡單的方法是使用兩個Jenkins主伺服器配置Jenkins高可用性,其中一個將始終是主動服務於構建,而另一個則是被動的。如果先前處於活動狀態的主機變為非活動狀態,則被動或非活動主機將被激活。想知道如何設置嗎?我已經覆蓋了你。在進行實際的設置和配置之前,讓我們看一下此設置的先決條件。
- 需要準備三台主機 一台用於HA代理,另外兩台部署Jenkins。
- 在其中一台機器中部署NFS共享存儲。
- 具備一定的HAproxy和NFS存儲相關知識。
2 什麼是高可用?
當我們說高可用性時,我們指的是可以長時間連續運行而不會出現故障的系統。該術語表示系統已經過全面測試,可以承受任何類型的故障。Jenkins是DevOps的重要組成部分,其停機時間可能會對DevOps環境產生不利影響。為了克服這些問題,我們需要為Jenkins設置高可用性。
HaProxy如何工作?
- 用戶的Web瀏覽器使用完全限定的域名(例如http://jenkins.domain.com),通過分配給常用HTTP的埠80向負載均衡器發送請求。
- 域名系統(DNS)到達輸入域名的IP地址,並從那裡獲取數據。
- 如果負載平衡器伺服器不可用,則對該伺服器的請求將超時。如果負載均衡器可用,則根據電腦的可用性路由請求。
- HAProxy在其配置文件中引用負載均衡器池,確定必須將客戶端請求路由到的應用程式伺服器。該接收請求的伺服器通常是包括專用應用程式伺服器的自動擴展陣列的一部分。
- HAProxy將此請求轉發到其配置文件中引用的伺服器埠(通常為埠80)。
3 Jenkins HA配置
現在讓我們看看如何配置HAProxy。

如上圖所示,第一層是HAProxy。每當有對構建的傳入請求時,它將首先到達HAProxy。然後,它將決定可以將請求路由到的機器。在此,其中一個主機將處於主動狀態以服務於請求,而另一個主機將處於被動狀態。只要活動主伺服器出現問題並且故障,其他主伺服器將變為活動狀態,並且請求將恢復。然後,這些請求將由已激活的主機服務。HA代理主要通過在主動和被動鏈接上稱為心跳的令牌與節點進行通訊。
第二層是Jenkins主設備設置,其中兩個主設備具有相同的配置,並共享JenkinsHome以實現高可用性。因此,一旦重新載入配置,在一個Jenkins主機上創建的項目也將可用於第二個主機。要在第二個主伺服器上重新載入配置,請在Jenkins URL的末尾鍵入「 / reload」,然後按Enter鍵。
例如,http://myjenkinsserver.com:8080/reload將重新載入配置,而無需重新啟動。
第三層是AWS上的EFS掛載點,它通過VPC與兩個Jenkins主機共享。它是一種網路文件系統,可以在單個VPC上進行配置,並且可以與該VPC中的多個子網共享。(注意這裡我採用的NFS)
4 詳細技術實施方案
本次實驗採用3台主機,作業系統為CentOS8,每台4G記憶體。防火牆暫時關閉。
主機資訊
192.168.1.100 HA 192.168.1.102 Jenkins01 192.168.1.103 Jenkins02
部署NFS服務
這裡我們需要在1.103 機器部署NFS,並配置為103和102 掛載。
#安裝軟體 yum -y install nfs-utils #創建共享目錄 mkdir /data echo "/data 192.168.1.0/24(rw)" >/etc/exports exportfs -r exportfs -v #啟動nfs服務 systemctl start nfs-server systemctl enable nfs-server #創建掛載點並掛載 mkdir /var/lib/data mount -t nfs 192.168.1.103:/data /var/lib/data
參考文檔:https://ywnz.com/linuxyffq/5186.html
部署Jenkins服務
只需要在102部署Jenkins並完成初始化配置,然後第二台伺服器直接指向相同的JENKINS_HOME並啟動即可。
#安裝JDK #下載Jenkins包 https://mirrors.tuna.tsinghua.edu.cn/jenkins/ #指定JENKINS_HOME export JENKINS_HOME=/var/lib/data/jenkins #啟動服務 nohup java -jar jenkins-2.190.2.war -Djenkins.slaves.DefaultJnlpSlaveReceiver.disableStrictVerification=true --httpPort=8080 &
注意配置,如下:
更改伺服器地址為HA地址

配置固定的agent埠和協議

部署HAProxy
haproxy的部署包需要翻牆哦

#編譯安裝 tar zxf haproxy-2.0.8.tar.gz cd haproxy-2.0.8 make TARGET=linux-glibc PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy cp ./examples/haproxy.init /etc/init.d/haproxy chmod 755 /etc/init.d/haproxy useradd -r haproxy mkdir /etc/haproxy #生成配置文件/etc/haproxy/haproxy.cfg global maxconn 20000 ulimit-n 16384 log 127.0.0.1 local0 uid 200 node http gid 200 chroot /var/empty nbproc 4 daemon listen admin_stats #開啟haproxy監控介面 bind *:8001 #綁定8001埠 mode http option httplog stats enable #開啟統計 stats refresh 5s stats uri /haproxy?stats #監控介面url為:http://ip:80/haproxy/stats stats auth admin:123456 stats realm welcome Haproxy stats admin if TRUE listen jenkins_agent mode tcp bind *:8181 balance roundrobin server jenkins01 192.168.1.102:8181 weight 1 maxconn 10000 check inter 1s server jenkins02 192.168.1.103:8181 weight 1 maxconn 10000 check inter 1s frontend jenkins_proxy bind *:80 log global option redispatch option forwardfor option http-server-close maxconn 8000 timeout client 30s default_backend jenkins_proxy reqadd X-Forwarded-Proto: http backend jenkins_proxy balance roundrobin option httpchk GET /login server jenkins1 192.168.1.102:8080 check inter 1000 rise 1 fall 1 weight 30 server jenkins2 192.168.1.103:8080 check inter 1000 rise 1 fall 1 weight 30 #啟動服務 systemctl start haproxy #默認haproxy日誌沒有生成文件,更改rsyslog配置 # /etc/rsyslog.d/haproxy.conf $ModLoad imudp $UDPServerRun 514 $UDPServerAddress 0.0.0.0 local0.* /var/log/haproxy.log systemctl restart rsyslog systemctl haproxy
Haproxy 管理後台
http://192.168.1.100:8001/haproxy?stats

5 測試結果
如果jenkins01節點出現問題宕機或者網頁訪問出現問題,Haproxy會將請求調度到jenkins02節點。但是在切換之前需要先將jenkins02節點做個reload才能使其與jenkins01節點中的數據一致。(所以還是需要有一些手動的操作)。
- 使用Haproxy HTTP代理 可以完成對master節點的健康檢查。
- 使用Haproxy TCP代理可以完成Agent節點的自動鏈接。
