基于 KubeSphere 流水線的 GitOps 最佳實踐

背景

Kubesphere 3.3.0 集成了 ArgoCD,但與筆者目前使用的 K8S 版本不兼容。再者,目前 Kubesphere 中持續集成和流水線打通還是不太友好,也缺少文檔說明(可能是筆者沒有找到)。

目前遇到最主要的問題就是流水線制作完成的鏡像如何更新到 Git 倉庫,然后觸發 Application 的同步。

基于上述問題,目前有兩種方法:

  • ArgoCD 官方的argocd-image-updater[1](根據鏡像倉庫的鏡像 Tag 變化,完成服務鏡像更新)

  • Kubesphere 提供了一個 ks app update 工具[2](支持 Kubesphere v3.3.0 中 Application,不支持原生 ArgoCD Application)

為此筆者基于 Kubesphere v3.1.1 的流水線,根據筆者的場景,實現了 GitOps 的服務發布流程,作此記錄,暫且稱之為最佳實踐。

目標

基于 Kubesphere 的流水線:

  • 自動創建服務部署清單

  • 自動創建服務 pipeline

  • 提交到服務部署清單倉庫

  • 流水線風格統一

  • 通過服務流水線發布版本之后在一段時間內可以回滾

  • 實現 GitOps 方式管理服務部署清單和流水線清單,做到版本控制

設計

6d25df85730166d1b0424c0bc1716fe2.png54eb7c8fceb6fe5deb39ec06ac9714c8.png

GitLab 項目規劃

  • 服務源代碼和部署清單倉庫分離,方便做權限管理;

  • 模板倉庫 argocd-gitops-templates 是單獨的 GitLab 倉庫;

  • 每個 DevOps 項目對應一個 GitLab 倉庫。(倉庫名稱為 argocd-gitops-{devops 項目名});

  • 所有 GitLab 倉庫都放在同一個 GitLab Group 下;

  • 每個倉庫中包含了服務不同環境的清單,如:uat 和 prod;

  • 一個服務包含一個 pipeline Application 和服務部署清單 Application。服務部署清單通過 Application CR 管理;服務 pipeline 清單通過 pipeline Application CR 管理。

模板倉庫目錄結構

argocd-gitops-templates項目存儲了生成服務流水線和部署清單、argocd Application 的模板。

.
|--?app-manifests-templates
|???|--?go
|???|???|--?base
|???|???|???|--?deployment.yaml
|???|???|???|--?kustomization.yaml
|???|???|???`--?service.yaml
|???|???|--?canary
|???|???|???|--?deployment_overlay.yaml
|???|???|???|--?kustomization.yaml
|???|???|???`--?service_overlay.yaml
|???|???|--?ga
|???|???|???`--?kustomization.yaml
|???|???|--?kustomization.yaml
|???|
|--?application-templates
|???|--?README.md
|???|--?application-pipeline.yaml
|???`--?application.yaml
|--?pipeline-templates
|???`--?pipeline
|???????`--?ks-pipeline-jenkinsfile.yaml
|--?top-pipeline
|???|--?README.md
|???|--?dev
|???|???|--?application.yaml
|???|???|--?only-test-deploy-by-argo-top-pipeline.jenkinsfile
|???|???`--?pipeline
|???|???????`--?deploy-by-argo-top-pipeline.yaml
|???|--?prod
|???|???|--?application.yaml
|???|???|--?only-test-deploy-by-argo-top-pipeline.jenkinsfile
|???|???`--?pipeline
|???|???????`--?deploy-by-argo-top-pipeline.yaml
  • app-manifests-templates:包含 go、java、nodejs 的服務部署清單模板,使用 overlay 的方式 和 base 文件夾中的配置進行合并(利用 kustomize 工具實現),生成最終的部署清單。

  • application-templates:包含服務 argocd Application,服務 pipeline argocd Application 清單模板。

  • top-pipeline:包含 dev、prod K8S 集群中的 top pipeline 清單和管理它的 argocd Application。

  • pipeline-templates:包含了服務 pipeline 模板,整體用 Groovy 語法實現

注意:app-manifests-templates、pipeline-templates、application-templates,在發布 GitOps 服務時,執行 Top pipeline 生成服務 pipeline,會自動拷貝,并根據運行 Top pipeline 時輸入的參數生成清單,到服務對應的 GitLab 倉庫中。

服務部署清單倉庫目錄結構

例如:devops1 項目的 GitLab 部署清單倉庫目錄結構如下:

.
|--?README.md
`--?appsmanifests|--?kubeinfo-svc1|???|--?prod|???|???|--?application-pipeline.yaml|???|???|--?application.yaml|???|???`--?manifests|???|???????|--?base|???|???????|???|--?deployment.yaml|???|???????|???|--?kustomization.yaml|???|???????|???`--?service.yaml|???|???????|--?canary|???|???????|???|--?deployment_overlay.yaml|???|???????|???|--?kustomization.yaml|???|???????|???`--?service_overlay.yaml|???|???????|--?ga|???|???????|???|--?deployment_overlay.yaml|???|???????|???`--?kustomization.yaml|???|???????|--?kustomization.yaml|???|???????|--?pipeline|???|???????|???`--?ks-pipeline-jenkinsfile.yaml|???`--?uat|???????|--?application-pipeline.yaml|???????|--?application.yaml|???????`--?manifests|???????????|--?base|???????????|???|--?deployment.yaml|???????????|???|--?kustomization.yaml|???????????|???`--?service.yaml|???????????|--?canary|???????????|???|--?deployment_overlay.yaml|???????????|???|--?kustomization.yaml|???????????|???`--?service_overlay.yaml|???????????|--?ga|???????????|???|--?deployment_overlay.yaml|???????????|???`--?kustomization.yaml|???????????|--?kustomization.yaml|???????????|--?pipeline|???????????|???`--?ks-pipeline-jenkinsfile.yaml
  • 服務清單在 appsmanifests/{服務名}文件夾下。

  • 每個服務根據環境(用 top pipeline 創建服務流水線的時候需要選擇)又劃分為不同的文件夾。

  • 每個環境文件夾下有兩個 Application 清單,分別去管理 manifests 中的部署清單和 pipeline 清單。

  • canary、ga 文件夾根據 STAGE_LEVEL(用 top pipeline 創建服務流水線的時候需要選擇)的值會自動在 kustomization.yaml 中進行管理。

    注意:目前只提供最基本的部署清單:如果需要 Configmaps、Secrets、Ingress、增加環境變量、label 等,需要手動增加或修改。具體可以參考下面的實踐說明文檔:

Top Pipeline 流程

Top Pipeline 用來自動化創建 GitOps 倉庫,生成服務部署清單、pipeline CR 清單、Application CR 清單,將清單提交到 GitLab 倉庫,并將 Application 創建到 K8S 集群中。整體用 Groovy 語法實現。

3ed78fef3666b541e5235409993ce93d.png
流程

黃色部分為需要人為干預的,綠色為自動執行的。

每個服務的發布,流水線都隸屬于一個 DevOps 項目下,如果這個 DevOps 項目不存在,則需要手動新建。

如果存在,則需要手動點擊運行 top pipeline。

  • 輸入服務配置參數,點擊確定運行。c214cb65354a5f0d0238fa95ae860adc.png

  • 持久化參數信息:流水線運行時會將所填參數更新到 Pipeline CR 的 parameters 中(避免流水線執行失敗后,重新運行時,需要重填參數);

  • 流水線會自動獲取需要選擇的動態參數,需要人為選擇。

a426258a07da051b382a19f092a935ee.png
  • 檢查 GitLab 中是否存在該 DevOps 項目的倉庫,不存在會自動新建倉庫;

  • 自動克隆 模板倉庫,生成服務部署清單、pipeline CR 清單、兩個 Application CR 清單,提交到 GitLab

  • 自動執行kubectl apply -f {兩個 application yaml}創建 argocd Application CR;

服務 Pipeline 發布版本流程

1b1182d152fe1053650c4a56028cacfa.png

細節解析

Application 怎么創建?

通過 kubectl 命令行直接創建到 ArgoCD 所在 K8S 集群。

每個服務對應幾個 Application?

一個服務對應 2 個 Application,一個管理 pipeline CR,另一個管理 deployment 等部署清單。

流水線上編譯的鏡像 Tag 如何提交到 Git?

用 Git 命令行實現。

一個 DevOps 項目下的多個 Pipeline 同時運行,一定程度可能會提交失敗。比如:B 克隆代碼到本地,此時 A 提交一次,B 提交時就失敗,需要重新 pull 后再提交。所以需要加重試機制,失敗重新 pull。

容易提交沖突,所以需要先 pull 再 push,并增加失敗之后重試

CI 更新鏡像 Tag 到 GitLab 后,如何觸發 CD 同步?

開啟自動同步后,默認是 3~4 分鐘 sync,時間較長。如何及時觸發 CD 同步?

集成 argocd 命令行工具到 Agent 鏡像中,新建一個 gitops 賬號,并通過 RBAC 控制該賬號的權限。

執行 argocd sync 命令也可能失敗,需要加失敗之后重試

具體請參看:ArgoCD 用戶管理、RBAC 控制、命令行登錄、App 同步[3]

Agent 鏡像制作

kubesphere/builder-base:v3.2.2 鏡像中包含了 kustomize 和 Git,更新鏡像 Tag 時,用 base-3.2.2 作為 Pipeline Agent。

并將 argocd 命令行集成到上面鏡像中,生成新的鏡像:harbor.kubeinfo.cn/library/kubesphere/builder-base:v3.2.2-argocd

如何回滾

審核階段,如果點擊“終止”,將回滾上一個階段的鏡像版本。

正式環境發布之后(即流水線最后一步),可以點擊“終止”回滾到上一個鏡像版本(一般在新版本測試不通過的情況下點擊“終止”),如果 30 分鐘內沒有點擊,或者點了繼續,本次發布流程將結束。

回滾的時候,通過 git revert 命令回退某一次提交。

跨集群發布服務

沒有啟用 DevOps 系統的 K8S 集群中,不存在 pipeline CRD。

所以 pipeline 用單獨的 Application 管理,其中的 destination cluster 只能為 ArgoCD 所在的集群。

只要加入到了 argocd 中的 k8s 集群(即使沒有被 Kubesphere 納管),都可以走這一套 GitOps 流程,將服務部署到這個 k8s 集群中。

清單管理

目前采用 Kustomize,kustomize 利用 overlay 機制覆蓋某些配置,雖然在可定制化方面不如 helm,如:不支持模板語法和變量,但 helm 對于筆者來說太重。目前的場景采用 Kustomize,基本可以滿足需求。

kustomize 命令行用于更新 kustomization.yaml 中鏡像 Tag,以及校驗語法是否正確,避免語法不正確提交。

kustomize?edit?set?image?kubeinfo-svc=harbor-kubeinfo.cn/argocd/kubeinfo-svc:${DOCKER_TAG}

kustomize 已經在上面的 Agent 鏡像中包含。

實例數如何適配 HPA 自動伸縮

注釋掉 deployment 中的spec.replicas,argocd 將不管理 deployment 的實例數。

在 Kubesphere 中修改了清單,argocd 會還原嗎?

argocd Application 中有個 selfHeal 配置,表示:指定當僅在目標 Kubernetes 集群中更改資源且未檢測到 git 更改時(默認為 false) ,是否應執行部分應用程序同步。

所以當 K8S 資源對象被修改時,Git 中清單沒變化的情況下,不需要自愈修復,argocd 不會做還原;

但下一次流水線發布版本時,Git 上的清單會發生變化,此時 K8S 資源會被還原。

憑證統一

用 top pipeline 生成的流水線,有統一的格式,所以憑證必須統一。

DevOps 項目有很多,維護憑證成本很高。如何統一、自動化創建管理?如:harbor、argocd 的 gitops 賬戶、GitLab 的賬號憑證。

通過 kubed + kyverno 實現:在 kubesphere-devops-system 下創建的源 secret,將會自動同步到所有 devops project 下。

參考:如何跨命名空間共享 Secret 和 ConfigMap?Kubesphere 憑證如何同步?[4]

展望

引入了 GitOps,發現要做的東西更多了,但也確實帶來很多好處。本文旨在記錄分享筆者的 GitOps 落地經驗,有些方案細節可能只適用于筆者當前的場景,筆者也處于摸索階段。歡迎大佬們拍磚。

同時也期待 Kubesphere 服務的發布可以和流水線一條龍創建,將 GitOps 做的更易用,而不用在項目DevOps項目之間切換;同時將灰度發布集成到流水線、可以回滾。

參考資料

[1]

argocd-image-updater: https://argocd-image-updater.readthedocs.io/en/stable/

[2]

ks app update 工具: https://github.com/kubesphere-sigs/ks/blob/master/docs/app.md

[3]

ArgoCD 用戶管理、RBAC 控制、命令行登錄、App 同步: https://blog.csdn.net/ll837448792/article/details/125899955

[4]

如何跨命名空間共享 Secret 和 ConfigMap?Kubesphere 憑證如何同步?: https://liabio.blog.csdn.net/article/details/124973387

?點個在看集群永保穩定👇

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284560.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS微課1000例】0027:ArcGIS屬性表(dbf)轉Excel的4中方法

ArcGIS中的矢量數據Shapefile屬性表存放在后綴名為.dbf的文件中,它是GIS數據分析的核心,如果將屬性表轉為別的平臺使用,一般需要將其轉為Excel格式。本文以ArcGIS自帶矢量數據continent為例,講解dbf轉excel的常見4種方法。 文章目錄 1. 表轉Excel工具2. 直接打開3. 導出屬性…

微信公眾號自定義菜單直接跳轉到小程序指定頁面

首頁我們要先拿到需要的小程序的頁面地址:(如何拿到小程序頁面地址自行百度) 然后登錄公眾號后臺,添加自定義菜單: 菜單的路徑選擇“跳轉小程序” ,從綁定的小程序中選擇要跳轉的小程序,默認小程…

javascript高級程序設計 學習筆記 第五章 上

第五章引用類型的值(對象)是引用類型的一個實例。在 ECMAScript 中,引用類型是一種數據結構, 用于將數據和功能組織在一起。它也常被稱為類,但這種稱呼并不妥當。盡管 ECMAScript 從技術上講是一門面向對象的語言,但它不具備傳統的面向對象語言所支持的類和接口等基本結構。引用…

Windows Hook

啥是windows的鉤子?鉤子故名思議就是在嵌入到正常執行程序的功能。對于windows來說,每個系統和應用程序之間的交互是使用消息機制來進行。比如點擊應用程序上面的某個按鈕,就是發送了事件給了應用程序。windows鉤子的作用就是在事件發送給應用…

HTTP協議之Expect爬坑

前言今天,在對接一個第三方平臺開放接口時遇到一個很棘手的問題,根據接口文檔組裝好報文,使用HttpClient發起POST請求時一直超時,對方服務器一直不給任何響應。發起請求的代碼如下:using (var httpClient new HttpCli…

【ArcGIS微課1000例】0028:ArcGIS根據屬性快速分割生成多個shp文件

ArcGIS10.5及以上的版本提供了按屬性分割工具,(分析工具->提取->按屬性分割)工具。也可以使用10.2版本的分割工具,效果應該是一樣的。本文演示使用分割工具批量快速提取一個縣范圍內的多個鎮,生成多個鎮矢量shp數據。 擴展閱讀:【ArcGIS遇上Python】ArcGIS Python按…

Win11 恢復 Win10經典右鍵菜單 親測有效

管理員運行命令: reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重…

把一個字符串里符合表情文字標簽的地方全部替換為相應的圖片的方法

1、表情數據: var emotion [{"name": "Expression_1","text": "[微笑]"},{"name": "Expression_2","text": "[撇嘴]"},{"name": "Expression_3","text&…

【ArcGIS微課1000例】0029:ArcGIS繪制平行線(構造平行公路)

在實際工作中,有時需要繪制平行線,比如道路兩邊的邊界線,可以使用“平行復制”功能快速繪制平行線,本文介紹如何使用“平行復制”功能快速繪制平行線。 1. 加載公路矢量 加載配套實驗數據包中的數據0029.rar中的矢量數據:公路。 2. 生成平行公路 點擊“編輯器”→“開始…

2017年初隨想——幾個小目標

回顧往事很慘,展望未來渺茫 2016年不順的事情一籮筐,母親追求信仰(誤入歧途)導致父母離婚,父親又遭遇車禍,現在依然癱瘓在床,意識都尚未清醒,母親卻依然杳無音信。而我則剛工作2年半…

Win11 沒有磁盤清理工具,如何清理磁盤舊的windows.old文件

win11 磁盤右鍵沒有了“磁盤清理工具” 如果想清理文件,可以打開設置(WinI)系統—存儲—清理建議 您也可以打開“存儲感知”,系統會在需要時幫你自動清理文件。

腳本進階,函數調用實例練習

一、練習:腳本:判定192.168.0.200-192.168.0.254之間哪些主機在線,要求:1、使用函數來實現一臺主機的判定過程:2、在主程序中調用此函數判定指定范圍內的所有主機的在線情況,vim ping.sh#!/bin/bash#PING()…

.NET開發云原生應用,你只差給自己加個油

為什么要云原生(Cloud Native)Cloud表示應用程序位于云中,而不是傳統的數據中心;Native表示應用程序從設計之初即考慮到云的環境,原生為云而設計,在云上以最佳姿勢運行,充分利用和發揮云平臺的彈…

java成員變量的初始化

2019獨角獸企業重金招聘Python工程師標準>>> 類變量(static變量,不需要實例化對象也可以引用) 實例變量(非static變量,需要實例化對象) 局部變量(類的成員函數中的變量) 初始化方式: 構造函數初始化 變量聲明時初始化 代碼塊初始化 java自動初始化(在構造函數執行之…

Win11 的日歷 替代

Win11 的日歷雖然漂亮,卻少了很多小功能,特別是沒有秒鐘和日程的設計,讓用慣了 Win10 的小伙伴大呼不滿。原來曾經用過360帶的日歷,可惜不支持Win11,下面這個日歷是一款功能強大、顏值很高的小工具,能夠提供…

ReactNative--React簡介

React 基礎框架,是一些實現理念,不能用來做網頁的開發和手機應用的開發 React.js 用來做網頁開發 ReactNative 移動應用開發 在學習ReactNative之前,先學習React http://reactnative.cn/ 中文網 http://facebook.github.io/react-nativ…

【ArcGIS微課1000例】0030:ArcGIS利用MXD doctor工具分析并修復mxd地圖文檔

MXD Doctor 是一個獨立的應用程序,位于 ArcGIS Desktop 安裝目錄下的 Tools 文件夾中。該工具可用于分析已損壞的 .mxd 文件。根據分析結果,可將已損壞的 .mxd 文件中所包含的實體復制到新的或現有 .mxd 文件中。 可以從所有程序 > ArcGIS > Desktop 工具中打開 MXD Do…

分析一個 .NET 寫的 某 RFID標簽系統 CPU暴漲

一:背景 1. 講故事前段時間有位朋友說他的程序 CPU 出現了暴漲現象,由于程序是買來的,所以問題就比較棘手了,那既然找到我,就想辦法幫朋友找出來吧,分析下來,問題比較經典,有必要和大…

linux開機引導過程總覽

簡單的說,系統的啟動過程如下: 1.開機自檢: 按下電源按鍵后,計算機硬件會主動讀取BIOS加載硬件信息并進行硬件的自我測試,然后系統會根據BIOS里的啟動順序讀取第一個可啟動的設備,從而移交系統控制權&#…

CentOS關機與重啟命令詳解

2019獨角獸企業重金招聘Python工程師標準>>> Linux centos重啟命令: 1、reboot  2、shutdown -r now 立刻重啟(root用戶使用)  3、shutdown -r 10 過10分鐘自動重啟(root用戶使用)  4、shutdown -r 20:35 在時間為20:35時候重啟(root用戶使用)如果…