kubernetes部署jenkins(Docker in Docker)及認(rèn)證

引言

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的就好。

git for jenkins

直接通過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來訪問,很簡單就不闡述了

svc

訪問http://masterIp:43563如圖:
jenkins

3. kubernetes插件設(shè)置

Manage Jenkins ->Configure System->Cloud->kubernetes

jenkins 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
  1. 在Jenkins上增加一個(gè)Credential,選擇類型為Certificate
  2. 選擇“From a PKCS#12 file on Jenkins master”,輸入上面生成的cert.pfx文件在Jenkins Master服務(wù)器上的路徑,比如/var/lib/jenkins/kubernetes_cert/cert.pfx。
  3. 輸入生成cert.pfx文件時(shí)輸入的密碼
  4. 輸入一個(gè)有意義的ID,比如kubernetes-cluster
  5. 輸入有意義的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

EnvVars

環(huán)境變量 卷

最后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

Freestykle project

others

Execute shell

save or apply

4.2. 啟動(dòng)slave

?如果報(bào)錯(cuò)查看4.3.

start

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

slave的Pod
Pod

slave的日志
slave log

jenkins的日志
jenkins log

?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日志如下:

jenkins log

  • 拋 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)文案?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容