引言
Jenkins是一款開源 CI&CD 軟件,用于自動(dòng)化各種任務(wù),包括構(gòu)建、測(cè)試和部署軟件。
本文將Jenkins的master與slave置于Pod中,部署在namespace:jenkins下,jenkins slave 構(gòu)建時(shí),啟動(dòng)slave運(yùn)行代碼克隆,項(xiàng)目構(gòu)建,鏡像構(gòu)建,上傳倉庫等一系列命令。構(gòu)成完成以后刪除pod。也就是Docker In Docker
可直接使用本文提供的編排文件構(gòu)建Jenkins,有通過helm管理kubernetes組件的,可使用本文提供的char。
?搭建不是關(guān)鍵,關(guān)鍵是趟坑。
一、Jenkins搭建
1. helm安裝
請(qǐng)查看作者之前的文章《kubernetes搭建Harbor無坑及多中心Harbor倉庫同步》中helm搭建部分
2. Jenkins搭建
git clone https://github.com/yuenandi/Jenkins.git
這是作者從https://github.com/helm/charts.git單獨(dú)拿出的,由于國內(nèi)helm的Jenkins資源版本過低,沒有選擇使用,便clone了1.6版本。整個(gè)git項(xiàng)目過大,很容易clone失敗,也浪費(fèi)了一些時(shí)間找辦法輕量的下載,為了給小伙伴提供些方便,直接用我git的就好。

直接通過helm安裝Jenkins
kubectl create -f jenkins-pv.yaml
helm install . --debug --namespace jenkins --name jenkins
或
運(yùn)行helm生成jenkins.yaml,生成后刪除jenkins.yaml中無用的部分(不知道有沒有更聰明的辦法用來生成編排文件)
helm install . --debug --dry-run -n jenkins --namespace jenkins --name jenkins |sed 'w jenkins.yaml'
kubectl create -f jenkins-pv.yaml
kubectl create -f jenkins.yaml
查看service/LoadBalancer的NodePort,kubectl get svc -n jenkins,也可以設(shè)置helm的value.yaml,創(chuàng)建ingress來訪問,很簡單就不闡述了

訪問
http://masterIp:43563如圖:
3. kubernetes插件設(shè)置
Manage Jenkins ->Configure System->Cloud->kubernetes

3.1. 非kubernetes部署jenkins,通過以下認(rèn)證(通過本文搭建直接查看3.2. 部分):
1. Kubernetes 地址:
- 如果Jenkins Master部署在Kubernetes之外,則輸入Kubernetes Master API Server URL,可運(yùn)行kubectl cluster-info獲得Kubernetes Master API Server URL
- 本文是部署在Kubernetes上,則輸入Kubernetes域名方式,格式https://<service>.<namespace>.svc.<domain> ,比如https://kubernetes.default.svc.cluster.local,或短名稱https://kubernetes.default
Kubernetes 服務(wù)證書 key:將kubernetes的ca.crt的內(nèi)容填寫到j(luò)enkins kubernetes的Kubernetes server certificate key欄中。
?本文Jenkins Master運(yùn)行在Kubernetes上可跳過此步
生成ca.crt文件,若知道kubernetes的ca.crt位置,不用創(chuàng)建
在Kubernetes Master上,cd ~/.kube/config,運(yùn)行以下命令生成Kubernetes server certificate key,并保存在ca.crt文件中:
echo "<certificate-authority-data>" | base64 -d > ca.crt
2. 憑據(jù):生成cert.pfx上傳到j(luò)enkins
?本文Jenkins Master運(yùn)行在Kubernetes上可跳過此步
- 生成Kubernetes Client P12 Certificate File
在Kubernetes Master上,cd~/.kube/config:# 復(fù)制client-certificate-data的內(nèi)容,運(yùn)行以下命令生成client.crt echo "<client-certificate-data>" | base64 -d > client.crt] # 復(fù)制client-key-data的內(nèi)容,運(yùn)行以下命令生成client.key echo "<client-key-data>" | base64 -d > client.key # 根據(jù)前面步驟生成的ca.crt, client.crt和client.key來生成PKCS12格式的cert.pfx # 以下命令運(yùn)行時(shí),需要輸入4位以上的密碼 openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt將生成的Kubernetes Client P12 Certificate Filecert.pfx復(fù)制到Jenkins Master服務(wù)器上,比如復(fù)制到/var/lib/jenkins/kubernetes_cert/cert.pfx
- 在Jenkins上配置Kubernetes Credential
- 在Jenkins上增加一個(gè)Credential,選擇類型為Certificate
- 選擇“From a PKCS#12 file on Jenkins master”,輸入上面生成的cert.pfx文件在Jenkins Master服務(wù)器上的路徑,比如/var/lib/jenkins/kubernetes_cert/cert.pfx。
- 輸入生成cert.pfx文件時(shí)輸入的密碼
- 輸入一個(gè)有意義的ID,比如kubernetes-cluster
- 輸入有意義的Description
3.2. 安裝本文kubernetes部署jenkins,通過以下認(rèn)證
?若之后環(huán)境的Pod就在jenkins本環(huán)境,不用給予cluster-admin的權(quán)限
#授予serviceaccount 權(quán)限,Jenkins對(duì)kube-apiserver 其他namespace的權(quán)限認(rèn)證
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins
3.3. jenkins地址設(shè)置
由于不是同一namespace下通過域名訪問
- Jenkins 地址:
http://jenkins.jenkins.svc.cluster.local:8080 - Jenkins 通道:
jenkins-agent.jenkins.svc.cluster.local:50000
3.3. 設(shè)置kubernetes Pod Template


最后apply,save
4. Freestykle project
?簡單測(cè)試以下,后續(xù)發(fā)pipeline的使用,從git->jenkins->kuberbetes流水線可先查看Kubernetes+Gitlab+Jenkins構(gòu)建鏡像并創(chuàng)建Pod 還是很詳細(xì)的。
4.1. 創(chuàng)建slave



save or apply
4.2. 啟動(dòng)slave
?如果報(bào)錯(cuò)查看4.3.

項(xiàng)目創(chuàng)建成功

slave的Pod

slave的日志

jenkins的日志

?jnlp-slave會(huì)將項(xiàng)目代碼進(jìn)行拷貝、打包鏡像、上傳倉庫等等一系列任務(wù),我們可以通過命令定制(本文沒有進(jìn)行任何操作),任務(wù)結(jié)束后,pod刪除,主機(jī)消失,在console output 會(huì)看到執(zhí)行結(jié)果:
Console Output
Console Output
可以看到我們之前輸出命令也打印了出來
4.3. 我遇到的報(bào)錯(cuò)處理
jnlp-slave pod創(chuàng)建失敗,會(huì)一直重新創(chuàng)建,查看pod日志,發(fā)現(xiàn)是連接不上jenkins,jenkins日志如下:

- 拋 java.nio.channels.ClosedChannelException 異常的原因是 Jenkins Slave Pod 在 Jenkins Job 運(yùn)行時(shí)突然掛掉,然后 Master Pod 無法和 Slave Pod 進(jìn)行通信。那么解決方法就是找到 Slave Pod 經(jīng)常掛掉的原因,經(jīng)排查是 Slave Pod 的資源限制不合理,配置的 CPU 和內(nèi)存太小,導(dǎo)致 Pod 在運(yùn)行是很容易超出資源限制,然后被 k8s Kill 掉。?也可能是域名或認(rèn)證沒有配置好,具體需要看jnlp-slave和jenkins的日志
- 解決方法
打開 Jenkins 設(shè)置 Slave Pod 模版的資源限制:
Jenkins->系統(tǒng)管理->系統(tǒng)設(shè)置->云->鏡像->Kubernetes Pod Template->Container Template->高級(jí),然后根據(jù)實(shí)際情況調(diào)整 CPU 和內(nèi)存需求。
文中沒有提及的問題,可評(píng)論筆者
!??!手碼不易,對(duì)您有幫助的話,給個(gè)贊呦,且有更多k8s相關(guān)文案?。?!

