Jenkins 在 Kubernetes 上的實踐
Jenkins 是由 Java 編寫的編排引擎,在 Full GC 時會 Stop The World(STW)。在大規模構建時,STW 可能會導致 Jenkins 無法處理新的請求。
為了避免頻繁的 STW,同時增大併發量,建議設定較大的堆,-Xms3g -Xmx6g -XX:MaxRAM=6g。具體數值可以根據監控值來設定,Java Full GC 之後,記憶體佔用會陡降。
request 設定太小,可能會導致 Jenkins 執行起來之後,節點資源不足,引發驅逐,甚至壓垮節點。
request 應該接近真實值,如果有足夠的機器資源,應該配置親和性,讓 Jenkins 儘可能執行在單獨的機器上。request >= 1.25 * JVM 最大堆記憶體,limit >= 2 * JVM 最大堆記憶體。
Jenkins 使用磁碟檔案儲存資料,每條流水線、每次構建都會佔用一個檔案目錄,產生大量檔案。通常流水線數量有限,但在構建歷史達到 10000+ 級別時,會感受到 IO 對 Jenkins 的影響。
如果使用本地儲存,推薦使用高效能的 SSD。如果是使用網路儲存,需要高效能的網路支援,同時加大客戶端的快取池。
磁碟滿時,Jenkins 將不能工作,在 Jenkins 後臺會有錯誤提示。
建議對 Jenkins 的工作目錄進行磁碟使用率監控,並配置告警規則。如果沒有監控告警系統,那麼建議直接設定一個較大的磁碟空間給 /var/jenkins_home 目錄。因為有一些 Storage Class 不支援動態擴容,當磁碟滿時,就只能手動複製了。
基於物理機、虛擬機器的構建,增加了運維成本、限制了併發的數量。
使用 Kubernetes plugin 外掛在 Kubernetes 上進行構建能充分利用雲原生易擴充套件、易維護的優勢,進行大規模的構建。參考: 在 Kubernetes 上動態建立 Jenkins Slave,https://www.chenshaowen.com/blog/creating-jenkins-slave-dynamically-on-kubernetes.html) 。由於構建比較佔用資源,為了避免對叢集的影響,可以配置親和性,將構建 Pod 集中到指定的節點執行。
透過 Jenkins 頁面進行各種構建、安全等配置,不僅繁瑣、不易維護,而且不能夠複用。
使用 CasC 外掛,允許使用者將 Jenkins 的配置,透過文字的形式進行描述,還可以放置到 Git 倉庫中進行版本管理。
jenkins: securityRealm: ldap: configurations: - groupMembershipStrategy: fromUserRecord: attributeName: "memberOf" inhibitInferRootDN: false rootDN: "dc=acme,dc=org" server: "ldaps://ldap.acme.org:1636" nodes: - permanent: name: "static-agent" remoteFS: "/home/jenkins" launcher: jnlp: workDirSettings: disabled: true failIfWorkDirIsMissing: false internalDir: "remoting" workDirPath: "/tmp" slaveAgentPort: 50000 agentProtocols: - "jnlp2"
在部署一套新的 Jenkins 環境時,會需要安裝大量外掛,非常影響部署速度,同時外掛是否能正常下載也存在不確定性。
Custom WAR Packager 允許使用者將 Jenkins 、配置、外掛打包成一個完整的 war 包或者映象。這樣無論是開發測試,還是線上部署,都可以很方便的部署,並且環境一致,而使用者只需要寫一個 yaml 檔案。
bundle: groupId: com.dev artifactId: "jenkins" description: "Jenkins Custom With Package" vendor: "Jenkins Project" buildSettings: docker: base: jenkins/jenkins:2.277.4 tag: shaowenchen/jenkins:2.277.4 build: true war: groupId: org.jenkins-ci.main artifactId: jenkins-war source: version: 2.277.4 plugins: - groupId: io.jenkins artifactId: configuration-as-code source: version: "1.47" libPatches: - groupId: "org.jenkins-ci.main" artifactId: "remoting" source: git: systemProperties: { jenkins.model.Jenkins.slaveAgentPort: "50000", jenkins.model.Jenkins.slaveAgentPortEnforce: "true"} groovyHooks: - type: "init" id: "initScripts" source: dir: scripts casc: - id: "jcasc-config" source: dir: jenkins.yml
在使用 Groovy 編寫 Pipeline 的過程中,經常會有大量重複程式碼。
Jenkins 共享庫提供函式級別的共享,可以在不同流水線之間複用同一套函式邏輯,對於平臺建設、大規模使用場景適用。不僅能加快 Pipeline 編寫,還方便維護、平滑升級。
@Library('utils') import org.foo.Utilities def utils = new Utilities(this) node { utils.mvn 'clean package' }
- https://github.com/jenkinsci/custom-war-packager
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2777466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nvidia-docker2 在 Kubernetes 上實踐Docker
- kubernetes實踐之三十二:Jenkins和SonarQube整合Jenkins
- kubernetes實踐之二十九:Kubernetes+Harbor+Gitlab+Jenkins+Maven DevOpsGitlabJenkinsMavendev
- LoadBalancer在kubernetes架構下的實踐架構
- Kubernetes在宜信落地實踐
- Native Flink on Kubernetes 在小紅書的實踐
- 基於jenkins+kubernetes的cicd流程實踐一:環境搭建及方案原理Jenkins
- 使用Devtron在Kubernetes上實現GitOpsdevGit
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇SpringGCCloud
- kubernetes實踐之七十:Istio之流量管理(上)
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(可灰度)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 診斷(線上聯調)SpringGCCloud
- Jenkins的Pipeline指令碼在美團餐飲SaaS中的實踐Jenkins指令碼
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(工具部署)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)SpringGCCloud
- 使用Kubernetes-Jenkins實現CI/CDJenkins
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(可監控)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(可回滾)SpringGCCloud
- VPGAME 的 Kubernetes 遷移實踐GAM
- VPGAME的Kubernetes遷移實踐GAM
- Apache SkyWalking在windows機器上的實踐ApacheWindows
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)SpringGCCloud
- Spring Cloud 應用在 Kubernetes 上的最佳實踐 — 高可用(混沌工程)SpringCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(容量評估)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(優雅上下線)SpringGCCloud
- Kubernetes監控實踐
- Serverless Kubernetes 落地實踐Server
- Kubernetes Deployment 最佳實踐
- 建木在 Rainbond 上使用實踐AI
- 在GCP的Kubernetes上安裝daprGC
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(彈性伸縮)SpringGCCloud
- 華為雲的Kubernetes實踐之路
- kubernetes實踐之六十:Cabin-Manage Kubernetes
- 在大規模 Kubernetes 叢集上實現高 SLO 的方法
- kubernetes實踐之十一:EFK
- Kubernetes 微服務最佳實踐微服務
- 2023年Kubernetes最佳實踐
- Kubernetes 最佳安全實踐指南