## 1 **背景**
為了追求更快的應用程序開發,我們發明,測試和實施了幾種實踐,這些實踐徹底改變了我們開發應用程序的方式。持續集成(CI)就是這樣的DevOps實踐之一,它通過將開發人員的技能與大量工具結合起來,提高了應用程序開發的速度。Jenkins是一種流行的CI工具,用于自動執行復雜任務。隨著基礎架構的發展,您必須開始考慮使用Jenkins保護和負載平衡CI / CD工具,這是任何DevOps文化的核心。
在給DevOps管道帶來的所有便利中,Jenkins的單點故障可能會破壞整個DevOps流程。因此,重要的是要確保您的詹金斯是萬無一失的。現在有多種方法可以實現這一目標。您可以使用企業Jenkins產品,但這會增加成本。對我而言,我建議的最簡單的方法是使用兩個Jenkins主[服務器](https://cloud.tencent.com/product/cvm?from=10680)配置Jenkins高可用性,其中一個將始終是主動服務于構建,而另一個則是被動的。如果先前處于活動狀態的主機變為非活動狀態,則被動或非活動主機將被激活。想知道如何設置嗎?我已經覆蓋了你。在進行實際的設置和配置之前,讓我們看一下此設置的先決條件。
* 需要準備三臺主機 一臺用于HA代理,另外兩臺部署Jenkins。
* 在其中一臺機器中部署NFS共享存儲。
* 具備一定的HAproxy和NFS存儲相關知識。
## 2 **什么是高可用?**
當我們說高可用性時,我們指的是可以長時間連續運行而不會出現故障的系統。該術語表示系統已經過全面測試,可以承受任何類型的故障。Jenkins是DevOps的重要組成部分,其停機時間可能會對DevOps環境產生不利影響。為了克服這些問題,我們需要為Jenkins設置高可用性。
**HaProxy如何工作?**
* 用戶的Web瀏覽器使用完全限定的[域名](https://cloud.tencent.com/act/pro/domain-sales?from=10680)(例如http://jenkins.domain.com),通過分配給常用HTTP的端口80向[負載均衡](https://cloud.tencent.com/product/clb?from=10680)器發送請求。
* 域名系統(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內存。防火墻暫時關閉。**
**主機信息**
~~~javascript
192.168.1.100 HA
192.168.1.102 Jenkins01
192.168.1.103 Jenkins02
~~~
復制
**部署NFS服務**
這里我們需要在1.103 機器部署NFS,并配置為103和102 掛載。
~~~javascript
#安裝軟件
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并啟動即可。
~~~javascript
#安裝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的部署包需要訪問外國網站哦**

~~~javascript
#編譯安裝
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節點的自動鏈接。

- DevOps介紹
- 持續集成流程
- git工作流實踐
- 新人準備git環境
- git工作流最佳實踐
- jenkins基礎入門
- jenkins簡介
- jenkins安裝(docker)
- 源碼拉取
- maven構建
- 應用發布
- 結合gitlab版本管理
- jenkins-docker部署
- harbor鏡像發布
- jenkins集成SonarQube
- SonarQube代碼檢測
- 集成SonarQube
- jenkins-pipeline
- 構建pipeline任務
- pipeline基礎結構
- pipeline核心語法
- jenkinsfile構建
- 完整案例
- 整合釘釘發送通知
- 腳本使用憑證信息
- jenkins結合k8s使用
- k8s架構及基礎概念
- k8s操作命令
- jenkins部署k8s
- 附錄(其他未完成)
- jenkins高可用服務搭建
- gitlab-docker環境搭建
- 開發人員安裝git
- JDK與maven
- docker安裝gitlab
- docker安裝
- docker-compose安裝
- harbor安裝
- SonarQube安裝
- 2.暫時沒寫的內容
- 構建結果郵件發送
- 已有項目上傳gitlab