前面已经完成了k8s集群的部署,现在尝试jenkins自动集成到k8s集群。jenkins搭建可以参考,jenkins搭建
前面已经完成了jenkins的搭建,但是还没有集成git,maven,java,这里做下配置。
linux安装git如下
yum install git
如下图的路径配置里如果没有git,去插件安装处安装一下git插件即可
配置git,如果没有git去插件管理安装一下就行
/usr/bin/git
自己下载maven安装包,解压到你自己的安装目录,修改conf文件
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
export MAVEN_HOME=/opt/*/maven3.6/apache-maven-3.6.3
export PATH=MAVEN_HOME/bin:MAVEN_HOME/bin:PATH
#刷新配置
source /etc/profile
检查是否安装成功
mvn help:system
如果出现下载文件,则maven安装成功了,接下来去jenkins配置maven如图所示,我的安装路径如下,
/root/tools/apache-maven-3.6.3/conf/settings.xml
/root/tools/jdk/jdk1.8.0_144
这里我使用的国内免费的gittee作为仓库。
先到linux服务器上生成公钥私钥,用来联通linux和git
ssh-keygen -t rsa -C "[email protected]"
然后两次回车即可,cd ~/.ssh 目录下拷贝公钥到gitee,公钥管理处
公钥存放的文件为id_rsa.pub
私钥存放的文件为id_rsa
Failed to connect to repository : Command "/usr/bin/git ls-remote -h https://gitee.com/jiangbingsong/k8s-demo.git HEAD" returned status code 128:
stdout:
stderr: fatal: Authentication failed for 'https://gitee.com/jiangbingsong/k8s-demo.git/
可能原因:
1.你的秘钥配置填写错误,检查一下就行
2.gittee仓库的权限不是公开的,把它配置成公开,或者设置仓库秘钥重新配置。
仓库秘钥配置的地方如下图,我配置了好几次都失败了,提示成功却没有秘钥出来
然后修改为仓库公开了,在基本信息下面设置仓库公开即可。
clean install
这里的pom路径为相对路径,根据你仓库地址到pom.xml文件的路径例如我的仓库下载下来的代码pom文件路径就是根路径下的,pom.xml
Dashboard-Manage Jenkins-System,publish over ssh 这里配置,
如果没有该选项,则去插件配置里面搜索这个插件安装重启一下就好了。
Passphrase 登录主机的密码
配置Send files or execute commands over SSH 拷贝生成的jar到远端。
target/demo-0.0.1-SNAPSHOT.jar
target
/root/dockerimage
pwd
echo “传输完成”
新增远端执行指令,选择刚刚系统配置的远端主机
这个红色的警告不用管,这个是你jenkins要带到远端的文件,我这里不需要带过去,就不配置了。
cd /root/dockerimage
./start.sh
./imagerm.sh
这里要执行的命令,我写成了shell脚本去执行,脚本如下
start.sh如下
#!/bin/sh
#
# 镜像仓库地址
DOCKER_REPOSITORIES="192.168.184.129:5000"
# 项目名称
APP_NAME="springbootdemo"
# 初始化版本号
init_version="0.0.1"
#下一个版本号
nextPlatformTags=""
#登录到私有仓库
# 处理私服docker镜像版本号 旧的版本号
platformRepoTags=$(curl -u jiangbingsong:123456 ${DOCKER_REPOSITORIES}/v2/${APP_NAME}/tags/list |jq ".tags" |awk -F',' '{print $NF}'|sed 's/[][]//' |sed '/^$/d'|sed 's/\"//g')
echo "platformRepoTags:" $platformRepoTags
#去掉空格
platformRepoTags=${platformRepoTags// /}
if [ "$platformRepoTags" = null ]; then
nextPlatformTags="${init_version}"
else
OLD_IFS="$IFS"
IFS="."
arryPlatTags=($platformRepoTags)
IFS="$OLD_IFS"
# 处理私服docker镜像版本号 升级版本
nextPlatformTags=${arryPlatTags[0]}.${arryPlatTags[1]}.$[arryPlatTags[2]+1]
fi
# 构建的命令
APP_NAME_BUILD="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags} ."
echo "构建的命令: build -t ${APP_NAME_BUILD}"
docker build -t ${APP_NAME_BUILD}
#push到镜像仓库
PUSH_APP_NAME="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags}"
#echo "提交到私有镜像仓库命令: docker push ${PUSH_APP_NAME}"
docker login ${DOCKER_REPOSITORIES} -u jiangbingsong -p 123456
docker push ${PUSH_APP_NAME}
#docker logout
kubectl apply -f springbootDeployment.yaml
echo "PUSH_APP_NAME:" ${PUSH_APP_NAME}
kubectl set image -n=webservice deployment/springbootdeploy $APP_NAME=${PUSH_APP_NAME}
echo "success !"
解释下,这里主要做的事有生成docker镜像,查询仓库内的镜像版本号,自动升级版本号,使用版本号进行升级,然后推送到仓库,最后设置deployment的镜像镜像更新。
#!/bin/bash
# 获取所有镜像列表,并按照创建时间排序
image_list=$(docker image ls --format "{{.Repository}}:{{.Tag}}|{{.CreatedAt}}" | sort -t "|" -k2,2)
# 获取所有镜像名
image_names=$(echo "$image_list" | awk -F ':' '{print $1}' | uniq)
# 遍历每个镜像名
for image_name in $image_names; do
# 获取特定镜像名的镜像列表
filtered_images=$(echo "$image_list" | awk -F ':' -v name="$image_name" '$1 == name')
# 获取镜像数量
image_count=$(echo "$filtered_images" | wc -l)
# 如果镜像数量超过3个,则删除旧的镜像,只保留最近的两个
if [ $image_count -gt 3 ]; then
images_to_delete=$((image_count - 2))
images_to_delete_list=$(echo "$filtered_images" | head -n $images_to_delete | cut -d "|" -f 1)
for image in $images_to_delete_list; do
docker image rm $image
done
fi
done
这里我的服务暴露的方式是nodeport,也可以用ingress配置成域名登录,比较麻烦,前面的教程也有弄过,这里这是为了集成jenkins就不搞这么多了。
kubectl get svc --all-namespaces
http://192.168.184.129:30467/hello
返回了200,验证成功。
1.jenkins集成,可以先不直接集成k8s,可以先用jenkins集成java -jar的方式启动,这样能先排除jenkins产生的问题,我这里就不展示过程了,就直接写成了最后的结果。
2.springbootDeployment.yaml文件的镜像拉取设置要修改一下才能拉取到。