基于k8s的Jenkins CI/CD平臺部署實踐(二):流水線構建與自動部署全流程
文章目錄
- 基于k8s的Jenkins CI/CD平臺部署實踐(二):流水線構建與自動部署全流程
- 一、Jenkins簡介
- 二、系統架構與環境說明
- 1. 系統架構
- 2. 網絡通信與認證準備
- 三、配置Jenkins憑據
- 四、Jenkins流水線設計
- 總結
隨著容器化和微服務架構的深入發展,企業對持續集成與持續交付(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 命令,實現部署自動化。
# 進入Jenkins Pod內部
kubectl exec -it -n cicd jenkins-xxxx -- /bin/bash# 生成ssh公鑰
ssh-keygen -t rsa# 分發公鑰,配置免密
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.30
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.130
三、配置Jenkins憑據
為了讓 Jenkins 能夠無縫訪問 GitLab 倉庫、我們需要在 Jenkins 中提前配置好外部系統的認證憑據。Jenkins 憑據統一通過「系統管理 → 憑據管理」進行配置,供流水線任務在運行時調用。
配置憑據
四、Jenkins流水線設計
以下為一個完整的聲明式流水線,包含從拉取代碼、構建打包、構建鏡像、推送 Harbor 到自動部署至 Kubernetes 的全流程
pipeline {agent anyenvironment {git_address = "http://192.168.100.100/yw/hwj.git"git_auth = "jenkins-to-gitlab" // Jenkins中配置的GitLab憑據IDdocker_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.yamlkubectl apply -f /root/kubernetes/hwj/hwj-deploy.yaml'"""}}}}
}
再次查看Pod狀態,可以看到Pod已經更新,鏡像版本變更為hwj:v1.0.8
kubectl describe pod -n cicd xxx
總結
🚀 本文詳細介紹了在 Kubernetes 環境中,如何基于 Jenkins 搭建完整的自動化構建與部署流水線,涵蓋從源代碼拉取、Maven 構建、鏡像制作、推送 Harbor 到 K8s 自動部署的全過程。
? 通過 SSH 免密 + 分層主機職責,將 Jenkins 的構建邏輯高效分發至 Docker 和 Kubernetes 節點,提升了系統可維護性與可擴展性。