jenkins+java+docker+kubernetes实现自动化部署

post thumb
Ops
作者 Louis 发表于 2020年6月24日

[TOC]

背景

基于springboot项目, 部署在kubernetes集群, 并实现自动化构建部署. 减轻开发的部署压力, 仅仅提交代码, 后续便由运维部署. 开发无需关心部署内在逻辑.

项目架构图

公司内部的k8s集群,主要跑的一个内部的crm系统,该系统的源码及构建管理使用的是gitlab+docker+maven, 代码测试用的sonarqube, 包管理使用的harbor, 部署使用的jenkins+kubernetes, 监控使用kube-prometheus, 日志使用loki, 配置中心使用nacos, 消息队列使用rabbitmq, 数据库使用mysql+redis

整个访问链路内网使用nginx进行负载均衡代理至kubernetes的ingress. 因为需要外网介入访问, 我们这边使用了内网穿透frp进行穿透访问crm系统.

项目构建

使用jenkins进行构建, 项目名称即为java的项目名称.

源码管理SourceCode Management选择git, 填入项目的源码地址即可. build trigger

build阶段使用mvn进行构建 mvn clean install -Dmaven.test.skip=true

手写Dockerfile文件.

cd $WORKSPACE/$JOB_BASE_NAME

mvn clean package -Dmaven.test.skip=true

cat >> $WORKSPACE/$JOB_BASE_NAME/target/Dockerfile  <<EOF
FROM harbor.youpenglai.cn/library/jre-8-alpine-bash:latest
MAINTAINER louis <louis.hong@junhsue.com>
WORKDIR /opt/
ADD $JOB_BASE_NAME.jar .
CMD [ "bash", "-c", "java -Xmx512m -Xms512m -Xss256k -Xmn128m -Dspring.profiles.active=dev  -Djava.security.egd=file:/dev/./urandom -jar /opt/$JOB_BASE_NAME.jar"]

EOF

镜像打包及push阶段, 使用jenkins的docker-step插件.

部署阶段

NAMESPACE=huohua
REGISTRY=harbor.youpenglai.cn
K8S_TOKEN='**********'
## 使用kubernetes的API进行部署
curl -X PATCH \
  -H "content-type: application/strategic-merge-patch+json" \
  -H "Authorization:Bearer $K8S_TOKEN" \
  -d '{"spec":{"template":{"spec":{"containers":[{"name":"'${JOB_BASE_NAME}'","image":"'${REGISTRY}'/'${NAMESPACE}'/'${JOB_BASE_NAME}':'${BUILD_NUMBER}'"}]}}}}' \
  "https://kuboard.youpenglai.com/k8s-api/apis/apps/v1/namespaces/${NAMESPACE}/deployments/svc-${JOB_BASE_NAME}"

sleep  20s 

unset LabelSelector

LabelSelector="k8s.kuboard.cn/name=svc-${JOB_BASE_NAME},release=${JOB_BASE_NAME}"

newPod=$(kubectl get po -l ${LabelSelector} -n ${NAMESPACE} | awk 'NR>1{print $1;exit}')

[ -z $newPod ] && exit 

kubectl logs --tail 100  $newPod  -n ${NAMESPACE}
上一篇
记一次nginx跨域访问Content Security Policy设置