说明

该文章是使用Jenkins的Kubernetes插件对现有的k8s集群进行编排

前期准备

  • k8s集群环境
  • Jenkins服务

Jenkins安装插件并进行配置

1: 安装 Kubernetes 插件
系统管理 -> 插件管理 -> 可选插件 搜索 kubernetes
插件相关信息:https://plugins.jenkins.io/kubernetes/#plugin-content-windows-support
在这里插入图片描述

2:添加k8s凭证
系统管理 -> Mange Credentials

在这里插入图片描述

添加凭证:需要pfx证书,也就是 k8s-master 节点上的\root\.kube\config文件里面的内容
生成pfx证书步骤:

  • 把config文件内的key为:certificate-authority-data内容拷贝的certificate-authority-data文件然后生成ca.crt文件

    cat certificate-authority-data | base64 -d > ca.crt
    
  • 把config文件内的key为:client-certificate-data 内容拷贝的client-certificate-data 文件然后生成client.crt文件

    cat client-certificate-data | base64 -d > client.crt
    
    
  • 把config文件内的key为:client-key-data 内容拷贝的client-key-data 文件然后生成client.key文件

    cat client-certificate-data | base64 -d > client.crt
    
    
  • 生成pfx证书 [需要输入密码]

    openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
    
    
  • Jenkins添加该凭证
    在这里插入图片描述

3:配置 Clouds
系统管理 -> 节点管理 -> Configure Clouds
在这里插入图片描述

添加完内容可以测试是否连接成功

4:模板配置

  • pod配置
    在这里插入图片描述

  • 相关容器配置 这里使用他们的配置也可以,我觉得添麻烦直接把yaml文件的内容粘贴进去了,效果一样
    在这里插入图片描述

这里是使用的自己做的镜像也可以使用官网提供的镜像详见:https://hub.docker.com/r/mirantis/jnlp-slave/tags

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: jnlp
      workingDir: C:\\Users\\docker\\Documents\\workspace\\build-v2\\common\\hr_sysdiag-app-50
      image: 192.168.3.227:8090/win_build/hr_agent_build:v1
  nodeSelector:
    kubernetes.io/os: windows
  hostAliases:
    - ip: "192.168.1.52"
      hostnames:
        - "dev.huorong.cn"
  dnsPolicy: None
  dnsConfig:
    nameservers: [ "114.114.114.114" ]
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local
    options:
      - name: ndots
        value: "5" 

5:测试

创建流水线任务

pipeline{
    agent{
        node {
            label 'build-tool'
        }
    }
    stages{
        stage('Deploy to Kubernetes'){
            steps{
                script{
                     powershell 'ping www.baidu.com'
                }
            }
        }
    }
}

window编译模板相关配置

模板名称:window-build-pod
命名空间: default  #也可以用其他的命名空间
标签列表:window-build-pod #最好跟模板名称一直, pod为特殊字符,因为编译那边的groovy代码中是根据这个pod判断是否把项目拷贝到容器中

在这里插入图片描述

yaml 内容配置

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: jnlp
      image: 192.168.3.227:8090/win_build/hr-jenkins-agent:base
      volumeMounts:
        - mountPath: C:\data
          name: build-volume
  nodeSelector:
    kubernetes.io/os: windows
  volumes:
    - name: build-volume
      hostPath:
        path: C:\data
        type: Directory
  hostAliases:
    - ip: "192.168.1.52"
      hostnames:
        - "dev.huorong.cn"
    - ip: "192.168.1.200"
      hostnames:
        - "pub.huorong.cn"
        - "git.huorong.cn"
    - ip: "192.168.1.71"
      hostnames:
        - "gitlab.huorong.cn"
  dnsPolicy: None
  dnsConfig:
    nameservers: [ "114.114.114.114" ]
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local
    options:
      - name: ndots
        value: "5"

相关说明:

containers:容器的相关配置
	name: jnlp #必须使用 “jnlp” 使用该名称是要覆盖原有的配置
	image:192.168.3.227:8090/win_build/hr-jenkins-agent:base  #该镜像是自己根据window的jnlp镜像做的一个适合自己业务的镜像内部有vs2019编译工具
	volumeMounts:#挂载相关配置  主要是把宿主机上的app源码映射到容器中,方便把代码拷贝到代理的目录中
	 - name: build-volume
      hostPath:
        path: C:\data
        type: Directory

相关问题处理

问题描述:当启动的pod的下拉git代码并更新相关子模块时老是卡住,当时jnlp镜像里面的git版本是2.26,是git版本比较低导致的。
解决方式有两种:
1:换一个jnlp高版本的镜像

2:配置Jenkins全局git工具

注:需要安装git client 插件 ,然后再全局工具配置上配置git 工具
压缩包的地址:https://github.com/git-for-windows/git/releases/download/v2.38.0.windows.1/MinGit-2.38.0-64-bit.zip 可以使用github上的发布版,也可以把zip文件放到自己的服务器,使用github.com的话不稳定

在这里插入图片描述

git将安装在tools\git\mingw64中的每个代理上 git可执行文件的路径是tools\git\mingw64\bin\git.exe

参考文档: https://plugins.jenkins.io/git-client/

3: GITSCM配置

注: GITSCM的gitTool一定要配置,与上一步的git可执行文件的路径一致:tools\git\mingw64\bin\git.exe

pipeline{
    agent{
        node {
            label 'w-build-pod'
        }
    }
    parameters {
        string(name: 'GIT_REPO', trim: true)
    }
    stages{
        stage('Deploy to Kubernetes'){
            steps{
                script{
                   dir(GIT_REPO){
                        // 代理中含有 pod 则说明该代理是从k8s中进行编排运行的,需要把对应的项目从挂载盘中copy到代理的工作目录中
                        def projectName = GIT_REPO
                        bat "xcopy C:\\data\\$projectName\\*  .\\ /Y /E /H "
                        //tool.checkout(config['git'], params.GIT_BRANCH_OR_TAG, params.GIT_CREDENTIALS)
                        checkout (
                            changelog:true,
                            scm: [
                                $class: 'GitSCM',
                                branches: [[name: "rc5.0.71.0"]],
                                doGenerateSubmoduleConfigurations: false,
                                extensions: [
                                    [
                                        $class: 'SubmoduleOption',
                                        disableSubmodules: false,
                                        recursiveSubmodules: true,
                                        trackingSubmodules: false,
                                        reference: '',
                                        timeout: 10,
                                        parentCredentials: true
                                    ]
                                ],
                                userRemoteConfigs: [[
                                    credentialsId: "compiler",
                                    url: "git@gitlab.huorong.cn:hr50/hr_sysdiag-app-50.git"
                                ]],
                                gitTool: "tools\\git\\mingw64\\bin\\git.exe"
                            ]
                        )
                    }
                }
            }
        }
     //检测当前git提交版本是否编译过,编译过就不重复编译
        stage('CheckTag') {
            steps {
                script {
                    echo "checkout 完成"
                    //powershell 'sleep 99999'
                }
            }
        }
    }
}

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐