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