《玩转Jenkins系列》之集成K8S

前言*序

今天这篇Topic主要讲一下如何在Jenkins里面与K8S进行深度融合。目标只有一个:

动态创建编译机,提升编译集群资源利用效率

配置篇

系统管理菜单下面如下图

k8s jenkins jnlp 构建失败 jenkins整合k8s_Pod

说明:

  • 名称可以随意取。这个为后续的时候用到
  • Jenkins地址,请填写Jenkins服务器访问地址
  • 配置完了之后点连接测试,如果提示"Connection test successful"说明连接到集群上了

上面K8S的地址什么的都没有配置为什么就连接成功了?好奇的看官肯定会有疑问了。
『The URL of the Kubernetes API server. If not set the connection options will be autoconfigured from service account or kube config file.』 在这里我们用了kube配置文件来完成这个事情的。
登录Jenkins服务所在的容器内将APIserver的连接配置kube/config配置文件放到~/.kube/config。这样它就会自动去完成连接了。

使用篇

现在连接上了K8S了那我们先创建一个非常简单的流水线,里面就输出一条:"hello jenkins and k8s"
a)先创建一条流水线的任务

k8s jenkins jnlp 构建失败 jenkins整合k8s_Pod_02

b) 我们选择用Jenkinsfile的方式

k8s jenkins jnlp 构建失败 jenkins整合k8s_Pod_03

c) 编写Jenkinfiles文件

pipeline {
  agent {
    kubernetes {
      label 'mypodx'
      cloud 'yaofang_k8s_test'
      yamlFile 'mpod.yaml'
    }
  }
  stages {
    stage('git clone') {
        steps {
                git credentialsId: '3b1cd500-c1a2-4bd6-84f0-237b0c879fbf', url: '${url}'
        }
    }

    stage('hold') {
        agent none
        steps {
                input "Does the staging environment look ok?"
         }
    }

    stage('Run containers shell') {
      steps {
        sh '/root/bin/git.sh ${url}'
      }
    }

  }
}

说明:

  • cloud 表示我们在上面配置的名称进行关联
  • yamlFile 表示通过yaml来创建Pod
    以下是创建Pod的描述文件:
metadata:
  labels:
    some-label: some-label-value
spec:
  volumes:
  - hostPath:
      path: /data/mvn_cache
      type: ""
    name: mvn-cache
  containers:
  - name: jnlp
    alwaysPullImage: true
    volumeMounts:
    - mountPath: /root/repository
      name: mvn-cache
    image: registry.cn-shanghai.aliyuncs.com/cpaas/build_dockerfile:v5
    env:
    - name: CONTAINER_ENV_VAR
      value: jnlp

说明:

  • 通过volumes可以将宿主机的目录挂载到容器内,实现对maven编译场景下的加速
  • images这个镜像是我们自定义镜像,可以用于构建自己想的编译运行环境.

d) 运行流水线
先看下K8S上面的POD变化

k8s jenkins jnlp 构建失败 jenkins整合k8s_运维_04

可以看到出来了一个POD。

再来看下流水线控制台的输出

k8s jenkins jnlp 构建失败 jenkins整合k8s_Pod_05

最佳实践

基于镜像的实践,可以针对编译机的镜像做更多的扩展。比如可以集成docker工具/OSS工具等。另外针对maven编译机的加速问题也可以进一步优化,可以将.m2下面的文件放到宿主机上去,这样可以提升编译速度。

最佳实践之解决git权限方案

如果我们直接在镜像中运行一个shell脚本的话,我们会发现git clone代码的时候会报权限不足。解决办法

  1. 将宿主机的/root/.ssh/目录挂载到Pod的容器里面即共享公钥文件
  2. 将宿主机的公钥配置到GIT仓库
    类似的启动如下:
docker run -itd  -v /root/.ssh/:/root/.ssh/ -v /tmp/build_maven/:/root/repository/