摘要:所有需要跑任務(wù)的通過模版動態(tài)創(chuàng)建,當(dāng)任務(wù)執(zhí)行結(jié)束自動刪除。同時也可以用配置完畢,可以點(diǎn)擊按鈕測試是否能夠連接的到,如果顯示則表示連接成功,配置沒有問題。
介紹
基于Kubernetes和Jenkins來實(shí)現(xiàn)CI/CD。 所有需要跑任務(wù)的jenkins slave(pod)通過模版動態(tài)創(chuàng)建,當(dāng)任務(wù)執(zhí)行結(jié)束自動刪除。
系統(tǒng)整體架構(gòu) job流程 環(huán)境kubernets
jenkins配置jenkins-deployment.yaml
apiVersion: "apps/v1beta1" kind: "Deployment" metadata: name: "jenkins" labels: name: "jenkins" spec: replicas: 1 template: metadata: name: "jenkins" labels: name: "jenkins" spec: containers: - name: jenkins image: jenkinsci/jenkins:2.154 imagePullPolicy: IfNotPresent volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home env: - name: TZ value: Asia/Shanghai ports: - containerPort: 8080 name: web - containerPort: 50000 name: agent volumes: - name: jenkins-home nfs: path: "/nfs/jenkins/data" server: "cpu029.hogpu.cc" terminationGracePeriodSeconds: 10 serviceAccountName: 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.io kind: Role name: jenkins subjects: - kind: ServiceAccount name: jenkins
jenkins-service.yaml
kind: Service apiVersion: v1 metadata: labels: k8s-app: jenkins name: jenkins spec: type: NodePort ports: - port: 8080 name: web targetPort: 8080 - port: 50000 name: agent targetPort: 50000 selector: name: jenkins說明
說明一下:這里 Service 我們暴漏了端口 8080 和 50000,8080 為訪問 Jenkins Server 頁面端口,50000 為創(chuàng)建的 Jenkins Slave 與 Master 建立連接進(jìn)行通信的默認(rèn)端口,如果不暴露的話,Slave 無法跟 Master 建立連接。這里使用 NodePort 方式暴漏端口,并未指定其端口號,由 Kubernetes 系統(tǒng)默認(rèn)分配,當(dāng)然也可以指定不重復(fù)的端口號(范圍在 30000~32767)
創(chuàng)建jenkins接下來,通過 kubectl 命令行執(zhí)行創(chuàng)建 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:
創(chuàng)建一個新的 namespace 為 kubernetes-plugin,并且將當(dāng)前 context 設(shè)置為 kubernetes-plugin namespace 這樣就會自動切換到該空間下。查看狀態(tài)
jianyu.tian@yz-gpu-k8s004 ~]$ kubectl get deployment,svc,pods NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/jenkins 1 1 1 1 1h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/jenkins NodePort 10.106.235.918080:31051/TCP,50000:30545/TCP 2h NAME READY STATUS RESTARTS AGE po/jenkins-64564fc5c9-pzlpb 1/1 Running 0 1h
ps:
Jenkins Master 服務(wù)已經(jīng)啟動起來了,并且將端口暴漏到 8080:31051,50000:30545,此時可以通過瀏覽器打開 http://jenkins web界面初始化:30645 訪問 Jenkins 頁面了。
1.主要對jenkins-plugin插件做說明
安裝完畢后,點(diǎn)擊 “系統(tǒng)管理” —> “系統(tǒng)設(shè)置” —> “新增一個云” —> 選擇 “Kubernetes”,然后填寫 Kubernetes 和 Jenkins 配置信息。
ps:
Name 處默認(rèn)為 kubernetes,也可以修改為其他名稱,如果這里修改了,下邊在執(zhí)行 Job 時指定 podTemplate() 參數(shù) cloud 為其對應(yīng)名稱,否則會找不到,cloud 默認(rèn)值取:kubernetes
Kubernetes URL 處我填寫了 https://kubernetes.default.sv... 這里我填寫了 Kubernetes Service 對應(yīng)的 DNS 記錄,通過該 DNS 記錄可以解析成該 Service 的 Cluster IP,或者直接填寫外部 Kubernetes 的地址 https://
Jenkins URL 處我填寫了 http://jenkins.kubernetes-plugin:8080,跟上邊類似,也是使用 Jenkins Service 對應(yīng)的 DNS 記錄,不過要指定為 8080 端口,因?yàn)槲覀冊O(shè)置暴漏 8080 端口。同時也可以用 http://
配置完畢,可以點(diǎn)擊 “Test Connection” 按鈕測試是否能夠連接的到 Kubernetes,如果顯示 Connection test successful 則表示連接成功,配置沒有問題。
測試創(chuàng)建一個 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.workas operator: In values: - gpu - key: kubernetes.io/nvidia-gpu-name operator: In values: - TITAN_V containers: - name: mxnetone image: docker.hobot.cc/dlp/mxnetci:runtime-py3.6-cudnn7.3-cuda9.2-centos7 imagePullPolicy: Always resources: 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-smi source /root/.bashrc make deps echo -e "USE_PROFILER=1 USE_GLOG=0 USE_HDFS=0" >> ./make/config.mk sed -i "s#USE_CUDA_PATH = /usr/local/cuda-8.0#USE_CUDA_PATH = /usr/local/cuda-9.2#g" ./make/config.mk make lint make -j 12 ln -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 -V python3 `which nosetests` tests/python/train python3 `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.workas operator: In values: - gpu - key: kubernetes.io/nvidia-gpu-name operator: In values: - TITAN_V containers: - name: mxnettwo image: docker.hobot.cc/dlp/mxnetci:runtime-cudnn7.3-cuda9.2-centos7 imagePullPolicy: Always resources: 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-smi pip2 install numpy==1.14.3 -i https://mirrors.aliyun.com/pypi/simple/ source /root/.bashrc make deps echo -e "USE_PROFILER=1 USE_GLOG=0 USE_HDFS=0" >> ./make/config.mk sed -i "s#USE_CUDA_PATH = /usr/local/cuda-8.0#USE_CUDA_PATH = /usr/local/cuda-9.2#g" ./make/config.mk make lint make -j 12 ln -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 -V python2 `which nosetests` tests/python/train python2 `which nosetests` -v -d tests/python/unittest """ } } } } } } } } }文檔
https://github.com/jenkinsci/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/27636.html
摘要:嘗試運(yùn)行腳本發(fā)生了的錯誤。錯誤信息接下來就是,天的調(diào)查,關(guān)于這個錯誤的能查到的資料幾乎沒有,也嘗試了很多方法,無果非常煎熬。問題解決了參考文檔初試使用完成持續(xù)構(gòu)建與發(fā)布集群安全配置 背景 為了使用Kubernetes管理并自動化部署應(yīng)用程序,領(lǐng)導(dǎo)糾結(jié)了幾個同事搭了一個Kubernetes集群環(huán)境。不過,為了減少復(fù)雜度,采用了非官方推薦的方式: API Server使用http方式 不...
摘要:對測試的影響讓單元測試運(yùn)行的更順暢單元測試驅(qū)動開發(fā)是一個很好的應(yīng)用程序開發(fā)方式,單元測試往往也是和代碼一起被提交到代碼倉庫中。但是很多單元測試通常依賴于很多其他服務(wù),而這些服務(wù)的標(biāo)準(zhǔn)化配置往往是一個難點(diǎn),如數(shù)據(jù)庫的搭建防火墻的配置等。 傳統(tǒng)的軟件開發(fā)、測試、運(yùn)維需要三個團(tuán)隊(duì)在三個不同的環(huán)境中進(jìn)行,而三個環(huán)境的不同引發(fā)了很多的問題。如:工作內(nèi)容的重復(fù);開發(fā)環(huán)境中可運(yùn)行的程序在測試和運(yùn)維環(huán)...
摘要:基于年底或年初沒有推廣的現(xiàn)狀,唯品會部門目前已經(jīng)做了兩年的時間。唯品會現(xiàn)狀唯品會目前線上有一千多個域,每個域之間相互的依賴比較復(fù)雜,每次的部署發(fā)布困難。這是唯品會的架構(gòu),主要包含持續(xù)集成和持續(xù)部署。 數(shù)人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實(shí)錄第三更來啦。唯品會是數(shù)人云Meetup的老朋友,去年曾做過RPC服務(wù)框架和Mesos容器化的分享。本次分享中,...
摘要:集成測試完成后,由運(yùn)維同學(xué)從發(fā)起一個到分支,此時會會運(yùn)行單元測試,構(gòu)建鏡像,并發(fā)布到預(yù)發(fā)布環(huán)境測試人員在預(yù)發(fā)布環(huán)境下再次驗(yàn)證功能,團(tuán)隊(duì)做上線前的其他準(zhǔn)備工作運(yùn)維同學(xué)合并,將為本次發(fā)布的代碼及鏡像自動打上版本號并書寫,同時發(fā)布到生產(chǎn)環(huán)境。 云原生 (Cloud Native) 是伴隨的容器技術(shù)發(fā)展出現(xiàn)的的一個詞,最早出自 Pivotal 公司(即開發(fā)了 Spring 的公司)的一本技術(shù)小...
摘要:集成測試完成后,由運(yùn)維同學(xué)從發(fā)起一個到分支,此時會會運(yùn)行單元測試,構(gòu)建鏡像,并發(fā)布到預(yù)發(fā)布環(huán)境測試人員在預(yù)發(fā)布環(huán)境下再次驗(yàn)證功能,團(tuán)隊(duì)做上線前的其他準(zhǔn)備工作運(yùn)維同學(xué)合并,將為本次發(fā)布的代碼及鏡像自動打上版本號并書寫,同時發(fā)布到生產(chǎn)環(huán)境。 云原生 (Cloud Native) 是伴隨的容器技術(shù)發(fā)展出現(xiàn)的的一個詞,最早出自 Pivotal 公司(即開發(fā)了 Spring 的公司)的一本技術(shù)小...
閱讀 1094·2021-09-22 15:19
閱讀 1710·2021-08-23 09:46
閱讀 2233·2021-08-09 13:47
閱讀 1412·2019-08-30 15:55
閱讀 1420·2019-08-30 15:55
閱讀 1980·2019-08-30 15:54
閱讀 2804·2019-08-30 15:53
閱讀 718·2019-08-30 11:03