基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程

基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程

文章目录


随着容器化和微服务架构的深入发展,企业对持续集成与持续交付(CI/CD)系统的自动化程度、可扩展性与可维护性提出了更高要求。Jenkins 作为主流的 CI/CD 工具,凭借其丰富的插件生态与强大的流水线能力,能够灵活对接各类开发、构建、发布工具链。

在前文中,我们已基于 Kubernetes 成功部署 Jenkins 并实现持久化存储挂载。本篇将进一步聚焦 Jenkins 在 Kubernetes 环境中的流水线实践,介绍如何通过声明式流水线实现代码变更触发、自动构建、镜像制作与推送、以及部署至 Kubernetes 集群的全流程自动化。

一、Jenkins简介

Jenkins 是一款开源的自动化持续集成与持续交付(CI/CD)工具,拥有丰富的插件生态和高度可配置的流水线系统。它能够帮助开发团队实现自动化构建、测试、打包、部署等流程,从而提高开发效率与软件交付质量。

得益于其良好的可扩展性和与主流版本控制、构建工具、容器平台(如 Docker、Kubernetes)的高度兼容,Jenkins 已成为 DevOps 实践中的核心工具之一。通过与 Kubernetes 集成,Jenkins 可以动态调度构建任务至集群中的 Pod 中运行,实现弹性伸缩与资源隔离,适用于构建大规模分布式的 CI/CD 系统。

二、系统架构与环境说明

1. 系统架构

为实现 Jenkins 在 Kubernetes 环境下的自动构建与部署流水线,整体系统架构如下:

  • Kubernetes 集群(CI/CD 编排平台)主机范围:192.168.100.130 ~ 192.168.100.132
  • Docker 主机(镜像构建节点)地址:192.168.100.30
  • GitLab 代码仓库服务器地址:192.168.100.100

当前已部署测试Pod,名字为xxx-7db499bfb8-whjsj,命名空间cicd,使用的镜像版本是hwj:v1.0.5


2. 网络通信与认证准备

由于 Jenkins 需要跨主机访问 Docker,为简化认证过程与保障流水线顺利运行,需配置如下免密通道:

✅ Jenkins Pod → Docker 主机(SSH 免密)

用于将构建产物(如 jar 包)传输到 Docker 主机,并远程执行镜像构建与推送 Harbor 的命令。

✅ Jenkins Pod → Kubernetes 集群(SSH 免密)

用于通过 SSH 远程登录至 Kubernetes 节点主机,执行 kubectl apply -f 命令,实现部署自动化。

bash 复制代码
# 进入Jenkins Pod内部
kubectl exec -it -n cicd jenkins-xxxx -- /bin/bash

# 生成ssh公钥
ssh-keygen -t rsa

# 分发公钥,配置免密
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

三、配置Jenkins凭据

为了让 Jenkins 能够无缝访问 GitLab 仓库、我们需要在 Jenkins 中提前配置好外部系统的认证凭据。Jenkins 凭据统一通过「系统管理 → 凭据管理」进行配置,供流水线任务在运行时调用。

配置凭据


四、Jenkins流水线设计

以下为一个完整的声明式流水线,包含从拉取代码、构建打包、构建镜像、推送 Harbor 到自动部署至 Kubernetes 的全流程

复制代码
pipeline {
    agent any
    environment {
        git_address = "http://192.168.100.100/yw/hwj.git"
        git_auth = "jenkins-to-gitlab"                 // Jenkins中配置的GitLab凭据ID
		docker_build_host = "192.168.100.30"
		k8s_build_host = "192.168.100.130"
        branch_name = "master"
        // BUILD_NUMBER 是 Jenkins 的内置环境变量,代表当前构建的编号(递增)
        // 例如第一次构建为 1,第二次为 2,用于版本号控制
    }
    stages {
        stage('清空工作目录') {
            steps {
                echo '清理工作目录...'
                deleteDir() // 删除当前工作目录的所有内容
            }
        }
        stage('拉取代码'){
            steps{
                checkout([$class: 'GitSCM', branches: [[name: "*/${branch_name}"]],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }
        stage('代码打包'){
            steps{
                sh "mvn -U clean package -Dmaven.test.skip=true"
            }
        }
        stage('传输Jar包到Docker主机') {
            steps {
                sh """
                scp -rp hwj-main/target/hwj-main.jar root@${docker_build_host}:/root/docker-build/hwj/
                """
            }
		}
        stage('Docker主机构建镜像并推送仓库') {
            steps {
                script {
                    sh """
                    ssh root@${docker_build_host} '
                        cd /root/docker-build/hwj &&
                        docker build -t harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER} . &&
                        docker push harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER}
                   	 	'
                    """
                }
            }
        }
		stage('替换镜像并apply到K8s') {
			steps {
				script {
					sh """
					ssh root@${k8s_build_host} '
						sed -i "s|image: harbor.local/k8s/hwj:.*|image: harbor.local/k8s/hwj:v1.0.${BUILD_NUMBER}|g" /root/kubernetes/zhsy/zhsy-deploy.yaml
						kubectl apply -f /root/kubernetes/hwj/hwj-deploy.yaml
					'
					"""
				}
			}
		}
	}
}

再次查看Pod状态,可以看到Pod已经更新,镜像版本变更为hwj:v1.0.8

bash 复制代码
kubectl describe pod -n cicd xxx

总结

🚀 本文详细介绍了在 Kubernetes 环境中,如何基于 Jenkins 搭建完整的自动化构建与部署流水线,涵盖从源代码拉取、Maven 构建、镜像制作、推送 Harbor 到 K8s 自动部署的全过程。

✅ 通过 SSH 免密 + 分层主机职责,将 Jenkins 的构建逻辑高效分发至 Docker 和 Kubernetes 节点,提升了系统可维护性与可扩展性。

相关推荐
hwj运维之路11 分钟前
基于k8s的Jenkins CI/CD平台部署实践(一):Jenkins部署详解
ci/cd·kubernetes·jenkins
AllData公司负责人2 小时前
【能力比对】K8S数据平台VS数据平台
云原生·容器·kubernetes
识途老码2 小时前
k8s部署OpenELB
云原生·容器·kubernetes·eip
Super_man541884 小时前
k8s之ingress解释以及k8s创建业务的流程定义
云原生·容器·kubernetes
木二_5 小时前
实践004-Gitlab CICD部署应用
ci/cd·gitlab·devops
Python测试之道7 小时前
K8s ConfigMap实战:像设置手机一样管理配置!
容器·智能手机·kubernetes
开心码农1号7 小时前
如何理解k8s中的controller
docker·容器·kubernetes
CoderJia程序员甲9 小时前
AI驱动的Kubernetes管理:kubectl-ai 如何简化你的云原生运维
运维·人工智能·云原生·kubernetes·llm
斯普信云原生组10 小时前
Elasticsearch知识汇总之ElasticSearch监控方案
大数据·elasticsearch·jenkins