本节我们通过在Kubernetes集群上创建并配置Jenkins Server实现应用开发管理的CI/CD流程,并且利用Kubernetes-Jenkins-Plugin实现动态的按需扩展jenkins-slave。
安装Kubernetes集群
首先,如果您没有Kubernetes集群,那么您需要创建一个。
安装Jenkins Server
为了让您的Jenkins Server可以具有Fail Over的能力,建议您将Jenkins的数据存储到阿里云NAS存储上。
步骤一:
首先您需要连接到Kubernetes集群。
步骤二:创建NAS持久化卷
然后,创建一个Kubernetes持久化NAS存储卷。
假设您已经在阿里云控制台上面创建了您自己的NAS存储,其挂载点为:yournas-xxxx.cn-hangzhou.nas.aliyuncs.com。
执行下面的命令下载一个persistent volume模板,替换里面的server的值为您的挂载点,然后执行kubectl apply -f pv.yml创建持久化NAS卷。
root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fpersistent-volume.yml > pv.yml
root@iZbp:~/jenkins# vi pv.yml
root@iZbp:~/jenkins# kubectl apply -f pv.yml
root@iZbp:~/jenkins# kubectl get pv -n ci
步骤三:创建Jenkins Server
通过以下命令启动一个Jenkins Server。该命令会创建一个阿里云公网SLB,方便您从公网访问jenkins服务。如果不需要公网访问请将Service的type更改为NodePort。
root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fjenkins.yml > jenkins.yml
root@iZbp:~/jenkins# kubectl apply -f jenkins.yml
root@iZbp:~/jenkins# kubectl get po -n ci
root@iZbp:~/jenkins# kubectl get svc -n ci
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins 172.19.0.10 40.112.120.10 53/UDP,53/TCP 34m
然后通过地址http://40.112.120.10
访问jenkins服务.
步骤四: 配置jenkins
访问上面的jenkins地址http://40.112.120.10
,如下图:
需要使用token来初始化jenkins,该token文件存在于secrets/initialAdminPassword
下,您需要手动挂载NAS到本地目录后查看token内容。使用以下命令,将yournas-xxxx.cn-hangzhou.nas.aliyuncs.com
替换成您自己的挂载点:
root@iZbp:~/jenkins# mkdir -p mnt
root@iZbp:~/jenkins# mount.nfs yournas-xxxx.cn-hangzhou.nas.aliyuncs.com:/ mnt
root@iZbp:~/jenkins# cat mnt/secrets/initialAdminPassword
7b48377b16ef49a8ba678031dd12111a
注意: 如果提示未找到mount.nfs命令,则需要先安装nfs-utils包。
将上面输出的token粘贴到界面上输入框进入下一步:
这里选择安装插件,由于连接国外的网络问题,ant插件不一定能下载成功,建议您先去掉ant插件安装,然后点下一步等待安装完成。
然后设置用户名和密码。
现在您已经成功的创建了一个jenkins server.
步骤五: 配置Kubernetes-jenkins-plugin实现dynamic slaves provision.
安装Kubernetes-plugin
首先进入插件管理页面【系统管理】->【管理插件】->【可选插件】,搜索kubernetes plugin
,勾选要安装的插件,然后点击【直接安装】。
然后勾选安装后重启,等待重启完成后kubernetes-plugin就安装完成了。
配置jenkins kubernetes-plugin插件
单击【系统管理】-> 【系统设置】,找到【云】,然后点击【新增一个云】
这样就配置好了kubernetes-plugin, 可以实现动态jenkins-slaves in pod.
Jenkins CI示例
新建一个Pipeline任务。
然后将下面的内容粘贴到pipeline Script里面,保存。
podTemplate(label: 'golang-pod', containers: [
containerTemplate(
name: 'golang',
image: 'registry.cn-hangzhou.aliyuncs.com/spacexnice/golang:1.8.3-docker',
ttyEnabled: true,
command: 'cat'
),
containerTemplate(
name: 'jnlp',
image: 'registry.cn-hangzhou.aliyuncs.com/google-containers/jnlp-slave:alpine',
args: '${computer.jnlpmac} ${computer.name}',
command: ''
)
]
,volumes: [
/*persistentVolumeClaim(mountPath: '/home/jenkins', claimName: 'jenkins', readOnly: false),*/
hostPathVolume(hostPath: '/root/work/jenkins', mountPath: '/home/jenkins'),
hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock'),
hostPathVolume(hostPath: '/tmp/', mountPath: '/tmp/'),
])
{
node ('golang-pod') {
container('golang') {
git url: 'https://github.com/spacexnice/blog.git' , branch: 'code'
stage('Build blog project') {
sh("make")
}
}
}
}
最后单击开始构建,通过构建日志观察任务的执行情况,你会发现Jenkins Server会通过Kubernetes启动一个Pod作为jenkins slave执行构建Pipeline。
小结
通过kubernetes-jenkins-pipline插件,您可以方便的在阿里云Kubernetes集群上配置按需启动的jenkins-slave,动态资源占用,按需扩展,可以极大的提高系统的资源利用率及可扩展性。
阿里云容器服务团队致力于在阿里云上推广容器技术。想了解更多容器服务内容,请访问阿里云容器服务