热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

devops4:Jenkins基于k8scloud和dockercloud动态增减节点

Jenkins管理动态节点上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到j

Jenkins管理动态节点

上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到jenkins master,然后等job执行完毕之后,所加入的agent再自动删除掉,达到一个动态的增删节点效果,使所有的job都在远端的某个集群中执行。

目前执行动态扩缩节点的方式有docker cloud和k8s cloud。


docker cloud配置



  1. 首先需要安装docker插件,系统管理—>插件管理—>可选插件—>搜索docker,主要的有Docker 、docker pipeline插件,其他插件可以酌情下载。



  2. 配置docker守护进程,使其可以通过主机ip+端口的形式访问:

    vi /etc/systemd/system/docker.service

    ExecStart=/usr/bin/dockerd -H fd:// --cOntainerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:8376

    添加此配置后,重新启动docker,主机便会暴露8376端口,供客户端访问,需要注意安全问题,可以通过防火墙等安全设备对端口进行限制,也可以为此端口指定证书,必须有此端口证书和私钥才可以访问成功。



  3. 在Jenkins端配置docker cloud,系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Docker



  4. 配置Docker Cloud details,主要是配置地址+端口,如果有证书则也配置上证书。


    配置完成后,点击后边的Test Connection,显示出docker version 和 Api version后,表示连接成功。




  5. 配置Docker Agent templates,要修改的主要配置为以下几点:



    • Labels:agent的label,用于指定匹配该cloud

    • Name:用于加入Jenkins slave的名字前缀

    • Docker Image:用于创建临时节点的镜像,相当于有job要执行时,会docker run此镜像,然后以slave节点的方式加入到Jenkins Master,并将job在此slave节点执行,执行完毕后,会直接docker rm掉

    • Remote File System Root:临时节点的家目录

    • Connect method:节点的加入方式,一般选用Attach Docker container即可,jenkins master会直接将slave所需的代码复制到此节点中,并用容器内的java启动,所以使用此方式要满足两条硬条件:必须有java环境和container的CMD必须是/bin/bash或者为空

    其他一些不是特别重要的参数,例如:Pull timeout拉取超时时间、Pull strategy拉取策略等可以进行相应的调整。




测试使用docker cloud运行一个Pipeline

以上步骤全部完成之后,docker cloud就可以正常使用,下边创建一个测试流水线:

pipeline {
agent {
label 'java-maven-app'
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
}
tools {
maven 'apache-maven-3.8.6'
}
stages {
stage('mvn version') {
steps {
sh 'mvn -v'
}
}
stage('java version') {
steps {
sh 'java -version'
}
post {
always {
sh 'echo "test complete"'
}
}
}
}
}

开始执行流水线:

可见此流水线在名称为 java-maven-app-001ocj3t66f69 的节点中运行,再去查看节点列表,发现多了一个叫这个名字的节点:

再查看docker容器,发现刚刚运行了一个jenkins/agent的容器:

Pipeline执行完毕后,容器被摧毁,节点也被剔除,实现了动态的docker cloud管理。


Kubernetes Cloud配置



  1. 系统管理->插件管理->可选插件,搜索kubernetes直接安装



  2. k8s插件安装完毕后,开始添加云节点:系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Kubernetes



  3. 配置Kubernetes Cloud details,主要配置名称、k8s apiserver地址、jenkins地址、k8s服务证书以及加密成.pfx类型的证书key:

    apiserver地址和jenkins地址不用强调,都知道怎么填,重点需要强调两个证书:



    • Kubernetes 服务证书 key:这个实际就是你k8s集群的ca.crt证书,一般在/etc/kubernetes/pki/ca.crt,直接copy过来即可

    • 第二个主要是因为k8s apiserver是https的通信方式,所以要将其集群证书的公私钥打包成.pfx类型,然后提供给jenkins来访问

    这里需要手动生成第二个.pfx类型的证书

    (1)首先需要安装证书生成工具:

    # curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    # curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    # curl -s -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    # chmod +x /usr/local/bin/cfssl*

    (2)然后准备证书签名请求

    vi jenkins-csr.json

    {
    "CN": "admin",
    "hosts": [],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "ST": "BeiJing",
    "L": "XS",
    "O": "system:masters",
    "OU": "System"
    }
    ]
    }

    证书请求中的O 指定该证书的 Group 为 system:masters,而 RBAC 预定义的 ClusterRoleBinding 将 Group system:masters 与 ClusterRole cluster-admin 绑定,这就赋予了该证书具有所有集群权限 。


    (3)创建admin证书和私钥

    # cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes jenkins-csr.json | cfssljson -bare admin
    # ls
    admin-key.pem admin.pem jenkins-csr.json

    生成证书与key


    (4)生成.pfx类型证书

    # openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:jenkins
    # ls
    jenkins-admin.pfx

    指定admin的公钥私钥生成jenkins-admin.pfx,并设置密码为jenkins


    (5)将证书添加至jenkins凭证中

    (6)最终再应用到k8s cloud中


    测试连接出现版本号即连接成功




  4. 配置Pod Templates

    主要配置标签和用法以及pod的出事YAML,其他像volume、network或secret等都可以再yaml中提前编写


    有kubernetes-agent标签的job会匹配到此agent



    定义的一个基础YAML模板,可以在里边定义更多的配置


    再就是要定义一下workspace采取什么形式,分别有这几种:


    根据自己需求,需不需要持久化来决定使用哪种方式




  5. 至此基本配置已经完成,还有一点需要注意,当有job要执行时,生成的pod中会有自己定义的一个容器和jenkins用于提供agent连接的容器,共两个,默认情况jenkins agent生成的容器会拉取jenkins/inbound-agent:4.11-1-jdk11这个镜像,可以提前下载下来,或者重新指定一个镜像:




编辑流水线测试使用Kubernetes cloud

新建任务—>pipeline—>拉到最下边选择Pipeline script form SCM—>SCM选择Git—>填写项目的URL及认证

—>指定分支—>指定脚本的路径

这个就表示会直接从你指定的代码仓库中去拉取代码,并根据仓库中指定的Jenkinsfile进行构建,代码仓库结构如下:

指定的Jenkinsfile文件内容如下:

pipeline {
agent {
kubernetes {
cloud 'kubernetes-internal' //指定k8s cloud的名称
label 'kubernetes-agent' //指定label
defaultContainer 'example.com:5000/jenkins/agent:latest' //可以指定运行的镜像,不指定会默认使用配置k8s cloud时的默认镜像
inheritFrom 'jenkins-agent' //指定所用的podTemplate,其实是多余的,因为就算不指定,也会用配置k8s cloud时,配置的pod Template
namespace 'default'
}
tools {
maven 'apache-maven-3.8.6'
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
}
}

执行结果:

以k8s pod为agent的临时节点已经加入:

k8s中pod也已经启动,Pipeline执行结束后,自动摧毁。



推荐阅读
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 无论你是刚毕业的大学生,还是想在职业中寻求进步的经验丰富的IT专家,这些提示都可以帮你成为DevOps工程师。DevOps工程是一个备受称赞的热门职业。不管你是刚毕业正在找第一份工 ... [详细]
  • 关于ScrumXPDevOps的学习
    最近听了ECUG大会上孙敬云老师的分享感觉受益匪浅,毕竟大学课本上只讲到瀑布模型就没有下文了,工作以后一直贯彻的都是Scrum路线,一直也没有时间好好的去学习整理这部分的知识,直到 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • 如何安全有效地强制移除Kubernetes Pod
    在Kubernetes集群管理中,有时需要安全且高效地强制移除Pod以解决故障或进行维护。本文介绍了在遇到难以终止的Pod时,如何通过正确的方法进行强制删除,同时确保不影响集群的稳定性和其他服务的正常运行。通过具体的操作步骤和最佳实践,帮助读者掌握处理此类问题的有效方法。 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
  • Envoy 流量分配策略优化
    在本研究中,我们对Envoy的流量分配策略进行了优化,旨在提高系统的稳定性和性能。实验环境包括一个前端代理服务(Envoy,IP地址为172.31.57.10)和五个后端服务。通过调整Envoy的配置,实现了更高效的流量分发和负载均衡,显著提升了整体系统的响应速度和可靠性。 ... [详细]
  • gitlab+jenkins_gitlab+jenkins+docker
    gitlab+jenkins_gitlab+jenkins+docker ... [详细]
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • Kubernetes部署常见问题及解决方案汇总
    本文汇总了在Kubernetes部署过程中常见的问题及其解决方案,涵盖了从配置错误到网络故障等多个方面,旨在帮助开发人员和运维人员快速定位并解决实际操作中遇到的技术难题。通过详细的案例分析和最佳实践建议,读者可以更好地理解和掌握Kubernetes的部署技巧,提高系统的稳定性和可靠性。 ... [详细]
  • Kubernetes_如何在GO语言中使用Kubernetes API?
    本文由编程笔记#小编为大家整理,主要介绍了如何在GO语言中使用KubernetesAPI?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一步一步打造jenkins+docker+nodejs项目的自动部署环境
    一步一步打造jenkins+docker+nodejs项目的自动部署环境介绍jenkins+docker+nodejs自动部署亮点采用shell自定义脚本,控制集成部署环境更加方便 ... [详细]
author-avatar
mobiledu2502887783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有