Jenkins+K8s自动化部署Spring Boot全攻略
基于 Jenkins 的 CI/CD 流水线实现 Spring Boot 应用自动化部署到 Kubernetes
环境准备与工具配置
确保已安装 Jenkins、Docker、Kubernetes 集群(如 Minikube 或生产环境集群)及 kubectl 命令行工具。Jenkins 需安装 Kubernetes 插件(如 Kubernetes CLI Plugin)和 Docker 相关插件(如 Docker Pipeline)。
在 Jenkins 系统配置中,添加 Kubernetes 集群的凭据(kubeconfig 文件或 Service Account 令牌)。配置 Docker Hub 或私有镜像仓库的访问凭证。
Spring Boot 项目配置
在项目根目录创建 Dockerfile,内容示例如下:
FROM openjdk:17-jdk-slim
COPY target/your-app.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
创建 Kubernetes 部署文件(deployment.yaml):
apiVersion: apps/v1
kind: Deployment: springboot-app
spec:
replicas: 2
selector:
matchLabels:
app: springboot-app
template:
app: springboot-app
spec:
containers:
- name: app
image: your-dockerhub/springboot-app:${TAG}
ports:
- containerPort: 8080
Jenkins 流水线脚本
在 Jenkinsfile 中定义 CI/CD 流程:
pipeline {
agent any
environment {
DOCKER_IMAGE = 'your-dockerhub/springboot-app'
KUBE_CONFIG = credentials('k8s-credentials')
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Docker Build & Push') {
steps {
script {
docker.build("${DOCKER_IMAGE}:${env.BUILD_ID}").push()
}
}
}
stage('Deploy to Kubernetes') {
steps {
sh "sed -i 's#\\\${TAG}#${env.BUILD_ID}#g' deployment.yaml"
sh "kubectl apply -f deployment.yaml"
}
}
}
}
流水线优化与扩展
添加测试阶段:在 Build 阶段后插入单元测试和集成测试阶段,使用 sh 'mvn test' 命令执行测试。
实现蓝绿部署:修改 deployment.yaml 为两个 Deployment(blue 和 green),通过 Jenkins 脚本控制流量切换。示例片段:
sh "kubectl apply -f green-deployment.yaml"
sh "kubectl patch svc/springboot-svc -p '{\"spec\":{\"selector\":{\"app\":\"springboot-green\"}}}'"
配置自动回滚:使用 Kubernetes 的 Rollback 功能,在 Jenkins 中检测部署状态,失败时执行:
sh "kubectl rollout undo deployment/springboot-app"
监控与日志集成
在 Kubernetes 部署中添加 Prometheus 监控注解:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
配置 Jenkins 流水线发送部署通知到 Slack 或邮件:
post {
success {
slackSend channel: '#deployments', message: "Deployment succeeded: ${env.BUILD_URL}"
}
failure {
mail to: 'team@example.com', subject: 'Deployment Failed', body: "Check ${env.BUILD_URL}"
}
}
安全加固措施
使用 Kubernetes Secrets 管理敏感信息:
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=1234
在 deployment.yaml 中引用 Secret:
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
通过 Jenkins 的 Credentials Binding 插件注入敏感数据,避免明文出现在流水线脚本中。
BbS.okapop072.sbs/PoSt/1122_843401.HtM
BbS.okapop073.sbs/PoSt/1122_148623.HtM
BbS.okapop074.sbs/PoSt/1122_606921.HtM
BbS.okapop075.sbs/PoSt/1122_586207.HtM
BbS.okapop076.sbs/PoSt/1122_463049.HtM
BbS.okapop077.sbs/PoSt/1122_078806.HtM
BbS.okapop078.sbs/PoSt/1122_096398.HtM
BbS.okapop079.sbs/PoSt/1122_221721.HtM
BbS.okapop080.sbs/PoSt/1122_102975.HtM
BbS.okapop081.sbs/PoSt/1122_938868.HtM
BbS.okapop072.sbs/PoSt/1122_911553.HtM
BbS.okapop073.sbs/PoSt/1122_348396.HtM
BbS.okapop074.sbs/PoSt/1122_534844.HtM
BbS.okapop075.sbs/PoSt/1122_460017.HtM
BbS.okapop076.sbs/PoSt/1122_272621.HtM
BbS.okapop077.sbs/PoSt/1122_436605.HtM
BbS.okapop078.sbs/PoSt/1122_107680.HtM
BbS.okapop079.sbs/PoSt/1122_492143.HtM
BbS.okapop080.sbs/PoSt/1122_312467.HtM
BbS.okapop081.sbs/PoSt/1122_448528.HtM
BbS.okapop072.sbs/PoSt/1122_261350.HtM
BbS.okapop073.sbs/PoSt/1122_554285.HtM
BbS.okapop074.sbs/PoSt/1122_464884.HtM
BbS.okapop075.sbs/PoSt/1122_438903.HtM
BbS.okapop076.sbs/PoSt/1122_807590.HtM
BbS.okapop077.sbs/PoSt/1122_617226.HtM
BbS.okapop078.sbs/PoSt/1122_077744.HtM
BbS.okapop079.sbs/PoSt/1122_731405.HtM
BbS.okapop080.sbs/PoSt/1122_630456.HtM
BbS.okapop081.sbs/PoSt/1122_751525.HtM
BbS.okapop072.sbs/PoSt/1122_920478.HtM
BbS.okapop073.sbs/PoSt/1122_444790.HtM
BbS.okapop074.sbs/PoSt/1122_687929.HtM
BbS.okapop075.sbs/PoSt/1122_819027.HtM
BbS.okapop076.sbs/PoSt/1122_192327.HtM
BbS.okapop077.sbs/PoSt/1122_802007.HtM
BbS.okapop078.sbs/PoSt/1122_295917.HtM
BbS.okapop079.sbs/PoSt/1122_797762.HtM
BbS.okapop080.sbs/PoSt/1122_645794.HtM
BbS.okapop081.sbs/PoSt/1122_617479.HtM
BbS.okapop072.sbs/PoSt/1122_299038.HtM
BbS.okapop073.sbs/PoSt/1122_951514.HtM
BbS.okapop074.sbs/PoSt/1122_330851.HtM
BbS.okapop075.sbs/PoSt/1122_980447.HtM
BbS.okapop076.sbs/PoSt/1122_847009.HtM
BbS.okapop077.sbs/PoSt/1122_106959.HtM
BbS.okapop078.sbs/PoSt/1122_704506.HtM
BbS.okapop079.sbs/PoSt/1122_755734.HtM
BbS.okapop080.sbs/PoSt/1122_029596.HtM
BbS.okapop081.sbs/PoSt/1122_784563.HtM
BbS.okapop072.sbs/PoSt/1122_187332.HtM
BbS.okapop073.sbs/PoSt/1122_675377.HtM
BbS.okapop074.sbs/PoSt/1122_330010.HtM
BbS.okapop075.sbs/PoSt/1122_851702.HtM
BbS.okapop076.sbs/PoSt/1122_014458.HtM
BbS.okapop077.sbs/PoSt/1122_629116.HtM
BbS.okapop078.sbs/PoSt/1122_343228.HtM
BbS.okapop079.sbs/PoSt/1122_157615.HtM
BbS.okapop080.sbs/PoSt/1122_601941.HtM
BbS.okapop081.sbs/PoSt/1122_126127.HtM
BbS.okapop072.sbs/PoSt/1122_641755.HtM
BbS.okapop073.sbs/PoSt/1122_414660.HtM
BbS.okapop074.sbs/PoSt/1122_561390.HtM
BbS.okapop075.sbs/PoSt/1122_908270.HtM
BbS.okapop076.sbs/PoSt/1122_729783.HtM
BbS.okapop077.sbs/PoSt/1122_674292.HtM
BbS.okapop078.sbs/PoSt/1122_615846.HtM
BbS.okapop079.sbs/PoSt/1122_965251.HtM
BbS.okapop080.sbs/PoSt/1122_364973.HtM
BbS.okapop081.sbs/PoSt/1122_703482.HtM
BbS.okapop072.sbs/PoSt/1122_827314.HtM
BbS.okapop073.sbs/PoSt/1122_115021.HtM
BbS.okapop074.sbs/PoSt/1122_416094.HtM
BbS.okapop075.sbs/PoSt/1122_601302.HtM
BbS.okapop076.sbs/PoSt/1122_408268.HtM
BbS.okapop077.sbs/PoSt/1122_296781.HtM
BbS.okapop078.sbs/PoSt/1122_332020.HtM
BbS.okapop079.sbs/PoSt/1122_875428.HtM
BbS.okapop080.sbs/PoSt/1122_689594.HtM
BbS.okapop081.sbs/PoSt/1122_871660.HtM