摘要:在容器領(lǐng)域內(nèi),已經(jīng)成為了容器編排和管理的社區(qū)標(biāo)準(zhǔn)。就是的邏輯擴(kuò)展,它的核心目標(biāo)是為了更加高效和安全的應(yīng)用發(fā)布。第二個問題就是,生產(chǎn)環(huán)境的發(fā)布權(quán)限一般都是需要嚴(yán)格控制的,通常只有應(yīng)用管理員或者運(yùn)維管理員才有生產(chǎn)發(fā)布權(quán)限。
為了解決傳統(tǒng)應(yīng)用升級緩慢、架構(gòu)臃腫、不能快速迭代、故障不能快速定位、問題無法快速解決等問題,云原生這一概念橫空出世。云原生可以改進(jìn)應(yīng)用開發(fā)的效率,改變企業(yè)的組織結(jié)構(gòu),甚至?xí)谖幕瘜用嫔现苯佑绊懸粋€公司的決策,可以說,云時代的云原生應(yīng)用大勢已來。在容器領(lǐng)域內(nèi),Kubernetes已經(jīng)成為了容器編排和管理的社區(qū)標(biāo)準(zhǔn)。它通過把應(yīng)用服務(wù)抽象成多種資源類型,比如Deployment、Service等,提供了一個云原生應(yīng)用通用的可移植模型。在這樣的背景下,我們?nèi)绾卧谠圃沫h(huán)境下實(shí)踐更高效的DevOps來達(dá)到更有生產(chǎn)力的表現(xiàn)就成為了一個新的課題和訴求。
與GitOps這個概念相比,大家可能對DevOps的概念已經(jīng)耳熟能詳了。起初DevOps是為了打破開發(fā)測試、運(yùn)營這些部門之間的壁壘,通過自動化的構(gòu)建、程式化的腳本,最低限度減少人工誤差,一定程度上提高應(yīng)用版本的迭代效率;容器技術(shù)出現(xiàn)以后,輕量、標(biāo)準(zhǔn)化的能力使得DevOps技術(shù)才有了突飛猛進(jìn)的發(fā)展。不管技術(shù)怎樣更新迭代,DevOps最主要的核心訴求是不變的,那就是提高應(yīng)用迭代的頻率和降低成本。GitOps就是DevOps的邏輯擴(kuò)展,它的核心目標(biāo)是為了更加高效和安全的應(yīng)用發(fā)布。
首先我們提取出一些用戶在做devops的過程中遇到的痛點(diǎn)進(jìn)行分析。第一個問題是如何自動化推進(jìn)應(yīng)用在環(huán)境棧中的無差別發(fā)布.這里我列舉了三種環(huán)境,測試環(huán)境、生產(chǎn)環(huán)境和預(yù)發(fā)環(huán)境,對于一個應(yīng)用來說,我們通常的設(shè)定都是把不同分支部署到對應(yīng)環(huán)境,比如master分支的源碼對應(yīng)的是線上環(huán)境,latest分支對應(yīng)的是預(yù)發(fā)環(huán)境,其他開發(fā)分支對應(yīng)地部署到測試環(huán)境;目前大多數(shù)的做法是創(chuàng)建不同的job,拉取不同的源碼分支、部署到不同的環(huán)境,或者同一個job,通過添加不同的構(gòu)建參數(shù)來決定進(jìn)行怎樣的構(gòu)建和發(fā)布動作。 非常容易產(chǎn)生混亂和不便于管理。
第二個問題就是,生產(chǎn)環(huán)境的發(fā)布權(quán)限一般都是需要嚴(yán)格控制的,通常只有應(yīng)用管理員或者運(yùn)維管理員才有生產(chǎn)發(fā)布權(quán)限。我們在跟一些客戶的交流中發(fā)現(xiàn),一種方式是在同一套cicd環(huán)境中創(chuàng)建不同的job,然后通過基于角色訪問控制策略來做job的隔離,只有管理員權(quán)限的人員才能看到用于發(fā)布生產(chǎn)的job; 更直接的一種做法就是再建一套cicd環(huán)境專門做生產(chǎn)環(huán)境的發(fā)布, 但這樣既浪費(fèi)資源又降低了應(yīng)用迭代的頻率。
第三個問題是說我們想要提高應(yīng)用迭代的頻率進(jìn)而降低人力成本、時間成本、把精力放在新業(yè)務(wù)或創(chuàng)新業(yè)務(wù)的拓展上,但目前我們的開發(fā)測試人員在應(yīng)用運(yùn)行狀態(tài)或測試結(jié)果的同步與反饋上有一定的隔閡,另外一個是線上業(yè)務(wù)出現(xiàn)問題的時候,如何快速定位、復(fù)現(xiàn)和回滾,這是一個我們可以重點(diǎn)思考的地方。以上三點(diǎn)只是我列舉出來的我們用戶在實(shí)際使用cicd的過程中的一些痛點(diǎn)的子集,那接下來我們就帶著這些問題來看一下gitops模型的設(shè)計思路是怎樣的
我們在設(shè)計gitosp發(fā)布模型的時候是有以下這些核心訴求的:第一個是版本管理,我們希望每一個發(fā)布的應(yīng)用的版本號都能跟git commit id關(guān)聯(lián),這樣的好處就是每一個變更都有歷史記錄查詢、可以更快進(jìn)行故障定位和修復(fù),第二個是基線管理,這里我們一會兒會講到分兩種類型的基線,第三個是怎么做安全發(fā)布,包括發(fā)布權(quán)限管理以及安全審批的內(nèi)容;最后一個是如何讓開發(fā)測試人員快速獲取反饋
首先gitops的核心思想就是將應(yīng)用系統(tǒng)的聲明性基礎(chǔ)架構(gòu)和應(yīng)用程序存放在Git版本庫中,所有對應(yīng)用的操作變更都來源于Git倉庫的更新,這也是gitops這個名稱的由來。另外一個問題是,按照以往通用的做法,我們可能會把應(yīng)用如何構(gòu)建如何部署的腳本以及配置文件跟應(yīng)用源碼本身存放在同一個倉庫里,這樣帶來的問題有兩個,一是開發(fā)人員可能還需要維護(hù)這個部署腳本或配置文件,不能把精力集中到產(chǎn)品開發(fā)上,另外一個問題是部署腳本有時候會涉及環(huán)境敏感信息,安全性不夠,所以我們這里一定要把應(yīng)用源碼倉庫與構(gòu)建倉庫分開管理。
接下來就是基線管理,基線管理分兩種,一種是環(huán)境棧基線,如圖所示,我們的設(shè)定是,生產(chǎn)環(huán)境只能部署master分支的代碼,預(yù)發(fā)環(huán)境只能部署latest分支的代碼,預(yù)覽環(huán)境用來部署其他開發(fā)分支,這里有個名詞叫預(yù)覽環(huán)境,其實(shí)也就是測試環(huán)境,但我們會在開發(fā)分支通過測試、通過驗證成功合并到latest分支以后動態(tài)銷毀這個測試環(huán)境,當(dāng)然這在kubernetes容器集群下是非常容器做到的,在其他具體的場景下可以用不同的策略。這個基線我們可以把它稱為小基線,它是用來明確管理應(yīng)用在預(yù)覽、預(yù)發(fā)、生產(chǎn)環(huán)境中的推進(jìn)的。大基線是針對線上發(fā)布版本的管理的,這能保證我們在線上出現(xiàn)故障的時候能快速回滾到上一個穩(wěn)定的版本。這在生產(chǎn)發(fā)布管理中是必不可少的,在gitops中我們還能快速定位故障精確到某個git commit。
然后是應(yīng)用發(fā)布的權(quán)限管理和安全審批,gitops中的權(quán)限管理是通過代碼合并的控制來做的,在這個模型中,普通的開發(fā)人員沒有cicd環(huán)境比如jenkins的訪問權(quán)限,更精確地說的話是只有日志查看的權(quán)限,在git這一端,普通開發(fā)者只有向開發(fā)測試分支推送代碼的權(quán)限,并可以申請向latest分支合并代碼,即提交MR/PR的權(quán)限,當(dāng)普通開發(fā)者新建MR/PR后,就會觸發(fā)構(gòu)建把應(yīng)用部署到預(yù)覽環(huán)境,管理員通過查看這個新分支的構(gòu)建部署是否通過一系列測試和驗證來決定是否接受這個MR/PR, 只有管理員接受MR/PR的合并后,latest分支代碼才會重新構(gòu)建和部署到預(yù)發(fā)環(huán)境,這樣就通過MR/PR的接受和拒絕來達(dá)到應(yīng)用發(fā)布安全審批的目的。
最后是如何進(jìn)行快速反饋和團(tuán)隊成員間的互動,這包括兩部分內(nèi)容:一個是普通開發(fā)測試人員在推送源碼后,能通過郵件、釘釘、slack等工具實(shí)時地獲取構(gòu)建結(jié)果,對自己的應(yīng)用進(jìn)行高效開發(fā)測試,;另一方面是能在MR/PR的頁面上查看自動化測試的反饋結(jié)果、應(yīng)用預(yù)覽鏈接、其他團(tuán)隊成員的comment等。
下面是使用GitOps管理應(yīng)用發(fā)布到不同kubernetes集群的架構(gòu)圖和時序圖。首先是應(yīng)用源碼與構(gòu)建源碼分離。最上面有一條虛線,虛線上面是普通開發(fā)者能看到的,或者說是有權(quán)限進(jìn)行操作的部分,剩下其他的部分都是管理員才有權(quán)限做的,綠色區(qū)域是Jenkins的流水線任務(wù)。普通開發(fā)者沒有Jenkins環(huán)境的創(chuàng)建Job和構(gòu)建Job的權(quán)限,他有的只是構(gòu)建Job的日志查看權(quán)限。這個普通應(yīng)用是在Git倉庫里,它有不同的分支,有一定設(shè)定的關(guān)系,每次有構(gòu)建的時候會從另外一個Git倉庫里做,比如preview-plpeline、prod-plpeline,在這里面可以存放一些信息,只有應(yīng)用管理員才能看到,普通開發(fā)者沒有權(quán)限看到信息。 然后我們需要設(shè)置應(yīng)用發(fā)布環(huán)境棧,這在個示例中我們有預(yù)覽環(huán)境、預(yù)發(fā)環(huán)境、生產(chǎn)環(huán)境的設(shè)置,應(yīng)用在預(yù)發(fā)環(huán)境和生產(chǎn)環(huán)境中的發(fā)布是需要經(jīng)過管理員安全審批的。
最后是一個時序圖,開發(fā)人員提交新的feature,創(chuàng)建指向latest分支的MR,創(chuàng)建MR的動作會觸發(fā)preview-plpeline的構(gòu)建,構(gòu)建會拉取preview-plpeline的構(gòu)建倉庫,構(gòu)建倉庫存放的是構(gòu)建腳本以及要部署的環(huán)境信息。然后就是自動化的構(gòu)建流程,首先會從應(yīng)用源碼倉庫把應(yīng)用源碼拉取下來做構(gòu)建,靜態(tài)代碼測試、單元測試,測試結(jié)果會反饋到MR上,然后打包容器鏡像并把鏡像推送到鏡像倉庫,最后會把應(yīng)用通過文件部署到Kubernetes的集群里并進(jìn)行功能測試,測試結(jié)果反饋到MR上,部署之后會收集應(yīng)用相關(guān)信息,通過釘釘通知發(fā)送到開發(fā)群里。開發(fā)人員收到釘釘通知,可以直接點(diǎn)擊鏈接查看應(yīng)用狀態(tài),如果有問題,可以返回來自己重新開發(fā),再重新進(jìn)行提交,把前面的流程再走一遍,沒問題就可以請求管理員進(jìn)行審批,把代碼合并到latest分支。latest分支和master分支有更新時,就會觸發(fā)與前面的構(gòu)建類似的流程把應(yīng)用推進(jìn)到預(yù)發(fā)環(huán)境和生產(chǎn)環(huán)境。
閱讀原文
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/11488.html
摘要:擴(kuò)展性好當(dāng)集群的資源嚴(yán)重不足而導(dǎo)致排隊等待時,可以很容易的添加一個到集群中,從而實(shí)現(xiàn)擴(kuò)展。用法,選擇盡可能使用這個節(jié)點(diǎn)鏡像,填寫,這個容器鏡像是我們的運(yùn)行環(huán)境。更新文件,這里我們只是將中的鏡像更換成最新構(gòu)建出的鏡像。基于Jenkins的CI/CD實(shí)踐[TOC]一、概要提到K8S環(huán)境下的CI/CD,可以使用的工具有很多,比如Jenkins、Gitlab CI、新興的drone等,考慮到大多公司...
實(shí)踐性嘗試,這里只在一臺虛擬機(jī)下操作。 1.vmware 下centos 安裝 設(shè)置centos 橋接模式 參考:https://www.cnblogs.com/loven... 2.centos 軟件安裝 1) docker 安裝 yum install -y docker 2)JDK 安裝 參考:https://blog.csdn.net/evan_chen_1/article/de...
摘要:容器云的背景伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的和等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。 容器云的背景 伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的Dubbo和Spring Cloud等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。應(yīng)用從有狀態(tài)到無狀態(tài),具體來說將業(yè)務(wù)狀態(tài)數(shù)據(jù)如:會話、用戶數(shù)據(jù)等存儲到中間件中服務(wù)中。 showI...
閱讀 3920·2021-11-24 10:46
閱讀 1815·2021-11-16 11:44
閱讀 2289·2021-09-22 16:02
閱讀 1400·2019-08-30 15:55
閱讀 1130·2019-08-30 12:46
閱讀 565·2019-08-28 18:31
閱讀 2761·2019-08-26 18:38
閱讀 1093·2019-08-23 16:51