• Jenkins链接Kubernetes集群


    Jenkins CI/CD介绍

           持续构建与发布是我们工作中必不可少的一个步骤,目前大多公司都采用Jenkins集群来搭建符合需求的CI/CD流程,然而传统的Jenkins Slave一主多从方式会存在一些痛点,比如:主 Master 发生单点故障时,整个流程都不可用了;每个Slave的配置环境不一样,具有比较大的差异性,这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲;资源分配不均衡,有的Slave要运行的job出现排队等待,而有的Slave处于空闲状态;最后资源有浪费,每台Slave可能是实体机或者V,当 Slave 处于空闲状态时,也不会完全释放掉资源。
           由于传统的Jenkins具有上述痛点,因此我们希望有一种更优秀更合理的方式来完成CI/CI流程。容器化技术的产生给我们带来了希望,Docker容器可以很好的对Slave节点的环境进行封装,解决掉每个Slave配置差异化的问题。而Kubernetes容器管理平台又可以很好的解决资源分配不均匀的问题。示意图如下:

            从图中可以看到:Master节点和Slave节点都以容器的方式运行,而不是固定在某一台服务器上,大大的增加了CI/CD的健壮性。本文为了简化Master节点的搭建难度,并没有将Master节点部署到集群当中,而是单独部署在另一台服务器上,以容器的方式运行。CI/CD的大致流程是:jenkins的Master节点触发任务运行,任务触发kubernetes创建Pod,Pod里面会运行Slave容器,Slave容器链接Master进行具体的处理流程。

    安装Jenkins的Master节点

    # 1.拉取镜像
    docker pull jenkins/jenkins
    
    # 2.启动命令
    docker run -itd -p 9090:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always  -v /jenkins:/var/jenkins_home jenkins/jenkins:latest
    #
    --privileged=true 使得container内的root拥有真正的root权限
    #
    --restart=always 服务器重启时会自动启动容器
    # 3.查看网页登录需要的Password 
    docker exec jenkins
    cat /var/jenkins_home/secrets/initialAdminPassword

    Jenkins链接kubernetes集群

    第一步:安装kubernetes插件

    管理员账户登录Jenkins Master页面,点击 “系统管理” —> “插件管理” —> “可选插件” —> “Kubernetes plugin” 勾选安装即可。

    第二步:网页配置(重点)

    安装完毕后,点击 “系统管理” —> “系统设置” —> “新增一个云” —> 选择 “Kubernetes”,然后填写Kubernetes和Jenkins配置信息。

    图中黑色部分比较简单,红色部分较难,需要单独说明。名称字段随意填写即可;kubernetes地址填写的是kubernetes集群apiserver的地址,注意是https协议;证书和凭据在下面说明,可以通过点击连接测试按钮,查看是否连接成功;jenkins地址填写访问jienkins的网页地址即可。

    生成证书和凭据

    # 1.在kubernetes的master节点上安装生成证书的文件
    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x cfssl_linux-amd64 && mv cfssl_linux-amd64 /usr/local/bin/cfssl
    
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x cfssljson_linux-amd64 && mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x cfssl-certinfo_linux-amd64 && mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
    
    # 2. 生成json文件
    cat >> admin-csr.json <<EOF
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "hangzhou",
          "L": "XS",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 3.生成以下三个文件:admin.csr admin-key.pem admin.pem
    cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes admin-csr.json | cfssljson -bare admin
    
    # 4.生成pkc格式证书jenkins-admin.pfx
    openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:secret
    
    # 5.查看凭证(全部复制,包括起始和结束两行)
    cat /etc/kubernetes/pki/ca.crt

    添加凭据

    输入密码 secret,后面的内容可以不填写,点击添加

    环境搭建也可参考博客:https://www.cnblogs.com/xiao987334176/p/11338827.html

    Jenkins上配置pipline任务,测试环境搭建是否成功

    pipeline {
      agent any
      
      stages {
        stage("one") {
          agent {
            kubernetes {
              yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  name: test1
                spec:
                  containers:
                    - name: busybox
                      image: 192.168.1.9:5000/busybox1:latest
                      command:
                      - cat
                      tty: true
              """
            }
          }
          
          steps{
            container("busybox") {
              sh """
                echo "first step"
                hostname
              """
            }
          
          }
        }
        
        stage("two") {
          agent {
            kubernetes {
              yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  name: test1
                spec:
                  containers:
                    - name: busybox
                      image: 192.168.1.9:5000/busybox2:latest
                      command:
                      - cat
                      tty: true
              """
            }
          }
          
          steps{
            container("busybox") {
              sh """
                echo "two step"
                hostname
              """
            }
          
          }
        }
      }
    }

    如上述代码:一共包含两步,分别使用的是不同的镜像,随机运行在集群的某一个节点上,可以通过parallel实现并行,大大减少运行的时间。可以参考 https://testerhome.com/topics/22280 进行原理性理解,主要部分如下图所示。

  • 相关阅读:
    day4
    day3
    day2
    day1
    结对开发
    开课博客
    个人课程总结
    学习进度条-第八周
    学习进度条-第七周
    Fooks 电梯演讲
  • 原文地址:https://www.cnblogs.com/chusiyong/p/12852475.html
Copyright © 2020-2023  润新知