持续部署
这里以最简单的方式进行部署,不涉及到pod的弹性升级、回滚等,也不涉及ingress统一api放行等操作
前置知识点:(都是基本的搭建和简单的使用)
jenkins的搭建
harbor的搭建
linux的免密登录
gitlab+jenkins的持续集成和构建
一、环境准备
全部环境就放在四台服务器上面,k8s一主两从,然后所有环境放在同一台上面
1. K8S环境
这里是已经搭建好了的k8s集群,下次写一篇
hostname | ip |
---|---|
k8s-m-t1 | 192.168.109.11 |
k8s-s1-t1 | 192.168.109.12 |
k8s-s2-t1 | 192.168.109.13 |
2. 其他环境
这里我将所有环境放在一台机器上面了
其分别对应的域名(在宿主机和该环境所在的机器进行hosts域名解析):
192.168.109.123 test.nexus.cn(这个目前不需要)
192.168.109.123 test.harbor.cn
192.168.109.123 test.jenkins.cn
192.168.109.123 test.gitlab.cn
上面这些环境都是用nginx做的反向代理(这个之后可以用宝塔写个教程很简单!)
看看环境:
关于其他环境的搭建:
jenkins的搭建
harbor的搭建
linux的免密登录
gitlab+jenkins的持续集成和构建
可以先看看上面几篇文章,熟悉一下基本环境的搭建!!
二、jenkins的配置
1. java项目和dockerfile文件
下载下面勾选的插件,用来构建镜像的(第一、二个可以不选择,安装出错也不要紧):
下载完成后说说这个插件的作用:
他可以帮我们根据dockerfile构建一个镜像推送到指定的docker-harbor仓库!!
注意Dockerfile 一定要和代码放在同一处(当前目录最顶层),这样docker build and publish 插件才能生效
项目地址:gitee项目
dockerfile:
FROM adoptopenjdk/openjdk8-openj9:alpine-slim
# 端口可以改一下
EXPOSE 9999
MAINTAINER itman_cx@163.com
WORKDIR /app
# 项目名称改一下
ADD ./target/test-jenkins-latest.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]
2. jenkins上的配置
tips: 下面的配置是基于之前的环境做的,所以需要看下:gitlab+jenkins的持续集成和构建,之后考虑放到一篇文章当中进行书写,最近没啥时间(之后还需要忙着给毕业生或者秋招的学弟们准备八股文)
给harbor所在主机,即除k8s外的那台服务器(192.168.109.123)上面的docker配置:
# 修改权限
chmod 777 /var/run/docker.sock
上面是打包镜像推送到haobor上,之后k8s需要从这里进行拉取
继续往下走,配置构建镜像后的操作,去执行shell脚本部署项目:
# 这里已经配置了免密,如果不会免密的,可以参考上面文章
ssh 192.168.109.11 "cd /data/jenkins/k8s/ && sh deploy.sh ${BUILD_NUMBER}"
目前jenkins上面的环境已经配置好了,接下来就看下脚本了:
3. k8s部署脚本
配置k8s登录harbor的秘钥(下面部署pod的时候会用到):
kubectl create secret docker-registry harbor-login --docker-server=test.harbor.cn --docker-username=admin --docker-password=Harbor12345
这里记得配置一下允许http登录:
首先是k8s_delpoyment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
# pod部署名称
name: testjenkins
namespace: default
spec:
minReadySeconds: 5
strategy:
# indicate which strategy we want for rolling update
type: RollingUpdate
rollingUpdate:
maxSurge: 10
maxUnavailable: 10
replicas: 2
selector:
matchLabels:
app: testjenkins
template:
metadata:
labels:
app: testjenkins
spec:
imagePullSecrets:
# 这里使用了秘钥登录
- name: harbor-login
terminationGracePeriodSeconds: 10
containers:
- name: testjenkins
# 这里是镜像地址 + 项目名 + 镜像名 + tag
image: test.harbor.cn/test-jenkins/test-jenkins:20
imagePullPolicy: IfNotPresent
ports:
# 外部访问端口
- containerPort: 9999
name: web
protocol: TCP
livenessProbe:
httpGet:
# 项目请求路径
path: /sayHello
port: 9999
# 容器初始化完成后,等待60秒进行探针检查
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
path: /sayHello
port: 9999
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
然后是部署service暴露服务,使用nodePort的方式:k8s_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: testjenkins
namespace: default
labels:
app: testjenkins
spec:
selector:
app: testjenkins
type: NodePort
ports:
- name: web
port: 9999
targetPort: 9999
nodePort: 31111
目前就先不部署ingress!!
上面这些文件都有了之后,就差最后一个了:deploy.sh
#!/bin/bash
workdir="/data/jenkins/k8s"
project="k8s"
job_number=$(date +%s)
cd ${workdir}
oldversion=$(cat ${project}_delpoyment.yaml | grep "image:" | awk -F ':' '{print $NF}')
newversion=$1
echo "old version is: "${oldversion}
echo "new version is: "${newversion}
##tihuan jingxiangbanben
sed -i.bak${job_number} 's/'test-jenkins:"${oldversion}"'/'test-jenkins:"${newversion}"'/g' ${project}_delpoyment.yaml
# 停止之前的service
kubectl delete -f ${project}_svc.yaml
# 删除之前的pod,不做回滚
kubectl delete -f ${project}_delpoyment.yaml
# zhixing shengjibanben
kubectl apply -f ${project}_delpoyment.yaml --record=true
# 暴露服务
kubectl apply -f ${project}_svc.yaml
上面的内容就不解释了,有不懂的可以留言问问,这是shell知识,不细讲了,然后就是,上面两个yaml文件需要与这个脚本放在同一个文件夹下面,也就是 jenkins配置需要cd进入的那个目录下面
环境准备好了,开始测试!!!
三、测试
这是之前部署过一次的:
1. 修改代码
这里只需要push就行,然后就会完成自动构建:
看效果:
部署成功!!!
总结
感谢大家阅读、互相学习;
有问题评论或者发邮箱;
gitee:很多代码仓库;
1449697757@qq.com