摘要:擴(kuò)展性好當(dāng)集群的資源嚴(yán)重不足而導(dǎo)致排隊(duì)等待時(shí),可以很容易的添加一個(gè)到集群中,從而實(shí)現(xiàn)擴(kuò)展。用法,選擇盡可能使用這個(gè)節(jié)點(diǎn)鏡像,填寫(xiě),這個(gè)容器鏡像是我們的運(yùn)行環(huán)境。更新文件,這里我們只是將中的鏡像更換成最新構(gòu)建出的鏡像。
[TOC]
提到K8S環(huán)境下的CI/CD,可以使用的工具有很多,比如Jenkins、Gitlab CI、新興的drone等,考慮到大多公司在VM環(huán)境下都采用 Jenkins 集群來(lái)搭建符合需求的 CI/CD 流程,這里先給介紹大家下Kubernetes+Jenkins的CI/CD方案。
Jenkins Master 和 Jenkins Slave 以 Pod 形式運(yùn)行在 Kubernetes 集群的 Node 上,Master是常駐服務(wù),所有的配置數(shù)據(jù)都存儲(chǔ)在一個(gè) Volume 中,Slave 不是一直處于運(yùn)行狀態(tài),它會(huì)按照需求動(dòng)態(tài)的創(chuàng)建并自動(dòng)刪除。
當(dāng) Jenkins Master 接受到 Build 請(qǐng)求時(shí),會(huì)根據(jù)配置的 Label 動(dòng)態(tài)創(chuàng)建一個(gè)運(yùn)行在 Pod 中的 Jenkins Slave 并注冊(cè)到 Master 上,當(dāng)運(yùn)行完 Job 后,這個(gè) Slave 會(huì)被注銷(xiāo)并且這個(gè) Pod 也會(huì)自動(dòng)刪除,恢復(fù)到最初狀態(tài)。
相對(duì)于部署在虛擬機(jī)環(huán)境下的Jenkins 一主多從架構(gòu),將Jenkins部署到K8S會(huì)帶來(lái)以下好處:
1、 為了管理方便,我們把需要?jiǎng)?chuàng)建的資源都部署在一個(gè)名為 jenkins 的 namespace 下面,所以我們需要添加創(chuàng)建一個(gè) namespace:
kubectl create namespace jenkins
2、 聲明一個(gè)PVC對(duì)象,后面我們要將Jenkins容器的 /var/jenkins_home 目錄掛載到了這個(gè)名為PVC對(duì)象上面。
如果您使用的k8s版本大于等于1.14,且沒(méi)有使用快杰云主機(jī),請(qǐng)部署。
kubectl apply -f https://gitee.com/uk8s/uk8s/raw/master/yaml/cicd/yaml_jenkins_jenkins-pvc.yaml
如果您使用的k8s版本大于等于1.14,且使用快杰云主機(jī),請(qǐng)部署。
kubectl apply -f https://gitee.com/uk8s/uk8s/raw/master/yaml/cicd/yaml_jenkins_jenkins-pvc-rssd.yaml
如果您使用的k8s版本小于1.14,請(qǐng)部署。
kubectl apply -f https://gitee.com/uk8s/uk8s/raw/master/yaml/cicd/yaml_jenkins_jenkins-pvc-1.13.yaml
3、 以Deployment方式部署Jenkins master為了演示方便,我們還使用LoadBalancer類(lèi)型的service將其暴露到外網(wǎng)。
kubectl apply -f https://gitee.com/uk8s/uk8s/raw/master/yaml/cicd/yaml_jenkins_jenkins.yaml
4、 等到服務(wù)啟動(dòng)成功后,我們就可以根據(jù)LoadBalancer的IP(即EXTERNAL-IP),訪問(wèn) jenkins 服務(wù)了,并根據(jù)提示信息進(jìn)行安裝配置。
bash-4.4# kubectl get svc -n jenkins
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT AGE
jenkins LoadBalancer 172.17.201.210 106.75.98.80 8080:33651/TCP50000:43748/TCP 4d21h
5、 創(chuàng)建一個(gè)名為jenkins2的ServiceAccount,并且為其賦予特定的權(quán)限,后面配置Jenkins-Slave我們會(huì)用到。
kubectl apply -f https://gitee.com/uk8s/uk8s/raw/master/yaml/cicd/yaml_jenkins_jenkins-rbac.yaml
1、 前面我們已經(jīng)獲取到Jenkins的外網(wǎng)IP地址,我們直接在瀏覽器輸入EXTERNAL-IP:8080,即可打開(kāi)Jenkins頁(yè)面,提示需要輸入初始化密碼:
2、 我們通過(guò)kubectl log獲取jenkins容器的日志來(lái)獲取初始化密碼
kubectl logs jenkins-deployment-66b865dbd-xvmdz -n jenkins
3、 選擇推薦安裝,添加完管理員帳號(hào)admin,即可進(jìn)入到 jenkins 主界面。
4、 接下來(lái)安裝jenkins依賴插件清單——kubernets plugin,讓他能夠動(dòng)態(tài)的生成 Slave 的 Pod。 點(diǎn)擊 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes plugin勾選安裝即可。
安裝插件相對(duì)較慢,請(qǐng)耐心等待,并且由于是在線安裝,集群需要開(kāi)通外網(wǎng),請(qǐng)開(kāi)啟natgw來(lái)使node節(jié)點(diǎn)通外網(wǎng)
接下來(lái)將進(jìn)入最重要的一個(gè)步驟,在Kubernetes插件安裝完畢后,我們需要配置Jenkins和Kubernetes參數(shù),使Jenkins連接到UK8S集群,并能調(diào)用Kubernetes API 動(dòng)態(tài)創(chuàng)建Jenkins Slave,執(zhí)行構(gòu)建任務(wù)。
首先點(diǎn)擊 Manage Jenkins —> Configure System,進(jìn)入到系統(tǒng)設(shè)置頁(yè)面。滾動(dòng)到頁(yè)面最下方,然后點(diǎn)擊Add a new cloud —> 選擇 Kubernetes,開(kāi)始填寫(xiě) Kubernetes 和 Jenkins 配置信息。
1、 輸入U(xiǎn)K8S Apiserver地址,以及服務(wù)證書(shū)key。
以上兩個(gè)參數(shù)信息,可以在se64解碼,將解碼后的內(nèi)容復(fù)制到輸入框即可。
2、 填寫(xiě)集群Namespace、上傳憑據(jù)、Jenkins地址
Namespace此處填寫(xiě)之前創(chuàng)建Namespace即可,此處為jenkins。憑證處,點(diǎn)擊”Add“,憑證類(lèi)型選擇"Secret file",將UK8S集群詳情頁(yè)全部?jī)?nèi)容復(fù)制下來(lái),保存為kubeconfig上傳。
3、 點(diǎn)擊”連接測(cè)試“,如果出現(xiàn) Connection test successful 的提示信息證明 Jenkins 已經(jīng)可以和 Kubernetes 系統(tǒng)正常通信了
4、 接下來(lái),我們點(diǎn)擊”添加Pod模板“,這個(gè)Pod模板即Jenkins-slave pod的模板。
選擇添加卷,主機(jī)路徑和掛載路徑都填寫(xiě)為”/var/run/docker.sock“,使得jenkins-slave可以使用宿主機(jī)的Docker,讓我們可以在容器中進(jìn)行鏡像Build等操作。
點(diǎn)擊最下方的Advanced,Service Account 輸入jenkins2,這是我們之前創(chuàng)建的SA。
其他幾個(gè)參數(shù)由于只是演示,我們都使用默認(rèn)值,在實(shí)際使用的時(shí)候,請(qǐng)自行選擇合理的參數(shù)。到這里我們的 Kubernetes Plugin 插件就算配置完成了。
Kubernetes 插件的配置工作完成了,接下來(lái)我們就來(lái)添加一個(gè) Job 任務(wù),看是否能夠在 Slave Pod 中執(zhí)行,任務(wù)執(zhí)行完成后看 Pod 是否會(huì)被銷(xiāo)毀。
1、 在 Jenkins 首頁(yè)點(diǎn)擊create new jobs,創(chuàng)建一個(gè)測(cè)試的任務(wù),輸入任務(wù)名稱,然后我們選擇 Freest
2、 在任務(wù)配置頁(yè),最下面的 Label ex
3、 在任務(wù)配置頁(yè)的 Build 區(qū)域,選擇Execute shell,輸入一個(gè)簡(jiǎn)單的測(cè)試命令,并點(diǎn)擊保存。
4、 點(diǎn)擊查看Console output,查看任務(wù)運(yùn)行情況。
到這里我們就完成了使用 Kubernetes 動(dòng)態(tài)生成 Jenkins Slave 的方法。
Pipeline,簡(jiǎn)單來(lái)說(shuō),就是一套運(yùn)行在 Jenkins 上的工作流(流水線)框架,將原來(lái)獨(dú)立運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來(lái),實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜流程編排和可視化的工作。Jenkins Pipeline 有幾個(gè)核心概念:
Pipeline 有兩種創(chuàng)建方法,一是直接在 Jenkins 的 Web UI 界面中輸入腳本,二是通過(guò)創(chuàng)建一個(gè) Jenkinsfile 腳本文件放入項(xiàng)目源碼庫(kù)中,這里為了方便演示,我們使用在 Web UI 界面中輸入腳本的方式來(lái)運(yùn)行Pipeline。
1、 點(diǎn)擊”new item“,輸入Job名稱,選擇Pipeline,點(diǎn)擊"OK"。
2、 在最下方的pipeline 腳本部分,輸入以下腳本內(nèi)容,并點(diǎn)擊保存
node(jnlp-slave) {
stage(Clone) {
echo "1.Clone Stage"
}
stage(Test) {
echo "2.Test Stage"
}
stage(Build) {
echo "3.Build Stage"
}
stage(Deploy) {
echo "4. Deploy Stage"
}
}
上面的腳本內(nèi)容中,我們給 node 添加了一個(gè) jnlp-slave 標(biāo)簽,指定這個(gè)pipeline的4個(gè)stage,都運(yùn)行在jenkins的slave節(jié)點(diǎn)中。
3、 任務(wù)創(chuàng)建好之后,點(diǎn)擊”立即構(gòu)建“,我們可以通過(guò)kubectl命令發(fā)現(xiàn)UK8S集群中正啟動(dòng)一個(gè)新的pod用于構(gòu)建任務(wù)。
bash-4.4# kubectl get po -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-deployment-6f9d84f745-lcs67 1/1 Running 0 5d2h
jnlp-0qn7x 0/1 ContainerCreating 0 1s
4、 回到 Jenkins 的 Web UI 界面中查看 本次構(gòu)建歷史的 Console Output,也可以類(lèi)似如下的信息,表明構(gòu)建成功
Console Output
Started by user kukkazhang
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Still waiting to schedule task
‘jnlp-7m9dl’ is offline
Agent jnlp-7m9dl is provisioned from template Kubernetes Pod Template
Agent specification [Kubernetes Pod Template] (jnlp-slave):
* [jnlp] uhub.service.ucloud.cn/library/jenkins:jnlp
Running on jnlp-7m9dl in /home/jenkins/workspace/testhelloworld
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Clone)
[Pipeline] echo
1.Clone Stage
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
....
....
6. Deploy Stage
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
上面我們已經(jīng)知道了如何在 Jenkins Slave 中構(gòu)建Pipeline任務(wù),那么如何通過(guò)Jenkins來(lái)部署一個(gè)原生的 Kubernetes 應(yīng)用呢?
一般而言,在Kubernetes中部署一個(gè)業(yè)務(wù)的流程大致如下:
這是我們?nèi)巳獠渴饝?yīng)用的流程,現(xiàn)在我們要做的是把上面這些流程放入 Jenkins 中來(lái)自動(dòng)幫我們完成,從測(cè)試到更新 YAML 文件屬于 CI 流程,后面部署屬于 CD 的范疇。下面我們現(xiàn)在要來(lái)編寫(xiě)一個(gè) Pipeline 的腳本,幫我們自動(dòng)完成以上工作。
開(kāi)始之前的準(zhǔn)備工作
為了演示方便,我們準(zhǔn)備了一個(gè)簡(jiǎn)單的helloworld程序,并將業(yè)務(wù)代碼、dockerfile、yaml 放置 github代碼倉(cāng)庫(kù)分支:jenkins-cicd接下來(lái)我們來(lái)逐步編寫(xiě)Pipeline腳本。
1、clone代碼,我們將git commit的記錄作為后面構(gòu)建的鏡像 tag,讓鏡像tag和git commit記錄對(duì)應(yīng)起來(lái),方便后續(xù)排查問(wèn)題。
stage(Clone) {
echo "1.Clone Stage"
git branch: jenkins-cicd url: "https://github.com/ucloud/uk8s-demo.git"
script {
build_tag = sh(returnStdout: true script: git rev-parse --short HEAD).trim()
}
}
2、編寫(xiě)測(cè)試用例,這里涉及到業(yè)務(wù)邏輯,我們選擇略過(guò)。
stage(Test) {
echo "2.Test Stage"
}
3、構(gòu)建鏡像,鏡像tag便是我們之前在clone代碼階段定義的build_tag,注意將"jenkins_k8s_cicd"更換成您自己的uhub倉(cāng)庫(kù)名。
stage(Build) {
echo "3.Build Docker Image Stage"
sh "docker build -t uhub.service.ucloud.cn/jenkins_k8s_cicd/jenkins_k8s_cicd:${build_tag} ."
}
4、將鏡像推送到鏡像倉(cāng)庫(kù)。我們選擇將鏡像推送到Uhub的私人倉(cāng)庫(kù)中去,因此我們還需要登錄到uhub,注意將"jenkins_k8s_cicd"更換成您自己的uhub倉(cāng)庫(kù)名。
stage(Push) {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: uhub passwordVariable: uhubPassword usernameVariable: uhubUser)]) {
echo "${uhubPassword}"
echo "${uhubUser}"
sh "docker login -u ${uhubUser} -p ${uhubPassword} uhub.service.ucloud.cn"
sh "docker push uhub.service.ucloud.cn/jenkins_k8s_cicd/jenkins_k8s_cicd:${build_tag}"
}
}
為了保證賬戶安全,上面的腳本中,我們用了Jenkins的一個(gè)"憑據(jù)"功能。在首頁(yè)點(diǎn)擊 Credentials -> Stores scoped to Jenkins 下面的 Jenkins -> Global credentials (unrestricted) -> 左側(cè)的 Add Credentials:添加一個(gè) Username with password 類(lèi)型的認(rèn)證信息。
輸入 uhub 的用戶名和密碼,ID 部分我們輸入uhub,注意,這個(gè)值非常重要,需要與Pipeline 中的腳本保持一致。
5、更新yaml文件,這里我們只是將yaml中的鏡像tag更換成最新構(gòu)建出的鏡像tag。
stage(YAML) {
echo "5. Change YAML File Stage"
sh "sed -i s//${build_tag}/ k8s.yml"
}
6、應(yīng)用發(fā)布。我們直接使用kubectl apply命令來(lái)更新應(yīng)用,還記得我們之前創(chuàng)建的名為jenkins2的ServiceAccount嗎?能成功發(fā)布應(yīng)用,還有賴我們?yōu)閖enkins2配置的權(quán)限呢。
stage(Deploy) {
echo "6. Deploy Stage"
sh "kubectl apply -f k8s.yml"
}
7、上面我們把pipeline中的每個(gè)Stage都講述了一遍,下面我們把6個(gè)stage的腳本合并到一起,創(chuàng)建一個(gè)新的流水線任務(wù),體驗(yàn)下完整的應(yīng)用發(fā)布流程吧。
node(jnlp-slave) {
stage(Clone) {
echo "1.Clone Stage"
git branch: jenkins-cicd url: https://github.com/ucloud/uk8s-demo.git
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 uhub.service.ucloud.cn/jenkins_k8s_cicd/jenkins_k8s_cicd:${build_tag} ."
}
stage(Push) {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: uhub passwordVariable: uhubPassword usernameVariable: uhubUser)]) {
echo "${uhubPassword}"
echo "${uhubUser}"
sh "docker login -u ${uhubUser} -p ${uhubPassword} uhub.service.ucloud.cn"
sh "docker push uhub.service.ucloud.cn/jenkins_k8s_cicd/jenkins_k8s_cicd:${build_tag}"
}
}
stage(YAML) {
echo "5. Change YAML File Stage"
sh "sed -i s//${build_tag}/ k8s.yml"
}
stage(Deploy) {
echo "6. Deploy Stage"
sh "kubectl apply -f k8s.yml"
}
}
實(shí)時(shí)文檔歡迎訪問(wèn)https://docs.ucloud.cn/uk8s/bestpractice/cicd
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/126291.html
摘要:詳細(xì)請(qǐng)見(jiàn)產(chǎn)品價(jià)格產(chǎn)品概念使用須知名詞解釋漏洞修復(fù)記錄集群節(jié)點(diǎn)配置推薦模式選擇產(chǎn)品價(jià)格操作指南集群創(chuàng)建需要注意的幾點(diǎn)分別是使用必讀講解使用需要賦予的權(quán)限模式切換的切換等。UK8S概覽UK8S是一項(xiàng)基于Kubernetes的容器管理服務(wù),你可以在UK8S上部署、管理、擴(kuò)展你的容器化應(yīng)用,而無(wú)需關(guān)心Kubernetes集群自身的搭建及維護(hù)等運(yùn)維類(lèi)工作。了解使用UK8S為了讓您更快上手使用,享受UK...
摘要:宋體自年被開(kāi)源以來(lái),很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。宋體年月,樂(lè)心醫(yī)療的第一個(gè)生產(chǎn)用集群正式上線。所以于年推出后,樂(lè)心醫(yī)療的運(yùn)維團(tuán)隊(duì)在開(kāi)會(huì)討論之后一致決定盡快遷移到。Kubernetes 自 2014 年被 Google 開(kāi)源以來(lái),很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。因其支持自動(dòng)化部署、大規(guī)??缮炜s和容器化管理等天然優(yōu)勢(shì),已經(jīng)被廣泛接納。但由于 Kubernetes 本身的復(fù)雜性,也讓很多企業(yè)的...
摘要:最佳實(shí)踐使用方法及支持日志解決方案基于的實(shí)踐基于的監(jiān)控解決方案通過(guò)軟件一致性認(rèn)證已正式通過(guò)云原生計(jì)算基金會(huì)軟件一致性認(rèn)證。1、集群自動(dòng)伸縮 UK8S新上線集群自動(dòng)伸縮功能(Cluster Autoscaler),配置好伸縮策略后,可實(shí)現(xiàn)自動(dòng)擴(kuò)縮Node節(jié)點(diǎn),配合HPA(Horizontal Pod Autoscaler)一起使用,可輕松應(yīng)對(duì)突發(fā)的業(yè)務(wù)流量,降低IT運(yùn)營(yíng)成本,減輕運(yùn)維負(fù)擔(dān)...
摘要:宋體本文從拉勾網(wǎng)的業(yè)務(wù)架構(gòu)日志采集監(jiān)控服務(wù)暴露調(diào)用等方面介紹了其基于的容器化改造實(shí)踐。宋體此外,拉勾網(wǎng)還有一套自研的環(huán)境的業(yè)務(wù)發(fā)布系統(tǒng),不過(guò)這套發(fā)布系統(tǒng)未適配容器環(huán)境。寫(xiě)在前面 拉勾網(wǎng)于 2019 年 3 月份開(kāi)始嘗試將生產(chǎn)環(huán)境的業(yè)務(wù)從 UHost 遷移到 UK8S,截至 2019 年 9 月份,QA 環(huán)境的大部分業(yè)務(wù)模塊已經(jīng)完成容器化改造,生產(chǎn)環(huán)境中,后臺(tái)管理服務(wù)已全部遷移到 UK8...
閱讀 3546·2023-04-25 20:09
閱讀 3745·2022-06-28 19:00
閱讀 3066·2022-06-28 19:00
閱讀 3092·2022-06-28 19:00
閱讀 3185·2022-06-28 19:00
閱讀 2886·2022-06-28 19:00
閱讀 3057·2022-06-28 19:00
閱讀 2642·2022-06-28 19:00