Jenkins 使用 Kubernetes Plugin 完成持续构建与发布
介绍
基于Kubernetes和Jenkins来实现CI/CD。 所有需要跑任务的jenkins slave(pod)通过模版动态创建,当任务执行结束自动删除。
系统整体架构
job流程
环境
kubernets
jenkins配置
jenkins-deployment.yaml
apiVersion: "apps/v1beta1"
kind: "Deployment"
metadata:name: "jenkins"labels:name: "jenkins"
spec:replicas: 1template:metadata:name: "jenkins"labels:name: "jenkins"spec:containers:- name: jenkinsimage: jenkinsci/jenkins:2.154imagePullPolicy: IfNotPresentvolumeMounts:- name: jenkins-homemountPath: /var/jenkins_homeenv:- name: TZvalue: Asia/Shanghaiports:- containerPort: 8080 name: web- containerPort: 50000name: agentvolumes:- name: jenkins-homenfs:path: "/nfs/jenkins/data"server: "cpu029.hogpu.cc"terminationGracePeriodSeconds: 10serviceAccountName: jenkins
jenkins-account.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:name: jenkins---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: jenkins
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","watch"]
- apiGroups: [""]resources: ["secrets"]verbs: ["get"]
- apiGroups: [""]resources: ["configmap"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:name: jenkins
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: jenkins
subjects:
- kind: ServiceAccountname: jenkins
jenkins-service.yaml
kind: Service
apiVersion: v1
metadata:labels:k8s-app: jenkinsname: jenkins
spec:type: NodePortports:- port: 8080name: webtargetPort: 8080- port: 50000name: agenttargetPort: 50000selector:name: jenkins
说明
说明一下:这里 Service 我们暴漏了端口 8080 和 50000,8080 为访问 Jenkins Server 页面端口,50000 为创建的 Jenkins Slave 与 Master 建立连接进行通信的默认端口,如果不暴露的话,Slave 无法跟 Master 建立连接。这里使用 NodePort 方式暴漏端口,并未指定其端口号,由 Kubernetes 系统默认分配,当然也可以指定不重复的端口号(范围在 30000~32767)
创建jenkins
接下来,通过 kubectl 命令行执行创建 Jenkins Service。$ kubectl create namespace kubernetes-plugin
$ kubectl config set-context $(kubectl config current-context) --namespace=kubernetes-plugin
$ kubectl create -f jenkins-deployment.yaml
$ kubectl create -f jenkins-account.yaml
$ kubectl create -f jenkins-service.yaml
ps:
创建一个新的 namespace 为 kubernetes-plugin,并且将当前 context 设置为 kubernetes-plugin namespace 这样就会自动切换到该空间下。
查看状态
jianyu.tian@yz-gpu-k8s004 ~]$ kubectl get deployment,svc,pods
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/jenkins 1 1 1 1 1hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/jenkins NodePort 10.106.235.91 <none> 8080:31051/TCP,50000:30545/TCP 2hNAME READY STATUS RESTARTS AGE
po/jenkins-64564fc5c9-pzlpb 1/1 Running 0 1h
ps:
Jenkins Master 服务已经启动起来了,并且将端口暴漏到 8080:31051,50000:30545,此时可以通过浏览器打开 http://<Cluster_IP>:30645 访问 Jenkins 页面了。
jenkins web界面初始化
1.主要对jenkins-plugin插件做说明
安装完毕后,点击 “系统管理” —> “系统设置” —> “新增一个云” —> 选择 “Kubernetes”,然后填写 Kubernetes 和 Jenkins 配置信息。
ps:
Name 处默认为 kubernetes,也可以修改为其他名称,如果这里修改了,下边在执行 Job 时指定 podTemplate() 参数 cloud 为其对应名称,否则会找不到,cloud 默认值取:kubernetes
Kubernetes URL 处我填写了 https://kubernetes.default.sv... 这里我填写了 Kubernetes Service 对应的 DNS 记录,通过该 DNS 记录可以解析成该 Service 的 Cluster IP,或者直接填写外部 Kubernetes 的地址 https://<ClusterIP>:<Ports>。
Jenkins URL 处我填写了 http://jenkins.kubernetes-plugin:8080,跟上边类似,也是使用 Jenkins Service 对应的 DNS 记录,不过要指定为 8080 端口,因为我们设置暴漏 8080 端口。同时也可以用 http://<ClusterIP>:<Node_Port>
配置完毕,可以点击 “Test Connection” 按钮测试是否能够连接的到 Kubernetes,如果显示 Connection test successful 则表示连接成功,配置没有问题。
测试
创建一个 Pipeline 类型 Job:
pipeline {agent any//并行操作stages {stage("test_all") {parallel {stage("python3-cuda9.2") {agent {kubernetes {label 'mxnet-python3-cuda9'yaml """
apiVersion: "v1"
kind: "Pod"
metadata:labels:name: "mxnet-python3-cuda9"
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: hobot.workasoperator: Invalues:- gpu- key: kubernetes.io/nvidia-gpu-nameoperator: Invalues:- TITAN_Vcontainers:- name: mxnetoneimage: docker.hobot.cc/dlp/mxnetci:runtime-py3.6-cudnn7.3-cuda9.2-centos7imagePullPolicy: Alwaysresources:limits:nvidia.com/gpu: 1
"""}}stages {stage("拉取代码") {steps {container("mxnetone") {checkout([$class: 'GitSCM', branches: [[name: 'nnvm']], browser: [$class: 'Phabricator', repo: 'rMXNET', repoUrl: ''], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false]],submoduleCfg: [],userRemoteConfigs: [[credentialsId: 'zhaoming_private', url: '']]]) }}}stage("编译") {steps {container("mxnetone") {sh """nvidia-smisource /root/.bashrcmake depsecho -e "USE_PROFILER=1\nUSE_GLOG=0\nUSE_HDFS=0" >> ./make/config.mksed -i "s#USE_CUDA_PATH = /usr/local/cuda-8.0#USE_CUDA_PATH = /usr/local/cuda-9.2#g" ./make/config.mkmake lintmake -j 12ln -s /home/data ./make test | tee unittest.log"""}}}stage("单元测试") {steps {container("mxnetone") {sh """cp -rf python/mxnet ./cp -f lib/libmxnet.so mxnet/echo "-------Running tests under Python3-------"python3 -Vpython3 `which nosetests` tests/python/trainpython3 `which nosetests` -v -d tests/python/unittest"""}}}}}stage("python2-cuda9.2") {agent {kubernetes {label 'mxnet-python2-cuda9'yaml """
apiVersion: "v1"
kind: "Pod"
metadata:labels:name: "mxnet-python2-cuda9"
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: hobot.workasoperator: Invalues:- gpu- key: kubernetes.io/nvidia-gpu-nameoperator: Invalues:- TITAN_Vcontainers:- name: mxnettwoimage: docker.hobot.cc/dlp/mxnetci:runtime-cudnn7.3-cuda9.2-centos7imagePullPolicy: Alwaysresources:limits:nvidia.com/gpu: 1
"""}}stages {stage("拉取代码") {steps {container("mxnettwo") {checkout([$class: 'GitSCM', branches: [[name: 'nnvm']], browser: [$class: 'Phabricator', repo: 'rMXNET', repoUrl: ''], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false]],submoduleCfg: [],userRemoteConfigs: [[credentialsId: 'zhaoming_private', url: '']]])}}}stage("编译") {steps {container("mxnettwo") {sh """nvidia-smipip2 install numpy==1.14.3 -i https://mirrors.aliyun.com/pypi/simple/source /root/.bashrcmake depsecho -e "USE_PROFILER=1\nUSE_GLOG=0\nUSE_HDFS=0" >> ./make/config.mksed -i "s#USE_CUDA_PATH = /usr/local/cuda-8.0#USE_CUDA_PATH = /usr/local/cuda-9.2#g" ./make/config.mkmake lintmake -j 12ln -s /home/data ./make test | tee unittest.log"""}}}stage("单元测试") {steps {container("mxnettwo") {sh """cp -rf python/mxnet ./cp -f lib/libmxnet.so mxnet/echo "-------Running tests under Python2-------"python2 -Vpython2 `which nosetests` tests/python/trainpython2 `which nosetests` -v -d tests/python/unittest"""}}}}}}}}
}
文档
https://github.com/jenkinsci/...
Jenkins 使用 Kubernetes Plugin 完成持续构建与发布相关推荐
- 基于Jenkins + Tomcat 的安卓客户端可持续化构建及发布下载(loltube.cn)
2019独角兽企业重金招聘Python工程师标准>>> 一. Jenkins 可持续化构建环境请参考 文章 http://my.oschina.net/long0419/blog/1 ...
- git连接jenkins_基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下!
作者 | 刘春明 责编 | Carol 出品 | CSDN 云计算(ID:CSDNcloud) 封图| CSDN下载于视觉中国 目前公司为了降低机器使用成本,对所有的AWS虚拟机进行了盘点,发现利用率 ...
- 基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下!
作者 | 刘春明,责编 | Carol 出品 | CSDN 云计算(ID:CSDNcloud) 封图 | CSDN下载于视觉中国 目前公司为了降低机器使用成本,对所有的AWS虚拟机进行了盘点,发现利用 ...
- 你公司的虚拟机还闲着?基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下!...
作者 | 刘春明 责编 | Carol 出品 | CSDN 云计算(ID:CSDNcloud) 封图| CSDN下载于视觉中国 目前公司为了降低机器使用成本,对所有的AWS虚拟机进行了盘点,发现利用率 ...
- Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务
Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务
- CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台
构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台 CI/CD是什么? 持续集成(CI)/持续交付(CD)的优势 自动化部署流程图 Git Github Gi ...
- Jenkins配合git构建持续构建流程
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 理解CI CI(Continuous Integration)翻译成持续集成,是指在源代码 ...
- 267. 使用Spinnaker结合Jenkins持续构建
文章目录 使用Spinnaker结合Jenkins持续构建 1. Spinnaker创建应用集 2. 创建Pipeline 3. 创建Jenkins构建 使用Spinnaker结合Jenkins持续构 ...
- 【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
嘉宾介绍 黄文俊 有容云资深系统架构师 主要负责容器云平台产品架构及设计. 8年工作经验, 有着企业级存储, 云计算解决方案相关理解. 关注于微服务设计思考, 开发流程优化, docker及kuber ...
最新文章
- 如何制作启动盘安装ubuntu系统
- LA 2659 poj 3076 zoj 3122 Sudoku(精确覆盖 + DLX)
- JavaScript实现判断整数是否为2的幂isPowerOfTwo算法(附完整源码)
- android 代码添加图片不显示,Android开发 从代码里设置Drawable图片不显示的问题
- java 修改最大nio连接数_携程基于Quasar协程的NIO实践
- 博客园项目开发中的难点
- 新荣耀员工现金补偿最高可拿 N+5;天津立法禁止采集人脸识别信息;IntelliJ IDEA 新版发布|极客头条...
- junit不启用事务_JUnit禁用启用测试
- C++程序设计原理与实践(第二版)思考题答案
- Java 绘制图标(饼状图)JFreeChart快速通过Java创建图表
- 批改网复制粘贴_如何使用批改网组织线上考试
- 6.CCS新建工程及配置
- 我的计算机连不上键盘,键盘插上电脑却没反应怎么解决?
- golang中零停机重启服务之套接字复用,endless
- 使用python完成知乎模拟登陆
- MySQL怎样通过Adjacency List存储树形结构?
- springboot返回时间有错解决方案
- 通过adb录制视频并通过FFMPEG将MP4转换成GIF格式(二)
- python语音合成需要的库_语音合成的几种方案实现与分析
- 三方法简单解除任务管理器被禁用
热门文章
- 一文看尽飞桨PaddlePaddle最新升级:5大优势,更低门槛使用深度学习
- Spring源码阅读 源码环境搭建(一)
- MySQL · 捉虫动态 · show binary logs 灵异事件
- dedecms后台左侧菜单500错误怎么处理
- php之常用字符串方法
- 如何在awk中引用外部变量
- 《领域模型》——通过重构得到更深层次的理解
- ubuntu安装时N卡黑屏处理
- display none 隐藏后怎么显示_web前端入门到实战:元素显示隐藏的9种思路
- rs485调试软件_【乐创“芯”说】你想知道的RS485