• devops-4:Jenkins基于k8s cloud和docker cloud动态增减节点


    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】一文认识IO操作流
    lark 发送图片消息
    linux内核基本知识一
    Fully Convolutional Networks for Semantic Segmentation--论文笔记
    软考 系统架构设计师系列知识点之边缘计算(1)
    微信朋友圈全新玩法,轻松互动,引爆你的社交圈
    python基础复习-基本语法元素
    【管理运筹学】第 10 章 | 排队论(3,标准的 M/M/1 排队系统)
    vuex详解
    python把ChestX-Det-Dataset的json样本转为COCO数据集的json格式
  • 原文地址:https://www.cnblogs.com/v-fan/p/16548185.html