Jenkins master位于k8s集群外,实现jenkins slave的动态构建

一、简述

Jenkins基于"kubernetes plugin"与k8s集成,可以使Jenkins slave以pod的形式在k8s集群内部动态构建、运行、销毁等。

通过 jenkinsci/kubernetes-plugin 了解到,Jenkins master既可以运行在k8s集群内,也可运行在k8s集群外,但是Jenkins slave的整个生命周期都是在k8s集群内,并且通过JNLP与Jenkins master连接。

要想Jenkins master在k8s运行,我们必须提前创建StatefulSet、Service、Ingress、ServiceAccount等系列yaml文件进行部署;而实际Jenkins master在生产中先于k8s使用并已独立运行,如果再次在K8S内部部署,那么我们还需进行迁移,增加了工作量。既然"kubernetes plugin"支持Jenkins master在k8s集群外部,那么就不必要再在k8s中创建了

下面我们就来详细介绍下jenkins master位于k8s集群外,实现jenkins slave的动态构建,其中有很多细节问题牵扯到docker、k8s的使用问题,我们一一讲解。

二、前期准备

1、搭建k8s

     利用kubeadm搭建k8s集群环境,参考链接:https://www.cnblogs.com/deny/p/12242755.html

2、搭建外部Jenkins

      1)安装Jenkins master

       参考链接:https://www.cnblogs.com/deny/p/10121001.html

三、配置 Jenkins master

     1 、安装 kubernetes plugin 插件

        

    2  、kubernetes plugin与k8s连接配置

          1)添加kubernetes云
               Manager Jenkins-----Manage Nodes and Clouds -------Configure Clouds -----Add a new cloud

  

 这里连接k8s认证方式有两种,请参考链接https://www.cnblogs.com/deny/p/13848781.html

3、配置jenkins master

  • Jenkins 地址:Jenkins master的地址。
  • Jenkins 通道:Jenkins slave通过此通道与Jenkins master连接,注意此为tcp连接,不要加上http

4、创建slave挂载PV和pvc

我们在master创建nfs主目录,但是在主目录下通过子目录对k8s中的服务提供存储,这样可以通过子目录对所有服务的资源进行隔离。这里我们主要创建workspace和m2目录,分别用作于Jenkins slave的workspace以及maven插件目录

在master创建目录,并配置nfs。(nfs的搭建方式请参考:https://www.cnblogs.com/deny/p/10254093.html

[root@k8s-master data]# mkdir -p /data/nfs/{workspace,m2}
[root@k8s-master data]# cat /etc/exports
/data/nfs *(rw,no_root_squash,no_all_squash,sync)
[root@k8s-master data]# service nfs start
Redirecting to /bin/systemctl start nfs.service
[root@k8s-master data]# exportfs -rv
exporting *:/data/nfs

创建pv和pvc

[root@k8s-master yaml]# cat jenkins-slave-workspace-pv.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-slave-workspace
spec:
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.0.211
    path: /data/nfs/workspace

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-slave-workspace
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
[root@k8s
-master yaml]# cat jenkins-slave-m2-pv.yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-slave-m2 spec: persistentVolumeReclaimPolicy: Recycle capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: server: 192.168.0.211 path: /data/nfs/m2 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-slave-m2 spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi

[root@k8s-master yaml]# kubectl create -f jenkins-slave-workspace-pv.yaml
persistentvolume/jenkins-slave-workspace created
persistentvolumeclaim/jenkins-slave-workspace created

[root@k8s-master yaml]# kubectl create -f jenkins-slave-m2-pv.yaml
persistentvolume/jenkins-slave-m2 created
persistentvolumeclaim/jenkins-slave-m2 created

 

5、配置 pod template 和  container template

k8s中最小单元为pod,在此我们定义Jenkins slave所在pod的信息。

  • 名称:pod名称,在k8s中实际名称为jenkins-slave-随机值。
  • 标签列表:此处标签即标识Jenkins agent的,如流水线中agent定义调度在哪个slave上运行。当然此处我们也可不配置,kubernetes plugin将会默认使用jenkins/jnlp-slave:alpine镜像创建。但是kubernetes-plugin官方已停止维护此镜像,而统一使用jenkins/inbound-agent。因此我们需要进行重新设置。 名称:pod中容器的名称,注意此处必须设置为jnlp,才能对镜像重写使用jenkins/inbound-agent,否则将会出现以下问题:k8s同时拉取jenkins/inbound-agentjenkins/jnlp-slave:alpine两个镜像,第一个为重写后的实际使用镜像,第二个为默认镜像,导致jenkins-slave无法正常运行,不断重复构建。
  • Docker镜像:当名称设置为jnlp后,jenkins/inbound-agent即为重写后的镜像,否则默认使用jenkins/jnlp-slave:alpine
  • 工作目录:Jenkins slave的默认工作目录,构建时将会在此目录下创建workspace。
  • 运行的命令和命令参数: 其中运行的命令必须要留空,否则会重写镜像的默认entrypoint,导致agent 无法连接到master,下面我们会进行演示说明。
  • 资源限制:默认的容器是没有资源限制的,我们在此添加了cpu和memory限制,大家可根据实际情况进行修改。

 四、使用Jenkins slave构建mave项目

 1、重构Jenkins-slave镜像

这里重新构建jenkins/inbound-agent镜像,添加maven,并修改插件源为华为源,Dockerfile如下:

先修改maven的插件源

[root@192 jenkins]# tar -xf apache-maven-3.6.3-bin.tar.gz
[root@192 jenkins]# cd apache-maven-3.6.3/
[root@192 apache-maven-3.6.3]# ls
bin  boot  conf  lib  LICENSE  NOTICE  README.txt
[root@192 apache-maven-3.6.3]#

conf/settings.xml文件中的mirrors节点中添加如下内容:

<mirror>
    <id>huaweicloud</id>
    <mirrorOf>*</mirrorOf>
    <url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>

修改后重命名目录,并重新打成tar包

[root@192 jenkins]# mv apache-maven-3.6.3 maven3.6
[root@192 jenkins]# tar -czf maven3.6.tar.gz maven3.6/
[root@192 jenkins]# ls
apache-maven-3.6.3-bin.tar.gz  maven3.6  maven3.6.tar.gz

Dockerfile如下:

FROM 192.168.0.217:5000/library/inbound-agent:latest
USER root
ADD maven3.6.tar.gz /usr/local
RUN ln -s /usr/local/maven3.6/bin/mvn /usr/local/bin
USER jenkins

 

posted @ 2020-10-20 19:51  流年晕开时光  阅读(2434)  评论(1编辑  收藏  举报