## 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。
![](https://img.kancloud.cn/dc/20/dc209faf9a1b211c75431003fa8528f4_677x326.png)
如上图所示,第一层是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地址
![](https://img.kancloud.cn/2e/e2/2ee255d1dd59b3157eed813be8fdec3d_909x224.png)
配置固定的agent端口和协议
![](https://img.kancloud.cn/9a/85/9a85aa0610f1e43f6f984243c5fbf32f_930x338.png)
**部署HAProxy**
**haproxy的部署包需要访问外国网站哦**
![](https://img.kancloud.cn/30/9b/309bcfc3884fdbe0d5940f9c661600dd_1080x415.png)
~~~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
![](https://img.kancloud.cn/1b/8a/1b8a16e1261ff013f8a71692a30e895f_1080x632.png)
## 5 **测试结果**
如果jenkins01节点出现问题宕机或者网页访问出现问题,Haproxy会将请求调度到jenkins02节点。但是在切换之前需要先将jenkins02节点做个reload才能使其与jenkins01节点中的数据一致。(所以还是需要有一些手动的操作)。
* 使用Haproxy HTTP代理 可以完成对master节点的健康检查。
* 使用Haproxy TCP代理可以完成Agent节点的自动链接。
![](https://img.kancloud.cn/1f/42/1f429c080d2f9934f1faf7e4e692b32c_1080x709.png)
- 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