一、前言
这是我第一篇博文,中间可能存在许多纰漏,所以请大家不吝指教!另外在文中API及原理性的东西仅做简单提及,因为网上有很多,讲的很详细,我尽量将篇幅放在记录过程上,如有疑惑,欢迎评论。
1.1 搭建思路
- 使用jenkins+maven做自动化部署及构建工具,采用参数化构建或自动构建方式,减少集成工作量。
- 在docker容器中装载应用后直接利用docker 的swarm mode 集群模式来搭建一个应用集群,方便简单快捷。
- 在外部使用nginx进行负载均衡,性能高,可靠。
- 使用consul进行服务发现,在这里为了简化搭建复杂度,在本文中暂时先用consul的主机发现功能,如果还需要更细粒度的服务发现,可通过应用调HTTP API的方式或者使用registrator进行注册服务。
- 使用consul-template对nginx的配置文件进行实时更改及重载。
- 使用keepalived维持主节点的高可用。
1.2 系统结构图
1.3 应用场景
任何搭建及部署方式都是有其应用场景,这一套系统主要解决的问题是减少开发-集成-部署工作的繁琐程度、后期运维手动切换故障节点的麻烦和滞后性、以及当业务量上涨时扩充节点的繁琐步骤,使开发人员专心于业务逻辑、运维人员专心于解决服务器故障。
1.3.1 开发及部署
部署完这一套系统之后,开发人员将代码上传到git上,可以自动或根据预设的策略时机触发构建,此时构建服务器会自动检出代码,并进行打包、集成、构建镜像、推送镜像到私有仓库,再自动通知应用容器集群滚动升级容器,整个过程无需人为干预。
1.3.2 后期运维
对于应用容器来说,当某个节点服务器不可用时会通知其它节点拉取镜像;当节点可用时则自动加入集群提供服务,而主服务器使用keepalived做容灾,在某台主服务器挂掉时实现自动切换,大大降低运维成本。而docker swarm支持弹性伸缩,当系统的业务量和访问量上去,只需要一句命令便可水平扩展节点,甚至可编写脚本实时监控节点服务器负载情况,当节点负载过高时则自动扩展节点;当节点负载低时则关闭部分节点容器,通过弹性伸缩可以更加灵活地分配计算资源。
二、实验环境
本次实验使用了两台主机(win10系统,虚拟机软件使用的是系统自带的hyper-V),第一台主机建立三台虚拟机作为节点服务器,第二台主机建立两台虚拟机做构建服务器/负载均衡服务器及双机热备。建议一开始在两台主机上各创建一个虚拟机,然后配置好环境,接着直接复制虚拟机的文件夹,就不用一台一台配置环境。
主服务器配置如下
主机名 | 地址 | 操作系统 | 内存容量 |
---|---|---|---|
master | 192.168.0.200 | centos7 | 3GB |
backup | 192.168.0.199 | centos7 | 3GB |
节点服务器配置如下
主机名 | 地址 | 操作系统 | 内存容量 |
---|---|---|---|
node1 | 192.168.0.201 | centos7 | 1GB |
node2 | 192.168.0.202 | centos7 | 1GB |
node3 | 192.168.0.203 | centos7 | 1GB |
测试应用
使用spring boot写了一个简单的restAPI,主要用来显示容器的hostname
三、开始搭建
需先准备好环境再进行部署。
3.1 准备环境
说明:主服务器需先配好java环境,至于怎么配自行上网搜索配置。另外建议在配置前更换yum源为阿里源,节约后面的时间,若系统与博主一样为centos7,也可以直接使用复制下面指令进行更换。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum makecache
3.1.1 docker环境
在主服务器及节点服务器中安装docker环境
yum install -y docker
安装完毕后需要修改docker启动服务文件,增加监听远程指令选项。
vi /lib/systemd/system/docker.service
将配置文件中的ExecStart=/usr/bin/dockerd-current后面加上-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
如下配置:
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer
[Service]
Type=notify
NotifyAccess=all
KillMode=process
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
MountFlags=slave
[Install]
WantedBy=multi-user.target
保存完毕后执行下面指令使其生效
firewall-cmd --zone=public --add-port=2375/tcp --permanent && \
systemctl reload firewalld && \
systemctl daemon-reload && \
systemctl start docker || \
systemctl restart docker
3.1.2 jenkins环境
在主服务器中配置jenkins环境,不建议使用jenkins的docker容器,配置docker比较麻烦,且并不比war版方便多少。
wget -P /home/jenkins http://mirrors.jenkins.io/war-stable/latest/jenkins.war && \
firewall-cmd --zone=public --add-port=8080/tcp --permanent && \
systemctl reload firewalld && \
nohup java -jar /home/jenkins/jenkins.war &
当控制台输出带“nohup.out”字样时可按ctrl+c退出,然后执行如下执行
vi /home/jenkins/nohup.out
找到文件中如下字样
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@24f2b2ff: defining beans [filter,legacy]; root of factory hierarchy
七月 15, 2017 9:11:15 上午 jenkins.install.SetupWizard init
信息:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
9a8e9681d8f74a5894be57d618c6878b
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
七月 15, 2017 9:11:24 上午 hudson.model.UpdateSite updateData
信息: Obtained the latest update center data file for UpdateSource default
七月 15, 2017 9:11:26 上午 hudson.model.UpdateSite updateData
信息: Obtained the latest update center data file for UpdateSource default
七月 15, 2017 9:11:27 上午 hudson.WebAppMain$3 run
信息: Jenkins is fully up and running
七月 15, 2017 9:11:27 上午 hudson.model.DownloadService$Do
将其中的密钥(9a8e9681d8f74a5894be57d618c6878b)复制出来,在浏览器运行http://192.168.0.200:8080/ ,第一次登陆要求输入密钥,将刚刚复制的密钥复制进去,然后根据资料填写相关信息,插件安装则选择默认安装。
等待一段时间安装完毕后再登陆进去。
3.1.3 Maven环境
在主服务器中配置maven环境,这里有一个注意的地方,截止目前jenkins的这个版本只兼容到maven3.3.9,所以最好使用这个版本进行部署。
wget -P /home/maven https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz<