首页 云计算

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南

分类:云计算
字数: (1478)
阅读: (8557)
内容摘要:Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南,

在微服务架构中,持续集成和持续部署(CI/CD)至关重要。手动部署 Spring Boot 应用到 Kubernetes 集群不仅耗时,还容易出错。本文将详细介绍如何使用 Jenkins 实现 Spring Boot 应用到 Kubernetes 集群的自动化部署,解决研发效率问题。核心在于如何基于 CI/CD (Jenkins) 将 Spring Boot 应用自动部署到 Kubernetes 集群。

Kubernetes 集群与 Spring Boot 应用准备

首先,我们需要一个可用的 Kubernetes 集群。可以使用 Minikube 在本地搭建,也可以使用阿里云 ACK、腾讯云 TKE 等云服务。确保 kubectl 命令行工具已配置并能连接到集群。 同时需要准备一个简单的 Spring Boot 应用,用于后续的部署演示。

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南

Spring Boot 应用示例

创建一个简单的 Spring Boot 应用,包含一个 RESTful API 接口。使用 Spring Initializr 初始化项目,添加 spring-boot-starter-web 依赖。

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南
// src/main/java/com/example/demo/controller/HelloController.java
package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Kubernetes!";
    }
}

Docker 镜像构建

使用 Dockerfile 将 Spring Boot 应用打包成 Docker 镜像。

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南
# Dockerfile
FROM openjdk:17-jdk-slim

WORKDIR /app

COPY target/*.jar app.jar

CMD ["java", "-jar", "app.jar"]

使用 Maven 构建 Spring Boot 应用并构建 Docker 镜像。

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南
mvn clean package
docker build -t your-dockerhub-username/spring-boot-k8s:latest .
docker push your-dockerhub-username/spring-boot-k8s:latest

Jenkins CI/CD Pipeline 配置

Jenkins 安装与插件安装

安装 Jenkins 并安装以下插件:

  • Kubernetes Continuous Deploy
  • Docker Pipeline
  • Git
  • Maven

创建 Jenkins Pipeline Job

创建一个新的 Jenkins Pipeline Job,并配置 Pipeline 脚本。

// Jenkinsfile
pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git 'your-git-repository-url'
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Docker Build and Push') {
            steps {
                script {
                    def imageName = 'your-dockerhub-username/spring-boot-k8s'
                    def imageTag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                    docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials-id') { // 替换为你的 Docker Hub Credentials ID
                        dockerImage = docker.build(imageName + ':' + imageTag, '.')
                        dockerImage.push()
                    }
                }
            }
        }
        stage('Deploy to Kubernetes') {
            steps {
                script {
                    def imageName = 'your-dockerhub-username/spring-boot-k8s'
                    def imageTag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                    kubernetesDeploy(configs: 'k8s/deployment.yaml,k8s/service.yaml', kubeconfigId: 'your-k8s-config-id', namespace: 'default', substitutions: ['IMAGE_NAME': imageName + ':' + imageTag]) // 替换为你的 Kubernetes 配置 ID
                }
            }
        }
    }
}

Kubernetes 部署文件

创建 Kubernetes Deployment 和 Service 文件。

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-k8s
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-boot-k8s
  template:
    metadata:
      labels:
        app: spring-boot-k8s
    spec:
      containers:
      - name: spring-boot-k8s
        image: IMAGE_NAME # Jenkins 会替换这个变量
        ports:
        - containerPort: 8080
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-k8s-service
spec:
  type: LoadBalancer # 如果在云平台上运行,可以使用 LoadBalancer 类型
  selector:
    app: spring-boot-k8s
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

配置 Jenkins Credentials

  • 配置 Docker Hub Credentials,用于推送 Docker 镜像。
  • 配置 Kubernetes Credentials,用于连接 Kubernetes 集群。可以使用 kubectl config view --flatten --minify 命令获取 kubeconfig 文件内容,然后添加到 Jenkins 中。

实战避坑与经验总结

  • 镜像构建优化: 使用多阶段构建减小镜像体积,可以显著提升部署速度。可以充分利用 Docker 镜像缓存,避免重复下载依赖。在国内环境中,可以配置 Docker Hub 镜像加速器,提升下载速度。
  • Kubernetes 资源配置: 合理配置 Deployment 的 resources.limitsresources.requests,防止应用占用过多资源导致其他应用崩溃。针对高并发场景,可以配置 HPA (Horizontal Pod Autoscaler),实现自动扩容。
  • 健康检查: 为 Spring Boot 应用配置 Readiness 和 Liveness probes,确保 Kubernetes 可以正确检测应用状态。例如,可以使用 Spring Boot Actuator 提供的 /actuator/health 接口作为健康检查 endpoint。
  • 滚动更新策略: Kubernetes 默认的滚动更新策略 (RollingUpdate) 可以在不中断服务的情况下更新应用。可以调整 maxSurgemaxUnavailable 参数,控制更新速度和可用性。
  • 监控与日志: 集成 Prometheus 和 Grafana 监控 Kubernetes 集群和 Spring Boot 应用的性能指标。使用 EFK (Elasticsearch, Fluentd, Kibana) 或 ELK (Elasticsearch, Logstash, Kibana) 收集和分析日志,方便问题排查。
  • 安全加固: 使用 RBAC (Role-Based Access Control) 限制 Jenkins 对 Kubernetes 集群的访问权限。定期更新 Jenkins 和插件,修复安全漏洞。 对于需要加密的配置,可以使用 Kubernetes Secrets 进行管理。可以考虑使用 Istio 等服务网格,实现更精细的流量控制和安全策略。

通过以上步骤,我们可以成功地基于 CI/CD (Jenkins) 将 Spring Boot 应用自动部署到 Kubernetes 集群,提高开发效率和应用可靠性。 同时,合理配置 Kubernetes 集群的资源,能够应对高并发的场景。

Spring Boot 应用 K8s 自动化部署:Jenkins CI/CD 实战指南

转载请注明出处: 加班到秃头

本文的链接地址: http://m.acea2.store/blog/742478.SHTML

本文最后 发布于2026-04-02 21:47:51,已经过了24天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 西红柿鸡蛋面 5 天前
    这篇简直是教科书级别的教程,解决了我的痛点。感谢!
  • 背锅侠 3 天前
    干货满满,学习了!请问kubeconfigId 这个如何获取的?