kubernetes部署jenkins(Docker in Docker)及認證

引言

Jenkins是一款開源 CI&CD 軟件,用於自動化各類任務,包括構建、測試和部署軟件。
本文將Jenkins的master與slave置於Pod中,部署在namespace:jenkins下,jenkins slave 構建時,啓動slave運行代碼克隆,項目構建,鏡像構建,上傳倉庫等一系列命令。構成完成之後刪除pod。也就是Docker In Docker
可直接使用本文提供的編排文件構建Jenkins,有經過helm管理kubernetes組件的,可以使用本文提供的char。
️搭建不是關鍵,關鍵是趟坑。java

1、Jenkins搭建

1. helm安裝

請查看做者以前的文章《kubernetes搭建Harbor無坑及多中心Harbor倉庫同步》中helm搭建部分git

2. Jenkins搭建

git clone https://github.com/yuenandi/Jenkins.git
這是做者從https://github.com/helm/charts.git單獨拿出的,因爲國內helm的Jenkins資源版本太低,沒有選擇使用,便clone了1.6版本。整個git項目過大,很容易clone失敗,也浪費了一些時間找辦法輕量的下載,爲了給小夥伴提供些方便,直接用我git的就好。
git for jenkins
直接經過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來訪問,很簡單就不闡述了
svc
訪問http://masterIp:43563如圖:
jenkinsapi

3. kubernetes插件設置

Manage Jenkins ->Configure System->Cloud->kubernetes
jenkins kubernetes服務器

3.1. 非kubernetes部署jenkins,經過如下認證(經過本文搭建直接查看3.2. 部分):

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
  1. 在Jenkins上增長一個Credential,選擇類型爲Certificate
  2. 選擇「From a PKCS#12 file on Jenkins master」,輸入上面生成的cert.pfx文件在Jenkins Master服務器上的路徑,好比/var/lib/jenkins/kubernetes_cert/cert.pfx。
  3. 輸入生成cert.pfx文件時輸入的密碼
  4. 輸入一個有意義的ID,好比kubernetes-cluster
  5. 輸入有意義的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

EnvVars
環境變量 卷
最後apply,save

4. Freestykle project

️簡單測試如下,後續發pipeline的使用,從git->jenkins->kuberbetes流水線可先查看Kubernetes+Gitlab+Jenkins構建鏡像並建立Pod 仍是很詳細的。

4.1. 建立slave

Freestykle project
others
Execute shell
save or apply

4.2. 啓動slave

️若是報錯查看4.3.
start
項目建立成功
jenkins slave
slave的Pod
Pod
slave的日誌
slave log
jenkins的日誌
jenkins log

️jnlp-slave會將項目代碼進行拷貝、打包鏡像、上傳倉庫等等一系列任務,咱們能夠經過命令定製(本文沒有進行任何操做),任務結束後,pod刪除,主機消失,在console output 會看到執行結果:
Console Output
Console Output
能夠看到咱們以前輸出命令也打印了出來

4.3. 我遇到的報錯處理

jnlp-slave pod建立失敗,會一直從新建立,查看pod日誌,發現是鏈接不上jenkins,jenkins日誌以下:
jenkins log

  • 拋 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相關文案!!!

相關文章
相關標籤/搜索