環(huán)境
Kubernetes v1.22.3
基本k8s部署的Jenkins 2.303.3
基本k8s部署的Harbor
k8s部署應(yīng)用流程
- 編寫代碼
- 測試
- 編寫 Dockerfile
- 構(gòu)建打包 Docker 鏡像
- 推送 Docker 鏡像到倉庫
- 編寫 Kubernetes YAML 文件
- 更改 YAML 文件中 Docker 鏡像 TAG
- 利用 kubectl 工具部署應(yīng)用
部署應(yīng)用
一足绅、準(zhǔn)備應(yīng)用程序
我這里準(zhǔn)備了一個簡單的go程序族购,部署到k8s環(huán)境中旁瘫,代碼鏈接:https://github.com/wozengkeai/jenkins-demo.git
二、Jenkins安裝kubernetes插件
- Jenkins Master 和 Jenkins Slave 以 Pod 形式運行在 Kubernetes 集群的 Node 上诵冒,Master 運行在其中一個節(jié)點凯肋,并且將其配置數(shù)據(jù)存儲到一個 Volume 上去,Slave 運行在各個節(jié)點上汽馋,并且它不是一直處于運行狀態(tài),它會按照需求動態(tài)的創(chuàng)建并自動刪除圈盔。
- 這種方式的工作流程大致為:當(dāng) Jenkins Master 接受到 Build 請求時豹芯,會根據(jù)配置的 Label 動態(tài)創(chuàng)建一個運行在 Pod 中的 Jenkins Slave 并注冊到 Master 上,當(dāng)運行完 Job 后驱敲,這個 Slave 會被注銷并且這個 Pod 也會自動刪除铁蹈,恢復(fù)到最初狀態(tài)
- 實踐下來后發(fā)現(xiàn)這種方式仍是有不足的地方,每個應(yīng)用都需要配置一個cloud众眨,當(dāng)程序多的時候工作量就大了握牧,后續(xù)考慮優(yōu)化
接下來就需要配置Jenkins,讓他動態(tài)生成slave的pod
1.安裝kubernetes plugin娩梨,管理Jenkins-插件管理-可選插件-Kubernetes勾選安裝即可沿腰。
2.安裝完畢后,管理Jenkins-系統(tǒng)配置狈定,拉到最底下點擊進(jìn)入配置頁面-add a new cloud颂龙,然后填寫k8s和Jenkins的配置信息。
注意:namespace纽什,我這里填的是jenkins(事先在我的k8s上創(chuàng)建的)措嵌,點擊連接測試,提示連接到kubernetes就標(biāo)識Jenkins和k8s可以正常通信了芦缰,就可以愉快的進(jìn)行下一步了~然后下方的 Jenkins URL的格式為:服務(wù)名.namespace.svc.cluster.local:8080
-
配置 Pod Template企巢,其實就是配置 Jenkins Slave 運行的 Pod 模板,Labels 這里也非常重要让蕾,對于后面執(zhí)行 Job 的時候需要用到該值(沒有這個labels的話后續(xù)執(zhí)行時找不到執(zhí)行的pod)浪规,然后我們這里使用的是 cnych/jenkins:jnlp6 這個鏡像,這個鏡像是在官方的 jnlp 鏡像基礎(chǔ)上定制的涕俗,加入了 kubectl 等一些實用的工具罗丰。
注意:工作目錄,Jenkins的運行路徑再姑,即我部署在k8s上的Jenkins的掛載目錄(根據(jù)自己實際路徑填寫)
4.注意底下兩個需要掛載的主機(jī)目錄萌抵,一個是/var/run/docker.sock,該文件是用于 Pod 中的容器能夠共享宿主機(jī)的 Docker,這就是大家說的 docker in docker 的方式绍填,Docker 二進(jìn)制文件我們已經(jīng)打包到上面的鏡像中了霎桅;另外一個目錄下/home/tester/.kube目錄,我們將這個目錄掛載到容器的/root/.kube目錄下面這是為了讓我們能夠在 Pod 的容器中能夠使用 kubectl 工具來訪問我們的 Kubernetes 集群讨永,方便我們后面在 Slave Pod 部署 Kubernetes 應(yīng)用滔驶。
5.如果運行 Slave Pod 的時候出現(xiàn)了權(quán)限問題,因為 Jenkins Slave Pod 中沒有配置權(quán)限卿闹,所以需要配置上 ServiceAccount揭糕,在 Slave Pod 配置的地方點擊下面的高級,添加上對應(yīng)的 ServiceAccount 即可(不要照搬锻霎,前提是你的k8s創(chuàng)建了這個sa)
三著角、創(chuàng)建新的pipeline項目
1.創(chuàng)建一個新的流水線
2.配置SCM
3.配置憑證
點擊添加-Jenkins
四、編寫pipeline腳本
①withCredentials旋恼,其中有一個 credentialsId 值就是我們剛剛創(chuàng)建的憑證 ID 值
②更新k8s系統(tǒng)中應(yīng)用的鏡像版本時吏口,-n 指定命名空間,我創(chuàng)建了一個新的jenkins-demo命名空間
③node指定label屬性,才可以指定我們要跑的pod是kubernetes插件中配置的pod模板
node('jenkins-jnlp') {
stage('Clone') {
echo "1.Prepare Stage"
checkout scm
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
stage('Test') {
echo "2.Test Stage"
}
stage('Build') {
echo "3.Build Docker Image Stage"
sh "docker build -t 192.168.100.51:30003/jenkins/jenkins-demo:${build_tag} ."
}
stage('Push') {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: 'dockerHarbor', passwordVariable: 'dockerHarborPassword', usernameVariable: 'dockerHarborUser')]) {
//sh "pwd"
sh "echo '${dockerHarborPassword}' | docker login 192.168.100.51:30003 -u ${dockerHarborUser} --password-stdin "
sh "docker push 192.168.100.51:30003/jenkins/jenkins-demo:${build_tag}"
}
}
stage('YAML') {
echo "5. Change YAML File Stage"
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml"
//sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s.yaml"
}
stage('Deploy') {
echo "6. Deploy Stage"
sh "kubectl apply -f k8s.yaml -n jenkins-demo"
}
}
五冰更、構(gòu)建項目
至此CI/CD流程完成~接下來記錄遇到的坑
1产徊、x509: certificate signed by unknown authority
在登陸harbor時提示x509報錯:
①檢查證書是否放置正確路徑(master和所有node都要配置)
②檢查是否配置了docker代理(因為代理一直導(dǎo)致x509,所有辦法都試過了都無效,最后在家里重新部了個環(huán)境蜀细,才發(fā)現(xiàn)是代理引起的舟铜,不知道為什么有的卻不出現(xiàn)這個提示,家里k8s版本是1.23.0)
清除/etc/systemd/system/docker.service.d/http-proxy.conf配置文件內(nèi)容(可能文件名稱會不同)