Jenkins CI/CD介紹
持續構建與發布是我們工作中必不可少的一個步驟,目前大多公司都采用Jenkins集群來搭建符合需求的CI/CD流程,然而傳統的Jenkins Slave一主多從方式會存在一些痛點,比如:主 Master 發生單點故障時,整個流程都不可用了;每個Slave的配置環境不一樣,具有比較大的差異性,這些差異化的配置導致管理起來非常不方便,維護起來也是比較費勁;資源分配不均衡,有的Slave要運行的job出現排隊等待,而有的Slave處於空閑狀態;最后資源有浪費,每台Slave可能是實體機或者V,當 Slave 處於空閑狀態時,也不會完全釋放掉資源。
由於傳統的Jenkins具有上述痛點,因此我們希望有一種更優秀更合理的方式來完成CI/CI流程。容器化技術的產生給我們帶來了希望,Docker容器可以很好的對Slave節點的環境進行封裝,解決掉每個Slave配置差異化的問題。而Kubernetes容器管理平台又可以很好的解決資源分配不均勻的問題。示意圖如下:
從圖中可以看到:Master節點和Slave節點都以容器的方式運行,而不是固定在某一台服務器上,大大的增加了CI/CD的健壯性。本文為了簡化Master節點的搭建難度,並沒有將Master節點部署到集群當中,而是單獨部署在另一台服務器上,以容器的方式運行。CI/CD的大致流程是:jenkins的Master節點觸發任務運行,任務觸發kubernetes創建Pod,Pod里面會運行Slave容器,Slave容器鏈接Master進行具體的處理流程。
安裝Jenkins的Master節點
# 1.拉取鏡像 docker pull jenkins/jenkins # 2.啟動命令 docker run -itd -p 9090:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always -v /jenkins:/var/jenkins_home jenkins/jenkins:latest
# --privileged=true 使得container內的root擁有真正的root權限
# --restart=always 服務器重啟時會自動啟動容器
# 3.查看網頁登錄需要的Password
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Jenkins鏈接kubernetes集群
第一步:安裝kubernetes插件
管理員賬戶登錄Jenkins Master頁面,點擊 “系統管理” —> “插件管理” —> “可選插件” —> “Kubernetes plugin” 勾選安裝即可。
第二步:網頁配置(重點)
安裝完畢后,點擊 “系統管理” —> “系統設置” —> “新增一個雲” —> 選擇 “Kubernetes”,然后填寫Kubernetes和Jenkins配置信息。
圖中黑色部分比較簡單,紅色部分較難,需要單獨說明。名稱字段隨意填寫即可;kubernetes地址填寫的是kubernetes集群apiserver的地址,注意是https協議;證書和憑據在下面說明,可以通過點擊連接測試按鈕,查看是否連接成功;jenkins地址填寫訪問jienkins的網頁地址即可。
生成證書和憑據
# 1.在kubernetes的master節點上安裝生成證書的文件 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x cfssl_linux-amd64 && mv cfssl_linux-amd64 /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x cfssljson_linux-amd64 && mv cfssljson_linux-amd64 /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x cfssl-certinfo_linux-amd64 && mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo # 2. 生成json文件 cat >> admin-csr.json <<EOF { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "hangzhou", "L": "XS", "O": "system:masters", "OU": "System" } ] } EOF # 3.生成以下三個文件:admin.csr admin-key.pem admin.pem cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes admin-csr.json | cfssljson -bare admin # 4.生成pkc格式證書jenkins-admin.pfx openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:secret # 5.查看憑證(全部復制,包括起始和結束兩行) cat /etc/kubernetes/pki/ca.crt
添加憑據
輸入密碼 secret,后面的內容可以不填寫,點擊添加
環境搭建也可參考博客:https://www.cnblogs.com/xiao987334176/p/11338827.html
Jenkins上配置pipline任務,測試環境搭建是否成功
pipeline { agent any stages { stage("one") { agent { kubernetes { yaml """ apiVersion: v1 kind: Pod metadata: name: test1 spec: containers: - name: busybox image: 192.168.1.9:5000/busybox1:latest command: - cat tty: true """ } } steps{ container("busybox") { sh """ echo "first step" hostname """ } } } stage("two") { agent { kubernetes { yaml """ apiVersion: v1 kind: Pod metadata: name: test1 spec: containers: - name: busybox image: 192.168.1.9:5000/busybox2:latest command: - cat tty: true """ } } steps{ container("busybox") { sh """ echo "two step" hostname """ } } } } }
如上述代碼:一共包含兩步,分別使用的是不同的鏡像,隨機運行在集群的某一個節點上,可以通過parallel實現並行,大大減少運行的時間。可以參考 https://testerhome.com/topics/22280 進行原理性理解,主要部分如下圖所示。