引言
Jenkins是一款開源 CI&CD 軟件,用於自動化各種任務,包括構建、測試和部署軟件。
本文將Jenkins的master與slave置於Pod中,部署在namespace:jenkins下,jenkins slave 構建時,啟動slave運行代碼克隆,項目構建,鏡像構建,上傳倉庫等一系列命令。構成完成以后刪除pod。也就是Docker In Docker
可直接使用本文提供的編排文件構建Jenkins,有通過helm管理kubernetes組件的,可使用本文提供的char。
️搭建不是關鍵,關鍵是趟坑。
一、Jenkins搭建
1. helm安裝
請查看作者之前的文章《kubernetes搭建Harbor無坑及多中心Harbor倉庫同步》中helm搭建部分
2. Jenkins搭建
git clone https://github.com/yuenandi/Jenkins.git
這是作者從https://github.com/helm/charts.git
單獨拿出的,由於國內helm的Jenkins資源版本過低,沒有選擇使用,便clone了1.6版本。整個git項目過大,很容易clone失敗,也浪費了一些時間找辦法輕量的下載,為了給小伙伴提供些方便,直接用我git的就好。
直接通過helm安裝Jenkins
kubectl create -f jenkins-pv.yaml
helm install . --debug --namespace jenkins --name jenkins
或
運行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
,也可以設置helm的value.yaml,創建ingress來訪問,很簡單就不闡述了
訪問http://masterIp:43563
如圖:
3. kubernetes插件設置
Manage Jenkins ->Configure System->Cloud->kubernetes
3.1. 非kubernetes部署jenkins,通過以下認證(通過本文搭建直接查看3.2. 部分):
1. Kubernetes 地址:
- 如果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上傳到jenkins
️本文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.pfx
- 在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
3.2. 安裝本文kubernetes部署jenkins,通過以下認證
️若之后環境的Pod就在jenkins本環境,不用給予cluster-admin的權限
#授予serviceaccount 權限,Jenkins對kube-apiserver 其他namespace的權限認證
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins
3.3. jenkins地址設置
由於不是同一namespace下通過域名訪問
- Jenkins 地址:
http://jenkins.jenkins.svc.cluster.local:8080
- Jenkins 通道:
jenkins-agent.jenkins.svc.cluster.local:50000
3.3. 設置kubernetes Pod Template
最后apply,save
4. Freestykle project
️簡單測試以下,后續發pipeline的使用,從git->jenkins->kuberbetes流水線可先查看Kubernetes+Gitlab+Jenkins構建鏡像並創建Pod 還是很詳細的。
4.1. 創建slave
save or apply
4.2. 啟動slave
️如果報錯查看4.3.
項目創建成功
slave的Pod
slave的日志
jenkins的日志
️jnlp-slave會將項目代碼進行拷貝、打包鏡像、上傳倉庫等等一系列任務,我們可以通過命令定制(本文沒有進行任何操作),任務結束后,pod刪除,主機消失,在console output 會看到執行結果:
可以看到我們之前輸出命令也打印了出來
4.3. 我遇到的報錯處理
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相關文案!!!