您好,登錄后才能下訂單哦!
基于KubeSphere CI/CD如何將Spring Boot項(xiàng)目發(fā)布至Kubernetes,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
基于開源的 KubeSphere 容器平臺(tái)演示如何通過 GitHub 倉庫中的 Jenkinsfile 來創(chuàng)建流水線,流水線共包括 8 個(gè)階段,最終將一個(gè) Hello World 頁面部署到 Kubernetes 集群中的不同 namespace。
下面的流程圖簡單說明了流水線完整的工作過程:
流程說明:
階段一. Checkout SCM: 拉取 GitHub 倉庫代碼
階段二. Unit test: 單元測試,如果測試通過了才繼續(xù)下面的任務(wù)
階段三. sonarQube analysis:sonarQube 代碼質(zhì)量檢測
階段四. Build & push snapshot image: 根據(jù)行為策略中所選擇分支來構(gòu)建鏡像,并將 tag 為
SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER
推送至 Harbor (其中$BUILD_NUMBER
為 pipeline 活動(dòng)列表的運(yùn)行序號(hào))。階段五. Push latest image: 將 master 分支打上 tag 為 latest,并推送至 DockerHub。
階段六. Deploy to dev: 將 master 分支部署到 Dev 環(huán)境,此階段需要審核。
階段七. Push with tag: 生成 tag 并 release 到 GitHub,并推送到 DockerHub。
階段八. Deploy to production: 將發(fā)布的 tag 部署到 Production 環(huán)境。
使用 project-regular 登錄 KubeSphere,進(jìn)入已創(chuàng)建的 devops-demo 工程,開始創(chuàng)建憑證。
1、本示例代碼倉庫中的 Jenkinsfile 需要用到 DockerHub、GitHub 和 kubeconfig (kubeconfig 用于訪問接入正在運(yùn)行的 Kubernetes 集群) 等一共 3 個(gè)憑證 (credentials) 。 2、然后創(chuàng)建一個(gè) Java 的 Token 并復(fù)制。
3、最后在 KubeSphere 中進(jìn)入 devops-demo
的 DevOps 工程中,與上面步驟類似,在 憑證 下點(diǎn)擊 創(chuàng)建,創(chuàng)建一個(gè)類型為 秘密文本
的憑證,憑證 ID 命名為 sonar-token,密鑰為上一步復(fù)制的 token 信息,完成后點(diǎn)擊 確定。
至此,4 個(gè)憑證已經(jīng)創(chuàng)建完成,下一步需要在示例倉庫中的 jenkinsfile 修改對(duì)應(yīng)的四個(gè)憑證 ID 為用戶自己創(chuàng)建的憑證 ID。
登錄 GitHub,將本示例用到的 GitHub 倉庫 devops-java-sample Fork 至您個(gè)人的 GitHub。
1、Fork 至您個(gè)人的 GitHub 后,在 根目錄 進(jìn)入 Jenkinsfile-online。
2、在 GitHub UI 點(diǎn)擊編輯圖標(biāo),需要修改如下環(huán)境變量 (environment) 的值。
修改項(xiàng) | 值 | 含義 |
---|---|---|
DOCKER_CREDENTIAL_ID | dockerhub-id | 填寫創(chuàng)建憑證步驟中的 DockerHub 憑證 ID,用于登錄您的 DockerHub |
GITHUB_CREDENTIAL_ID | github-id | 填寫創(chuàng)建憑證步驟中的 GitHub 憑證 ID,用于推送 tag 到 GitHub 倉庫 |
KUBECONFIG_CREDENTIAL_ID | demo-kubeconfig | kubeconfig 憑證 ID,用于訪問接入正在運(yùn)行的 Kubernetes 集群 |
REGISTRY | docker.io | 默認(rèn)為 docker.io 域名,用于鏡像的推送 |
DOCKERHUB_NAMESPACE | your-dockerhub-account | 替換為您的 DockerHub 賬號(hào)名 <br> (它也可以是賬戶下的 Organization 名稱) |
GITHUB_ACCOUNT | your-github-account | 替換為您的 GitHub 賬號(hào)名,例如 https://github.com/kubesphere/ 則填寫 kubesphere (它也可以是賬戶下的 Organization 名稱) |
APP_NAME | devops-java-sample | 應(yīng)用名稱 |
SONAR_CREDENTIAL_ID | sonar-token | 填寫創(chuàng)建憑證步驟中的 SonarQube token憑證 ID,用于代碼質(zhì)量檢測 |
注: Jenkinsfile 中 mvn
命令的參數(shù) -o
,表示開啟離線模式。本示例為適應(yīng)某些環(huán)境下網(wǎng)絡(luò)的干擾,以及避免在下載依賴時(shí)耗時(shí)太長,已事先完成相關(guān)依賴的下載,默認(rèn)開啟離線模式。
3、修改以上的環(huán)境變量后,點(diǎn)擊 Commit changes,將更新提交到當(dāng)前的 master 分支。
CI/CD 流水線會(huì)根據(jù)示例項(xiàng)目的 yaml 模板文件,最終將示例分別部署到 Dev 和 Production 這兩個(gè)項(xiàng)目 (Namespace) 環(huán)境中,即 kubesphere-sample-dev
和 kubesphere-sample-prod
,這兩個(gè)項(xiàng)目需要預(yù)先在控制臺(tái)依次創(chuàng)建,參考如下步驟創(chuàng)建該項(xiàng)目。
1、使用項(xiàng)目管理員 project-admin
賬號(hào)登錄 KubeSphere,在之前創(chuàng)建的企業(yè)空間 (demo-workspace) 下,點(diǎn)擊 項(xiàng)目 → 創(chuàng)建,創(chuàng)建一個(gè) 資源型項(xiàng)目,作為本示例的開發(fā)環(huán)境,填寫該項(xiàng)目的基本信息,完成后點(diǎn)擊 下一步。
名稱:固定為 kubesphere-sample-dev
,若需要修改項(xiàng)目名稱則需在 yaml 模板文件 中修改 namespace
別名:可自定義,比如 開發(fā)環(huán)境
描述信息:可簡單介紹該項(xiàng)目,方便用戶進(jìn)一步了解
2、本示例暫無資源請(qǐng)求和限制,因此高級(jí)設(shè)置中無需修改默認(rèn)值,點(diǎn)擊 創(chuàng)建,項(xiàng)目可創(chuàng)建成功。
第一個(gè)項(xiàng)目創(chuàng)建完后,還需要項(xiàng)目管理員 project-admin
邀請(qǐng)當(dāng)前的項(xiàng)目普通用戶 project-regular
進(jìn)入 kubesphere-sample-dev
項(xiàng)目,進(jìn)入「項(xiàng)目設(shè)置」→「項(xiàng)目成員」,點(diǎn)擊「邀請(qǐng)成員」選擇邀請(qǐng) project-regular
并授予 operator
角色。
同上,參考以上兩步創(chuàng)建一個(gè)名稱為 kubesphere-sample-prod
的項(xiàng)目作為生產(chǎn)環(huán)境,并邀請(qǐng)普通用戶 project-regular
進(jìn)入 kubesphere-sample-prod
項(xiàng)目并授予 operator
角色。
說明:當(dāng) CI/CD 流水線后續(xù)執(zhí)行成功后,在
kubesphere-sample-dev
和kubesphere-sample-prod
項(xiàng)目中將看到流水線創(chuàng)建的部署 (Deployment) 和服務(wù) (Service)。
1、進(jìn)入已創(chuàng)建的 DevOps 工程,選擇左側(cè)菜單欄的 流水線,然后點(diǎn)擊 創(chuàng)建。
2、在彈出的窗口中,輸入流水線的基本信息。
名稱:為創(chuàng)建的流水線起一個(gè)簡潔明了的名稱,便于理解和搜索
描述信息:簡單介紹流水線的主要特性,幫助進(jìn)一步了解流水線的作用
代碼倉庫:點(diǎn)擊選擇代碼倉庫,代碼倉庫需已存在 Jenkinsfile
1、點(diǎn)擊代碼倉庫,以添加 Github 倉庫為例。
2、點(diǎn)擊彈窗中的 獲取 Token。
3、在 GitHub 的 access token 頁面填寫 Token description,簡單描述該 token,如 DevOps demo,在 Select scopes 中無需任何修改,點(diǎn)擊 Generate token
,GitHub 將生成一串字母和數(shù)字組成的 token 用于訪問當(dāng)前賬戶下的 GitHub repo。
4、復(fù)制生成的 token,在 KubeSphere Token 框中輸入該 token 然后點(diǎn)擊保存。
5、驗(yàn)證通過后,右側(cè)會(huì)列出此 Token 關(guān)聯(lián)用戶的所有代碼庫,選擇其中一個(gè)帶有 Jenkinsfile 的倉庫。比如此處選擇準(zhǔn)備好的示例倉庫 devops-java-sample,點(diǎn)擊 選擇此倉庫,完成后點(diǎn)擊 下一步。
完成代碼倉庫相關(guān)設(shè)置后,進(jìn)入高級(jí)設(shè)置頁面,高級(jí)設(shè)置支持對(duì)流水線的構(gòu)建記錄、行為策略、定期掃描等設(shè)置的定制化,以下對(duì)用到的相關(guān)配置作簡單釋義。
1、構(gòu)建設(shè)置中,勾選 丟棄舊的構(gòu)建
,此處的 保留分支的天數(shù) 和 保留分支的最大個(gè)數(shù) 默認(rèn)為 -1。
說明:
分支設(shè)置的保留分支的天數(shù)和保持分支的最大個(gè)數(shù)兩個(gè)選項(xiàng)可以同時(shí)對(duì)分支進(jìn)行作用,只要某個(gè)分支的保留天數(shù)和個(gè)數(shù)不滿足任何一個(gè)設(shè)置的條件,則將丟棄該分支。假設(shè)設(shè)置的保留天數(shù)和個(gè)數(shù)為 2 和 3,則分支的保留天數(shù)一旦超過 2 或者保留個(gè)數(shù)超過 3,則將丟棄該分支。默認(rèn)兩個(gè)值為 -1,表示不自動(dòng)刪除分支。
丟棄舊的分支將確定何時(shí)應(yīng)丟棄項(xiàng)目的分支記錄。分支記錄包括控制臺(tái)輸出,存檔工件以及與特定分支相關(guān)的其他元數(shù)據(jù)。保持較少的分支可以節(jié)省 Jenkins 所使用的磁盤空間,我們提供了兩個(gè)選項(xiàng)來確定應(yīng)何時(shí)丟棄舊的分支:
保留分支的天數(shù):如果分支達(dá)到一定的天數(shù),則丟棄分支。
保留分支的個(gè)數(shù):如果已經(jīng)存在一定數(shù)量的分支,則丟棄最舊的分支。
2、行為策略中,KubeSphere 默認(rèn)添加了三種策略。由于本示例還未用到 從 Fork 倉庫中發(fā)現(xiàn) PR 這條策略,此處可以刪除該策略,點(diǎn)擊右側(cè)刪除按鈕。
說明:
支持添加三種類型的發(fā)現(xiàn)策略。需要說明的是,在 Jenkins 流水線被觸發(fā)時(shí),開發(fā)者提交的 PR (Pull Request) 也被視為一個(gè)單獨(dú)的分支。
發(fā)現(xiàn)分支:
排除也作為 PR 提交的分支:選擇此項(xiàng)表示 CI 將不會(huì)掃描源分支 (比如 Origin 的 master branch),也就是需要被 merge 的分支
只有被提交為 PR 的分支:僅掃描 PR 分支
所有分支:拉取的倉庫 (origin) 中所有的分支
從原倉庫中發(fā)現(xiàn) PR:
PR 與目標(biāo)分支合并后的源代碼版本:一次發(fā)現(xiàn)操作,基于 PR 與目標(biāo)分支合并后的源代碼版本創(chuàng)建并運(yùn)行流水線
PR 本身的源代碼版本:一次發(fā)現(xiàn)操作,基于 PR 本身的源代碼版本創(chuàng)建并運(yùn)行流水線
當(dāng) PR 被發(fā)現(xiàn)時(shí)會(huì)創(chuàng)建兩個(gè)流水線,一個(gè)流水線使用 PR 本身的源代碼版本,一個(gè)流水線使用 PR 與目標(biāo)分支合并后的源代碼版本:兩次發(fā)現(xiàn)操作,將分別創(chuàng)建兩條流水線,第一條流水線使用 PR 本身的源代碼版本,第二條流水線使用 PR 與目標(biāo)分支合并后的源代碼版本
3、默認(rèn)的 腳本路徑 為 Jenkinsfile,請(qǐng)將其修改為 Jenkinsfile-online。
注:路徑是 Jenkinsfile 在代碼倉庫的路徑,表示它在示例倉庫的根目錄,若文件位置變動(dòng)則需修改其腳本路徑。
4、在 掃描 Repo Trigger 勾選 如果沒有掃描觸發(fā),則定期掃描
,掃描時(shí)間間隔可根據(jù)團(tuán)隊(duì)習(xí)慣設(shè)定,本示例設(shè)置為 5 minutes
。
說明:定期掃描是設(shè)定一個(gè)周期讓流水線周期性地掃描遠(yuǎn)程倉庫,根據(jù) 行為策略 查看倉庫有沒有代碼更新或新的 PR。
Webhook 推送:
Webhook 是一種高效的方式可以讓流水線發(fā)現(xiàn)遠(yuǎn)程倉庫的變化并自動(dòng)觸發(fā)新的運(yùn)行,GitHub 和 Git (如 Gitlab) 觸發(fā) Jenkins 自動(dòng)掃描應(yīng)該以 Webhook 為主,以上一步在 KubeSphere 設(shè)置定期掃描為輔。在本示例中,可以通過手動(dòng)運(yùn)行流水線,如需設(shè)置自動(dòng)掃描遠(yuǎn)端分支并觸發(fā)運(yùn)行,詳見 設(shè)置自動(dòng)觸發(fā)掃描 - GitHub SCM。
完成高級(jí)設(shè)置后點(diǎn)擊 創(chuàng)建。
流水線創(chuàng)建后,點(diǎn)擊瀏覽器的 刷新 按鈕,可見一條自動(dòng)觸發(fā)遠(yuǎn)程分支后的運(yùn)行記錄。
1、點(diǎn)擊右側(cè) 運(yùn)行,將根據(jù)上一步的 行為策略 自動(dòng)掃描代碼倉庫中的分支,在彈窗選擇需要構(gòu)建流水線的 master
分支,系統(tǒng)將根據(jù)輸入的分支加載 Jenkinsfile-online (默認(rèn)是根目錄下的 Jenkinsfile)。
2、由于倉庫的 Jenkinsfile-online 中 TAG_NAME: defaultValue
沒有設(shè)置默認(rèn)值,因此在這里的 TAG_NAME
可以輸入一個(gè) tag 編號(hào),比如輸入 v0.0.1。
3、點(diǎn)擊 確定,將新生成一條流水線活動(dòng)開始運(yùn)行。
說明: tag 用于在 Github 和DockerHub 中分別生成帶有 tag 的 release 和鏡像。 注意: 在主動(dòng)運(yùn)行流水線以發(fā)布 release 時(shí),
TAG_NAME
不應(yīng)與之前代碼倉庫中所存在的tag
名稱重復(fù),如果重復(fù)會(huì)導(dǎo)致流水線的運(yùn)行失敗。
至此,流水線 已完成創(chuàng)建并開始運(yùn)行。
注:點(diǎn)擊 分支 切換到分支列表,查看流水線具體是基于哪些分支運(yùn)行,這里的分支則取決于上一步 行為策略 的發(fā)現(xiàn)分支策略。
為方便演示,此處默認(rèn)用當(dāng)前賬戶來審核,當(dāng)流水線執(zhí)行至 input
步驟時(shí)狀態(tài)將暫停,需要手動(dòng)點(diǎn)擊 繼續(xù),流水線才能繼續(xù)運(yùn)行。注意,在 Jenkinsfile-online 中分別定義了三個(gè)階段 (stage) 用來部署至 Dev 環(huán)境和 Production 環(huán)境以及推送 tag,因此在流水線中依次需要對(duì) deploy to dev, push with tag, deploy to production
這三個(gè)階段審核 3
次,若不審核或點(diǎn)擊 終止 則流水線將不會(huì)繼續(xù)運(yùn)行。
說明:在實(shí)際的開發(fā)生產(chǎn)場景下,可能需要更高權(quán)限的管理員或運(yùn)維人員來審核流水線和鏡像,并決定是否允許將其推送至代碼或鏡像倉庫,以及部署至開發(fā)或生產(chǎn)環(huán)境。Jenkinsfile 中的
input
步驟支持指定用戶審核流水線,比如要指定用戶名為 project-admin 的用戶來審核,可以在 Jenkinsfile 的 input 函數(shù)中追加一個(gè)字段,如果是多個(gè)用戶則通過逗號(hào)分隔,如下所示:
··· input(id: 'release-image-with-tag', message: 'release image with tag?', submitter: 'project-admin,project-admin1') ···
1、點(diǎn)擊流水線中 活動(dòng)
列表下當(dāng)前正在運(yùn)行的流水線序列號(hào),頁面展現(xiàn)了流水線中每一步驟的運(yùn)行狀態(tài),注意,流水線剛創(chuàng)建時(shí)處于初始化階段,可能僅顯示日志窗口,待初始化 (約一分鐘) 完成后即可看到流水線。黑色框標(biāo)注了流水線的步驟名稱,示例中流水線共 8 個(gè) stage,分別在 Jenkinsfile-online 中被定義。
2、當(dāng)前頁面中點(diǎn)擊右上方的 查看日志
,查看流水線運(yùn)行日志。頁面展示了每一步的具體日志、運(yùn)行狀態(tài)及時(shí)間等信息,點(diǎn)擊左側(cè)某個(gè)具體的階段可展開查看其具體的日志。日志可下載至本地,如出現(xiàn)錯(cuò)誤,下載至本地更便于分析定位問題。
1、若流水線執(zhí)行成功,點(diǎn)擊該流水線下的 代碼質(zhì)量
,即可看到通過 SonarQube 的代碼質(zhì)量檢測結(jié)果,如下圖(僅供參考)。
2、流水線最終 build 的 Docker 鏡像也將被成功地 push 到 DockerHub 中,我們?cè)?Jenkinsfile-online 中已經(jīng)配置過 DockerHub,登錄 DockerHub 查看鏡像的 push 結(jié)果,可以看到 tag 為 snapshot、TAG_NAME(master-1)、latest 的鏡像已經(jīng)被 push 到 DockerHub,并且在 GitHub 中也生成了一個(gè)新的 tag 和 release。Hello World 示例頁面最終將以 deployment 和 service 分別部署到 KubeSphere 的 kubesphere-sample-dev
和 kubesphere-sample-prod
項(xiàng)目環(huán)境中。
環(huán)境 | 訪問地址 | 所在項(xiàng)目 (Namespace) | 部署 (Deployment) | 服務(wù) (Service) |
---|---|---|---|---|
Dev | http://{$Virtual IP}:{$8080} <br> 或者 http://{$內(nèi)網(wǎng)/公網(wǎng) IP}:{$30861} | kubesphere-sample-dev | ks-sample-dev | ks-sample-dev |
Production | http://{$Virtual IP}:{$8080} <br> 或者 http://{$內(nèi)網(wǎng)/公網(wǎng) IP}:{$30961} | kubesphere-sample-prod | ks-sample | ks-sample |
3、可通過 KubeSphere 回到項(xiàng)目列表,依次查看之前創(chuàng)建的兩個(gè)項(xiàng)目中的部署和服務(wù)的狀態(tài)。例如,以下查看 kubesphere-sample-prod
項(xiàng)目下的部署。
進(jìn)入該項(xiàng)目,在左側(cè)的菜單欄點(diǎn)擊 工作負(fù)載 → 部署,可以看到 ks-sample 已創(chuàng)建成功。正常情況下,部署的狀態(tài)應(yīng)該顯示 運(yùn)行中。
4、在菜單欄中選擇 網(wǎng)絡(luò)與服務(wù) → 服務(wù) 也可以查看對(duì)應(yīng)創(chuàng)建的服務(wù),可以看到該服務(wù)的 Virtual IP 為 10.233.42.3
,對(duì)外暴露的節(jié)點(diǎn)端口 (NodePort) 是 30961
。
查看服務(wù)
5、查看推送到您個(gè)人的 DockerHub 中的鏡像,可以看到 devops-java-sample
就是 APP_NAME 的值,而 tag 也是在 jenkinsfile-online 中定義的 tag。
6、點(diǎn)擊 release
,查看 Fork 到您個(gè)人 GitHub repo 中的 v0.0.1
tag 和 release,它是由 jenkinsfile 中的 push with tag
生成的。
若在內(nèi)網(wǎng)環(huán)境訪問部署的 HelloWorld 示例服務(wù),可通過 SSH 登陸集群節(jié)點(diǎn),或使用集群管理員登陸 KubeSphere 在 web kubectl 中輸入以下命令驗(yàn)證訪問,其中 Cluster IP 和節(jié)點(diǎn)端口 (NodePort) 可通過對(duì)應(yīng)項(xiàng)目下的服務(wù)中查看:
驗(yàn)證 Dev 環(huán)境的示例服務(wù)
# curl {$Virtual IP}:{$Port} 或者 curl {$內(nèi)網(wǎng) IP}:{$NodePort} curl 10.233.40.5:8080 Hello,World!
驗(yàn)證 Prodcution 環(huán)境的示例服務(wù)
# curl {$Virtual IP}:{$Port} 或者 curl {$內(nèi)網(wǎng) IP}:{$NodePort} curl 10.233.42.3:8080 Hello,World!
KubeSphere (https://github.com/kubesphere/kubesphere) 是一個(gè)開源的以應(yīng)用為中心的容器管理平臺(tái),支持部署在任何基礎(chǔ)設(shè)施之上,并提供簡單易用的 UI,極大減輕日常開發(fā)、測試、運(yùn)維的復(fù)雜度,旨在解決 Kubernetes 本身存在的存儲(chǔ)、網(wǎng)絡(luò)、安全和易用性等痛點(diǎn),幫助企業(yè)輕松應(yīng)對(duì)敏捷開發(fā)與自動(dòng)化監(jiān)控運(yùn)維、端到端應(yīng)用交付、微服務(wù)治理、多租戶管理、多集群管理、服務(wù)與網(wǎng)絡(luò)管理、鏡像倉庫、AI 平臺(tái)、邊緣計(jì)算等業(yè)務(wù)場景。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。