Jenkins是一款開源 CI&CD 軟件,用於自動化各類任務,包括構建、測試和部署軟件。
本文將Jenkins的master與slave置於Pod中,部署在namespace:jenkins下,jenkins slave 構建時,啓動slave運行代碼克隆,項目構建,鏡像構建,上傳倉庫等一系列命令。構成完成之後刪除pod。也就是Docker In Docker
可直接使用本文提供的編排文件構建Jenkins,有經過helm管理kubernetes組件的,可以使用本文提供的char。
️搭建不是關鍵,關鍵是趟坑。java
請查看做者以前的文章《kubernetes搭建Harbor無坑及多中心Harbor倉庫同步》中helm搭建部分git
git clone https://github.com/yuenandi/Jenkins.git
這是做者從https://github.com/helm/charts.git
單獨拿出的,因爲國內helm的Jenkins資源版本太低,沒有選擇使用,便clone了1.6版本。整個git項目過大,很容易clone失敗,也浪費了一些時間找辦法輕量的下載,爲了給小夥伴提供些方便,直接用我git的就好。
直接經過helm安裝Jenkinsgithub
kubectl create -f jenkins-pv.yaml helm install . --debug --namespace jenkins --name jenkins
或
運行helm生成jenkins.yaml,生成後刪除jenkins.yaml中無用的部分(不知道有沒有更聰明的辦法用來生成編排文件)shell
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
,也能夠設置helm的value.yaml,建立ingress來訪問,很簡單就不闡述了
訪問http://masterIp:43563
如圖:
api
Manage Jenkins ->Configure System->Cloud->kubernetes
服務器
1. Kubernetes 地址:app
- 若是Jenkins Master部署在Kubernetes以外,則輸入Kubernetes Master API Server URL,可運行kubectl cluster-info得到Kubernetes Master API Server URL
- 本文是部署在Kubernetes上,則輸入Kubernetes域名方式,格式https://
. .svc. ,好比https://kubernetes.default.svc.cluster.local,或短名稱https://kubernetes.default
Kubernetes 服務證書 key:將kubernetes的ca.crt的內容填寫到jenkins kubernetes的Kubernetes server certificate key欄中。
️本文Jenkins Master運行在Kubernetes上可跳過此步
生成ca.crt文件,若知道kubernetes的ca.crt位置,不用建立
在Kubernetes Master上,cd ~/.kube/config
,運行如下命令生成Kubernetes server certificate key
,並保存在ca.crt文件中:
echo "<certificate-authority-data>" | base64 -d > ca.crt
2. 憑據:生成cert.pfx上傳到jenkinsdom
️本文Jenkins Master運行在Kubernetes上可跳過此步測試
- 生成Kubernetes Client P12 Certificate File
在Kubernetes Master上,cd~/.kube/config
:# 複製client-certificate-data的內容,運行如下命令生成client.crt echo "<client-certificate-data>" | base64 -d > client.crt] # 複製client-key-data的內容,運行如下命令生成client.key echo "<client-key-data>" | base64 -d > client.key # 根據前面步驟生成的ca.crt, client.crt和client.key來生成PKCS12格式的cert.pfx # 如下命令運行時,須要輸入4位以上的密碼 openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt將生成的Kubernetes Client P12 Certificate Filecert.pfx複製到Jenkins Master服務器上,好比複製到/var/lib/jenkins/kubernetes_cert/cert.pfxspa
- 在Jenkins上配置Kubernetes Credential
- 在Jenkins上增長一個Credential,選擇類型爲Certificate
- 選擇「From a PKCS#12 file on Jenkins master」,輸入上面生成的cert.pfx文件在Jenkins Master服務器上的路徑,好比/var/lib/jenkins/kubernetes_cert/cert.pfx。
- 輸入生成cert.pfx文件時輸入的密碼
- 輸入一個有意義的ID,好比kubernetes-cluster
- 輸入有意義的Description
️若以後環境的Pod就在jenkins本環境,不用給予cluster-admin的權限
#授予serviceaccount 權限,Jenkins對kube-apiserver 其餘namespace的權限認證 kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins
因爲不是同一namespace下經過域名訪問
http://jenkins.jenkins.svc.cluster.local:8080
jenkins-agent.jenkins.svc.cluster.local:50000
最後apply,save
️簡單測試如下,後續發pipeline的使用,從git->jenkins->kuberbetes流水線可先查看Kubernetes+Gitlab+Jenkins構建鏡像並建立Pod 仍是很詳細的。
save or apply
️若是報錯查看4.3.
項目建立成功
slave的Pod
slave的日誌
jenkins的日誌
️jnlp-slave會將項目代碼進行拷貝、打包鏡像、上傳倉庫等等一系列任務,咱們能夠經過命令定製(本文沒有進行任何操做),任務結束後,pod刪除,主機消失,在console output 會看到執行結果:
能夠看到咱們以前輸出命令也打印了出來
jnlp-slave pod建立失敗,會一直從新建立,查看pod日誌,發現是鏈接不上jenkins,jenkins日誌以下:
- 拋 java.nio.channels.ClosedChannelException 異常的緣由是 Jenkins Slave Pod 在 Jenkins Job 運行時忽然掛掉,而後 Master Pod 沒法和 Slave Pod 進行通訊。那麼解決方法就是找到 Slave Pod 常常掛掉的緣由,經排查是 Slave Pod 的資源限制不合理,配置的 CPU 和內存過小,致使 Pod 在運行是很容易超出資源限制,而後被 k8s Kill 掉。️也多是域名或認證沒有配置好,具體須要看jnlp-slave和jenkins的日誌
- 解決方法
打開 Jenkins 設置 Slave Pod 模版的資源限制:
Jenkins->系統管理->系統設置->雲->鏡像->Kubernetes Pod Template->Container Template->高級,而後根據實際狀況調整 CPU 和內存需求。
文中沒有說起的問題,可評論筆者
!!!手碼不易,對您有幫助的話,給個贊呦,且有更多k8s相關文案!!!