为了自动化部署jar包到k8s容器云上边而写的脚本。
为了避免繁杂的发包操作。复制粘贴的喋喋不休,jar包升版的版本控制而写的脚本。
一、 脚本功能
把jar包放到指定目录,执行shell脚本,脚本先自动根据文件夹的环境把jar包中的配置文件替换掉。这样可以很方便的打生产环境和测试环境的jar包。只需要把jar放上去,配置文件无需关系,自动放到jar包里。然后脚本会自动把jar打成镜像,给镜像打成镜像名称加时间日期的标签,然后把镜像推送到镜像仓库。然后自动替换k8s的yaml脚本停止旧容器,启动新容器。
二、 脚本所需
1. springboot的jar包
2. 构建springboot镜像的Dockerfile
3. k8s启动yaml文件
三、 脚本定义
appname:所打包的name
dockersrc:用来放置Dockerfile文件。把jar包打成docker镜像。
k8ssrc:用来防止k8s的yaml文件,启动pod,停止pod
bmc:jar包的名字
file1:jar包种要替换的配置文件的名字,这个文件放置在dockersrc目录下。如bootstrap.properties
【替换jar包配置文件真的很方便,这样打成的jar包直接放进来就能用,无需关心配置文件,一键shell即可打包更新环境】
四、 脚本流程
1. 获取当前时间的年月日时分秒,生成当前jar包的版本号
2. 把jar包中的配置文件替换为dockersrc中的配置文件。
3. 把jar包打成docker镜像
4. 清除替换配置文件的残余
5. 给镜像打标签带上我们的版本号
6. 把这个镜像推送到远程镜像仓库
7. 替换yaml文件中的版本号
8. 重启pod,更新完成
五、 脚本详情
#!/bin/bash #auth eric #date 2020-11-25 #*********脚本入参#********* appname=base #Docker脚本位置 dockersrc=/home/springcloud/DockerBuilder/$appname #K8s脚本位置 k8ssrc=/home/springcloud/k8s/$appname #需要替换的包名称 bmc=$appname-server-web-1.0.jar #需要替换的文件名称 file1=bootstrap.properties #*********脚本入参#********* #当前镜像版本 source /etc/profile version="`date +%Y%m%d%H%M%S`" echo '当前版本为'$version echo '第一步:替换JAR包配置文件' #找到替换文件路径 cd $dockersrc if [ ! -d "$dockersrc"]; then echo "$dockersrc文件夹不存在"; exit 1; fi if [ ! -f "$jarsrc/$bmc" ];then echo "$jarsrc/$bmc更新包不存在" fi #清除上一次的残余 rm -f *.tar *.jar cp $jarsrc/$bmc $dockersrc filesrc1=`jar -tvf \$bmc|grep \$file1|awk '{print \$NF}'` echo $bmc echo $file1 echo $filesrc1 #把要替换的文件解压出来 jar -xvf $bmc $filesrc1 if [ $? != 0 ]; then echo "java命令不存在,请安装JDK" exit 1; fi #删掉原文件 rm -f $filesrc1 #换掉文件 cp $file1 $filesrc1 #重新将文件加入到jar包中 jar -uvf $bmc $filesrc1 #删除解压文件 rm -rf BOOT-INF rm -f *.tmp echo '替换完成' echo '第二步:构建Docker镜像' docker build -t springcloud-$appname:1.1 . if [ $? != 0 ]; then echo "docker构建失败,请检查Docker" exit 1; fi docker save springcloud-$appname:1.1 -o springcloud-$appname.tar docker load < springcloud-$appname.tar docker tag springcloud-$appname:1.1 192.168.1.6:15000/springcloud/springcloud-$appname:v$version docker push 192.168.1.6:15000/springcloud/springcloud-$appname:v$version if [ $? != 0 ]; then echo "远程仓库推送失败,请检查远程镜像仓库" exit 1; fi echo '第三步:升级K8s容器' #替换k8s容器镜像版本 cd $k8ssrc if [ ! -d "$k8ssrc"]; then echo "$k8ssrc文件夹不存在"; exit 1; fi sed -i "s|springcloud/springcloud-$appname:.*|springcloud/springcloud-$appname:v$version |g" 04.application-deployments.yaml kubectl delete -f 04.application-deployments.yaml kubectl apply -f 04.application-deployments.yaml echo '升级完成,当前版本为:'$version
六、 Dockerfile实例
首先要先安装openjdk
docker pull openjdk
然后注意修改时区保证docker容器内的时间和外部时间同步
FROM openjdk:8 MAINTAINER ERIC-BASE LABEL app="eric-base" version="1.1" by="eric" COPY ./base-server-web-1.0.jar base-server-web-1.0.jar RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone CMD java -Xms256m -Xmx512m -jar base-server-web-1.0.jar
k8s日志自动收集脚本
k8s自带的日志方案一般需要集成专业的日志ELK才能快速检索出错误信息,为了编辑繁杂的集成操作,这里简单写了一个脚本把各个容器的日志收集存储到本地。便于定位发现程序错误。
一、 脚本功能
每天十二点定时执行脚本,批量获取工作空间中的所有pod当天的日志信息,存储到本地。同时删除七天前的日志。
最终形成一个日志工作空间的文件夹,文件夹中又各个pod的名字,每个pod中存放着最近七天的日志运行信息。便于快速查找k8s容器报错信息,快速定位错误。
二、 脚本流程
1. 获取工作空间springcloud的所有容器名称
2. 循环容器名称,滤除首行,截取得到准确的容器名称,和应用名称
3. 获取当前日期和七天前的日期
4. 存放日志的文件夹是否存在,如果不存在则创建
5. 把容器的日志导出成文件,文件名用应用名称加上当前日期
6. 删除七天前的日志信息
三、 定时任务
linux系统中可以把定时任务写在crontab中,通过crontab自定义cron表达式执行我们的脚本
vi /etc/crontab
然后在这里添加进来我们的定时任务,每天晚上11点执行
0 0 23 * * ? root sh /home/springboot/log/log.sh
然后开启定时任务
1. systemctl start crond 2. systemctl restart crond
四、 脚本详情
#!bin/bash #auth eric #2020-12-02 #注意这里要声明环境变量,不然不识别kubectl命令 PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin pod=$(kubectl get pod -n springcloud |awk '{print $1}'); for i in $pod; do if [ $i = 'NAME' ] then continue fi podname=$i; appname=`echo $i|awk -F'-' '{print $2}'`; timenow=$(date "+%Y%m%d"); timeago=$(date -d"7 day ago" +%Y%m%d); dir=/home/springcloud/log/$appname if [ ! -d "$dir" ];then mkdir $dir fi #删除7天前的日志 if [ -f "$dir/$appname$timeago.txt" ];then rm -f $dir/$appname$timeago.txt; fi #导出今天的日志 kubectl logs --since=24h $podname -n springcloud >$dir/$appname$timenow.txt done;