Jenkins 在 Kubernetes 上的实践,你会了吗?

云计算
Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。

[[403811]]

本文转载自微信公众号「问其」,作者陈少文。转载本文请联系问其公众号。

 1. 配置较大的 -Xms -Xmx 参数

Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。

为了避免频繁的 STW,同时增大并发量,建议设置较大的堆,-Xms3g -Xmx6g -XX:MaxRAM=6g。具体数值可以根据监控值来设置,Java Full GC 之后,内存占用会陡降。

2. request 不要设置太小

request 设置太小,可能会导致 Jenkins 运行起来之后,节点资源不足,引发驱逐,甚至压垮节点。

request 应该接近真实值,如果有足够的机器资源,应该配置亲和性,让 Jenkins 尽可能运行在单独的机器上。request >= 1.25 * JVM 最大堆内存,limit >= 2 * JVM 最大堆内存。

3. IO 性能不能差

Jenkins 使用磁盘文件存储数据,每条流水线、每次构建都会占用一个文件目录,产生大量文件。通常流水线数量有限,但在构建历史达到 10000+ 级别时,会感受到 IO 对 Jenkins 的影响。

如果使用本地存储,推荐使用高性能的 SSD。如果是使用网络存储,需要高性能的网络支持,同时加大客户端的缓存池。

4. 较大的 jenkins_home 的磁盘空间

磁盘满时,Jenkins 将不能工作,在 Jenkins 后台会有错误提示。

建议对 Jenkins 的工作目录进行磁盘使用率监控,并配置告警规则。如果没有监控告警系统,那么建议直接设置一个较大的磁盘空间给 /var/jenkins_home 目录。因为有一些 Storage Class 不支持动态扩容,当磁盘满时,就只能手动拷贝了。

5. 使用 Kubernetes plugin 在 Kuberntes 上构建

基于物理机、虚拟机的构建,增加了运维成本、限制了并发的数量。

使用 Kubernetes plugin 插件在 Kubernetes 上进行构建能充分利用云原生易扩展、易维护的优势,进行大规模的构建。参考: 在 Kubernetes 上动态创建 Jenkins Slave,https://www.chenshaowen.com/blog/creating-jenkins-slave-dynamically-on-kubernetes.html) 。由于构建比较占用资源,为了避免对集群的影响,可以配置亲和性,将构建 Pod 集中到指定的节点执行。

6. 使用 CasC 管理 Jenkins 的配置

通过 Jenkins 页面进行各种构建、安全等配置,不仅繁琐、不易维护,而且不能够复用。

使用 CasC 插件,允许用户将 Jenkins 的配置,通过文本的形式进行描述,还可以放置到 Git 仓库中进行版本管理。

  1. jenkins: 
  2.   securityRealm: 
  3.     ldap: 
  4.       configurations: 
  5.         - groupMembershipStrategy: 
  6.             fromUserRecord: 
  7.               attributeName: "memberOf" 
  8.           inhibitInferRootDN: false 
  9.           rootDN: "dc=acme,dc=org" 
  10.           server: "ldaps://ldap.acme.org:1636" 
  11.  
  12.   nodes: 
  13.     - permanent: 
  14.         name"static-agent" 
  15.         remoteFS: "/home/jenkins" 
  16.         launcher: 
  17.           jnlp: 
  18.             workDirSettings: 
  19.               disabled: true 
  20.               failIfWorkDirIsMissing: false 
  21.               internalDir: "remoting" 
  22.               workDirPath: "/tmp" 
  23.  
  24.   slaveAgentPort: 50000 
  25.   agentProtocols: 
  26.     - "jnlp2" 

7. 使用 Custom WAR Packager 打包 Jenkins

在部署一套新的 Jenkins 环境时,会需要安装大量插件,非常影响部署速度,同时插件是否能正常下载也存在不确定性。

Custom WAR Packager 允许用户将 Jenkins 、配置、插件打包成一个完整的 war 包或者镜像。这样无论是开发测试,还是线上部署,都可以很方便的部署,并且环境一致,而用户只需要写一个 yaml 文件。

  1. bundle: 
  2.   groupId: com.dev 
  3.   artifactId: "jenkins" 
  4.   description: "Jenkins Custom With Package" 
  5.   vendor: "Jenkins Project" 
  6. buildSettings: 
  7.   docker: 
  8.     base: jenkins/jenkins:2.277.4 
  9.     tag: shaowenchen/jenkins:2.277.4 
  10.     build: true 
  11. war: 
  12.   groupId: org.jenkins-ci.main 
  13.   artifactId: jenkins-war 
  14.   source: 
  15.     version: 2.277.4 
  16. plugins: 
  17.   - groupId: io.jenkins 
  18.     artifactId: configuration-as-code 
  19.     source: 
  20.       version: "1.47" 
  21. libPatches: 
  22.   - groupId: "org.jenkins-ci.main" 
  23.     artifactId: "remoting" 
  24.     source: 
  25.       git: https://github.com/jenkinsci/remoting.git 
  26. systemProperties: { 
  27.      jenkins.model.Jenkins.slaveAgentPort: "50000"
  28.      jenkins.model.Jenkins.slaveAgentPortEnforce: "true"
  29. groovyHooks: 
  30.   - type: "init" 
  31.     id: "initScripts" 
  32.     source:  
  33.       dir: scripts 
  34. casc: 
  35.   - id: "jcasc-config" 
  36.     source: 
  37.       dir: jenkins.yml 

8. Jenkins Shared Libraries

在使用 Groovy 编写 Pipeline 的过程中,经常会有大量重复代码。

Jenkins 共享库提供函数级别的共享,可以在不同流水线之间复用同一套函数逻辑,对于平台建设、大规模使用场景适用。不仅能加快 Pipeline 编写,还方便维护、平滑升级。

  1. @Library('utils') import org.foo.Utilities 
  2. def utils = new Utilities(this) 
  3. node { 
  4.   utils.mvn 'clean package' 

9. 参考

  • https://www.jenkins.io/zh/doc/book/pipeline/shared-libraries/
  • https://github.com/jenkinsci/configuration-as-code-plugin
  • https://github.com/jenkinsci/custom-war-packager
  • https://zhuanlan.zhihu.com/p/370241822

 

责任编辑:武晓燕 来源: 问其
相关推荐

2022-04-22 08:10:45

云上数据安全

2023-12-07 07:23:39

APIsSDKs

2024-01-30 18:29:29

微服务架构Ingress

2022-07-26 08:03:27

Kubernetes节点磁盘

2024-04-09 13:16:21

Rust命名规范

2022-05-13 08:17:05

HTTPRESTful架构

2022-11-03 08:16:33

MySQL·窗口函数

2024-01-08 07:29:57

多集群模型Istio网络拓扑

2024-01-26 06:05:16

KuberneteseBPF网络

2024-02-02 11:03:11

React数据Ref

2020-11-26 18:30:33

机器学习Kubernetes开发

2023-08-01 12:51:18

WebGPT机器学习模型

2024-01-02 12:05:26

Java并发编程

2023-04-10 09:31:00

路由技术厂商

2016-12-23 09:09:54

TensorFlowKubernetes框架

2022-12-06 08:37:43

2022-04-27 19:05:46

.NETJavaScript接口

2023-01-31 08:02:18

2024-03-06 08:28:16

设计模式Java

2022-09-26 11:03:25

Java反射漏洞
点赞
收藏

51CTO技术栈公众号