一、介绍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需求。