您的位置:

K8s Jenkins:构建全自动化CI/CD流程

一、介绍K8s Jenkins

Kubernetes(K8s)是一款广泛使用的开源容器管理平台,而Jenkins是一个流行的开源自动化构建工具。将这两个工具结合在一起可以使持续集成/持续部署(CI/CD)更加便捷和高效。K8s Jenkins一般由两部分组成:Jenkins master和Jenkins slave。Jenkins master是用来管理和调度构建任务的,Jenkins slave则是负责运行具体的构建作业。

二、配置K8s Jenkins集群

下面来介绍如何配置一个K8s Jenkins集群。首先,需要创建Jenkins master Pod和service。Pod通常使用官方提供的Docker镜像(如jenkins/jenkins),但也可以根据需求定制镜像。service可以选择ClusterIP或NodePort类型,根据需要暴露服务端口。


apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  selector:
    app: jenkins
  ports:
  - port: 8080
    name: http
  - port: 50000
    name: slave
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins
        ports:
        - containerPort: 8080
        - containerPort: 50000
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-home
        emptyDir: {}

然后需要创建Jenkins slave Pod。由于slave的数量通常较多,建议使用Kubernetes的StatefulSet控制器来管理它们的生命周期。下面是一个示例yaml文件:


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: jenkins-slaves
spec:
  serviceName: jenkins-slaves
  replicas: 3
  selector:
    matchLabels:
      app: jenkins-slave
  template:
    metadata:
      labels:
        app: jenkins-slave
    spec:
      containers:
      - name: jnlp
        image: jenkins/jnlp-slave
        env:
        - name: JENKINS_URL
          value: "http://jenkins:8080"
        volumeMounts:
        - name: jenkins-home
          mountPath: /home/jenkins
      volumes:
      - name: jenkins-home
        emptyDir: {}

三、创建CI/CD流程

在K8s Jenkins中,通常需要执行以下步骤来创建CI/CD流程:

1. 准备构建环境

首先需要确定构建环境是否已经准备好,包括所需的镜像、密钥等内容。如果缺少构建环境,需要使用Kubernetes的Pod或Deployment等控制器来创建它们。

2. 编写Pipeline脚本

Pipeline是Jenkins的扩展插件之一,可以用来编写CI/CD流程。Pipeline通过Groovy脚本实现,可以实现诸如创建Pod、构建镜像、推送镜像等操作。下面是一个简单的Pipeline示例:


pipeline {
    agent {
        kubernetes {
            label 'python'
            defaultContainer 'python'
        }
    }
    environment {
        APP_NAME = 'hello-world'
        REGISTRY = 'docker.io/myuser'
    }
    stages {
        stage('Clone repo') {
            steps {
                git 'https://github.com/myuser/hello-world.git'
            }
        }
        stage('Build image') {
            steps {
                sh 'docker build -t $REGISTRY/$APP_NAME:$BUILD_NUMBER .'
            }
        }
        stage('Push image') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'DOCKER_HUB', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
                    sh "docker login -u $USERNAME -p $PASSWORD"
                }
                sh "docker push $REGISTRY/$APP_NAME:$BUILD_NUMBER"
            }
        }
    }
}

3. 执行Pipeline

当Pipeline脚本编写完成后,可以使用Jenkins UI或者Jenkins REST API来触发流程的执行。Pipeline执行过程中,Jenkins会在Kubernetes集群中创建一系列的Pod和其他资源,以实现CI/CD流程。

四、总结

本文介绍了如何搭建K8s Jenkins集群,并创建CI/CD流程。在Kubernetes的支持下,Jenkins的自动化构建功能被进一步扩展,可以更好地满足企业的CI/CD需求。