3

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

 2 years ago
source link: https://www.cnblogs.com/v-fan/p/16548185.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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,主要是配置地址+端口,如果有证书则也配置上证书。

    1715041-20220803180842146-1514623795.png

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

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

    1715041-20220803180851601-785017438.png

    1715041-20220803180902706-1146152927.png

    • 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"'
                }
            }
        }
    }
}

开始执行流水线:

1715041-20220803181000274-789133350.png

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

1715041-20220803181011477-299941045.png

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

1715041-20220803181022433-1278561466.png

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:

    1715041-20220803181042390-1587892805.png

    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凭证中

    1715041-20220803181103650-1885681693.png

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

    1715041-20220803181112129-278471523.png

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

  4. 配置Pod Templates

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

    1715041-20220803181121314-647042288.png

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

    1715041-20220803181129705-1029623477.png

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

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

    1715041-20220803181139499-1386961978.png

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

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

    1715041-20220803181148478-1017635210.png

编辑流水线测试使用Kubernetes cloud

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

1715041-20220803181159610-1902802085.png

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

1715041-20220803181207761-360620090.png

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

1715041-20220803181216615-984833134.png

指定的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'
            }
        }
    }
}

执行结果:

1715041-20220803181225862-1589338271.png

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

1715041-20220803181236074-245999901.png

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

1715041-20220803181245896-525677312.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK