架构师成长系列 | 云原生时代的 DevOps 之道
作者 | 郝樹(shù)偉(花名:流生)??阿里云高級(jí)研發(fā)工程師
本文整理自架構(gòu)師成長(zhǎng)系列 2 月17 日直播課程。
關(guān)注“阿里巴巴云原生”公眾號(hào),回復(fù)?“217”,即可獲取對(duì)應(yīng)直播回放鏈接及 PPT 下載鏈接。
導(dǎo)讀:DevOps 是一種軟件開(kāi)發(fā)人員和 IT人員之間的合作過(guò)程,目標(biāo)是高效地自動(dòng)執(zhí)行軟件交付和基礎(chǔ)架構(gòu)更改流程。在云原生時(shí)代,企業(yè)又如何借助 DevOps 實(shí)現(xiàn)產(chǎn)品快速、穩(wěn)定、高效和安全地迭代,釋放業(yè)務(wù)價(jià)值呢?
什么是云原生
為了解決傳統(tǒng)應(yīng)用升級(jí)緩慢、架構(gòu)臃腫、不能快速迭代、故障不能快速定位、問(wèn)題無(wú)法快速解決等問(wèn)題,云原生這一概念橫空出世。
Pivotal 是云原生應(yīng)用的提出者,并推出了 Pivotal Cloud Foundry 云原生應(yīng)用平臺(tái)和 Spring 開(kāi)源 Java 開(kāi)發(fā)框架,成為云原生應(yīng)用架構(gòu)中先驅(qū)者和探路者。
早在 2015 年 Pivotal 公司的 Matt Stine 就寫(xiě)了一本叫做遷移到云原生應(yīng)用架構(gòu)的小冊(cè)子,其中探討了云原生應(yīng)用架構(gòu)的幾個(gè)主要特征:
- 符合 12 因素應(yīng)用
- 面向微服務(wù)架構(gòu)
- 自服務(wù)敏捷架構(gòu)
- 基于 API 的協(xié)作
- 抗脆弱性
后來(lái) Pivotal 對(duì)云原生的定義做過(guò)幾次更新, 最新的 Pivotal 官網(wǎng)上對(duì)云原生應(yīng)用的最新介紹是關(guān)注以下四點(diǎn):
- 集成 DevOps
- 持續(xù)交付
- 微服務(wù)
- 容器化
-
DevOps 是軟件開(kāi)發(fā)人員和 IT 運(yùn)營(yíng)之間的合作,目標(biāo)是自動(dòng)執(zhí)行軟件交付和基礎(chǔ)架構(gòu)更改流程。它創(chuàng)造了一種文化和環(huán)境,可在其中快速、頻繁且更可靠地構(gòu)建、測(cè)試和發(fā)布軟件;
-
持續(xù)交付使得單個(gè)應(yīng)用更改在準(zhǔn)備就緒后即可發(fā)布,而不必等待與其它更改捆綁發(fā)布或等待維護(hù)窗口期等事件。持續(xù)交付讓發(fā)布行為變得平淡可靠,因此企業(yè)可以以更低的風(fēng)險(xiǎn)頻繁交付,并更快地獲得最終用戶的反饋,直到部署成為業(yè)務(wù)流程和企業(yè)競(jìng)爭(zhēng)力必不可少的組成部分;
-
微服務(wù)是將應(yīng)用作為小型服務(wù)集合進(jìn)行開(kāi)發(fā)的架構(gòu)方法,其中每個(gè)服務(wù)都可實(shí)施業(yè)務(wù)功能,在自己的流程中運(yùn)行并通過(guò) HTTP API 進(jìn)行通信。每個(gè)微服務(wù)都可以獨(dú)立于應(yīng)用中的其他服務(wù)進(jìn)行部署、升級(jí)、擴(kuò)展和重新啟動(dòng),通常作為自動(dòng)化系統(tǒng)的一部分運(yùn)行,可以在不影響最終客戶的情況下頻繁更新正在使用中的應(yīng)用;
-
與標(biāo)準(zhǔn)虛擬機(jī)相比,容器能同時(shí)提供效率和速度。單個(gè)操作系統(tǒng)實(shí)例使用操作系統(tǒng) 級(jí)的虛擬化,在一個(gè)或多個(gè)隔離容器之間進(jìn)行動(dòng)態(tài)劃分,每個(gè)容器都具有唯一的可寫(xiě)文件系統(tǒng)和資源配額。創(chuàng)建和破壞容器的開(kāi)銷(xiāo)較低,再加上單個(gè)虛擬機(jī)中的高包裝密度,使容器成為部署各個(gè)微服務(wù)的完美計(jì)算工具。
Google 主導(dǎo)成立了云原生計(jì)算基金會(huì)(CNCF),對(duì)云原生的定義為:
“云原生(Cloud Native)技技術(shù)幫助企業(yè)和機(jī)構(gòu)在公有云、私有云和混合云等新型動(dòng)態(tài)環(huán)境中,構(gòu)建和運(yùn)行可彈性擴(kuò)展的應(yīng)用。云原生的代表技術(shù)包括容器、 服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式 API;這些技術(shù)能夠構(gòu)建容錯(cuò)性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動(dòng)化手段,云原生技術(shù)可以使開(kāi)發(fā)者輕松地對(duì)系統(tǒng)進(jìn)行頻 繁并可預(yù)測(cè)的重大變更 。”
目前云原生背后最大的推手就是 CNCF,關(guān)鍵技術(shù)包括容器、微服務(wù)、服務(wù)網(wǎng)格、devops,聲明式的 API 等等。
云原生應(yīng)用與傳統(tǒng)應(yīng)用的對(duì)比,云原生應(yīng)用可以充分利用云的優(yōu)勢(shì),靈活地在各個(gè)云廠商分發(fā)應(yīng)用,釋放企業(yè)生產(chǎn)力,聚焦到業(yè)務(wù)創(chuàng)新上,而不是花費(fèi)更多的時(shí)間在適配和擴(kuò)展不同的基礎(chǔ)設(shè)施平臺(tái)上。
云原生時(shí)代的 DevOps 新挑戰(zhàn)
首先我們要清楚地知道, 站在企業(yè)的角度來(lái)看,在這樣一個(gè)快捷商業(yè)的時(shí)代,企業(yè)最需要什么?
- 唯快不破。這里的快可以解讀出來(lái)兩層含義,一是業(yè)務(wù)應(yīng)用快速上線,有利于搶占市場(chǎng)先機(jī),第二層意思就是在你的業(yè)務(wù)有爆炸式增長(zhǎng)的時(shí)候,你如何在計(jì)算資源上給以充分的保證,這個(gè)時(shí)候其實(shí)追加巨額的 IT 投資購(gòu)買(mǎi)軟硬件也未必能跟得上業(yè)務(wù)的快速發(fā)展。這個(gè)其實(shí)就是企業(yè)研發(fā)效能的問(wèn)題;
- 穩(wěn)中求變。業(yè)務(wù)或者應(yīng)用的穩(wěn)定性永遠(yuǎn)都是第一位的,如何既保證業(yè)務(wù)的“穩(wěn)態(tài)”又要滿足快捷商業(yè)的“敏態(tài)”需求,比如新業(yè)務(wù)的上線、應(yīng)用的變更等。這個(gè)是企業(yè) IT 架構(gòu)的問(wèn)題;
- 節(jié)省資源,如何節(jié)省計(jì)算資源,根據(jù)業(yè)務(wù)是否高峰自動(dòng)擴(kuò)容縮容,這個(gè)是云平臺(tái)建設(shè)的問(wèn)題;
- 開(kāi)拓創(chuàng)新,開(kāi)發(fā)運(yùn)維一體化、微服務(wù)架構(gòu)。
DevOps 最初的出現(xiàn)打破了開(kāi)發(fā)人員和運(yùn)維人員之間歷來(lái)存在的壁壘和溝鴻,加強(qiáng)了開(kāi)發(fā)、運(yùn)營(yíng)和質(zhì)量保證人員之間的溝通、協(xié)作與整合。在后 DevOps 時(shí)代,我們可以借助容器技術(shù)更快地對(duì)應(yīng)用進(jìn)行迭代上線。
下面是應(yīng)用發(fā)布的一般過(guò)程,開(kāi)發(fā)者 push 代碼,觸發(fā)構(gòu)建,構(gòu)建過(guò)程是拉取源碼,應(yīng)用打包,容器鏡像推送,部署。
這個(gè)模型其實(shí)已經(jīng)有很多地方充分利用了云原生的優(yōu)勢(shì),比如容器技術(shù)、Kubernetes、動(dòng)態(tài)分配 slave pod 等。但還有一些挑戰(zhàn)。
- 如何應(yīng)用在環(huán)境棧之間的安全推進(jìn)發(fā)布
- 如何管理應(yīng)用發(fā)布的權(quán)限和安全審批
- 如何提高應(yīng)用的平均部署時(shí)間和平均恢復(fù)時(shí)間
- 如何迅速對(duì)線上應(yīng)用進(jìn)行故障定位、復(fù)現(xiàn)和回滾
云原生時(shí)代下的 DevOps 之道
首先我們要充分利用云原生技術(shù)的優(yōu)勢(shì),云原生可以改進(jìn)應(yīng)用開(kāi)發(fā)的效率,改變企業(yè)的組織結(jié)構(gòu),甚至?xí)谖幕瘜用嫔现苯佑绊懸粋€(gè)公司的決策。在容器領(lǐng)域內(nèi),Kubernetes 已經(jīng)成為了容器編排和管理的社區(qū)標(biāo)準(zhǔn)。它通過(guò)把應(yīng)用服務(wù)抽象成多種資源類型,比如 Deployment、Service 等,提供了一個(gè)云原生應(yīng)用通用的可移植模型。
在這樣的背景下,我們?nèi)绾卧谠圃沫h(huán)境下實(shí)踐更高效的 DevOps 來(lái)達(dá)到更有生產(chǎn)力的表現(xiàn)就成為了一個(gè)新的課題和訴求。
下面是一個(gè)企業(yè)應(yīng)用平臺(tái)的建設(shè)目標(biāo):
在此 PaaS 平臺(tái)的基礎(chǔ)上,我們?cè)O(shè)計(jì)了 GitOps 安全發(fā)布模型來(lái)解決前面我們提到的一些挑戰(zhàn)。
在設(shè)計(jì) GitOps 發(fā)布模型的時(shí)候是有以下這些核心訴求的:
- 版本管理。我們希望每一個(gè)發(fā)布的應(yīng)用的版本號(hào)都能跟 git commit id 關(guān)聯(lián),這樣的好處就是每一個(gè)變更都有歷史記錄查詢、可以更快進(jìn)行故障定位和修復(fù);
- 基線管理。便于問(wèn)題復(fù)現(xiàn)和快速回滾;
- 安全發(fā)布。包括發(fā)布權(quán)限管理以及安全審批的內(nèi)容;
- 快速反饋。提高研發(fā)效能。
GitOps 發(fā)布模型有以下特性:
- Git 倉(cāng)庫(kù)是任何 CICD 過(guò)程的唯一輸入源
- 聲明式的應(yīng)用編排、構(gòu)建部署模型
- 應(yīng)用在環(huán)境棧之間的無(wú)差別、自動(dòng)化推進(jìn)
- PR/MR 觸發(fā)的拉取式流水線過(guò)程
- 快速反饋機(jī)制
下面是使用 GitOps 管理應(yīng)用發(fā)布到不同 Kubernetes 集群的架構(gòu)圖。
首先是應(yīng)用源碼與構(gòu)建源碼分離,我們可以看到橙色框起來(lái)的這兩個(gè)源碼項(xiàng)目,一個(gè)是我們的應(yīng)用源碼項(xiàng)目 application-java-demo, 左側(cè)的這個(gè)源碼項(xiàng)目是用來(lái)存放構(gòu)建源碼的,比如 preview pipeline 的 Jenkinsfile, staging pipeline 的 Jenkinsfile,production pipeline 的 Jenkinsfile, 除了 Jenkinsfile 之外,可能還有一些關(guān)于動(dòng)態(tài)創(chuàng)建測(cè)試環(huán)境、連接預(yù)發(fā)環(huán)境或者生產(chǎn)環(huán)境的敏感信息,這些敏感信息也可以存放在數(shù)據(jù)庫(kù)里,然后這里保存數(shù)據(jù)庫(kù)的連接信息。
這個(gè)普通應(yīng)用 application-java-demo 在 Git 倉(cāng)庫(kù)里是有不同的分支的,每個(gè)分支跟 Kubernetes 集群環(huán)境都有一定的對(duì)應(yīng)關(guān)系,比如我們這里的設(shè)定,master 分支對(duì)應(yīng)的是生產(chǎn)環(huán)境,latest 分支對(duì)應(yīng)的是預(yù)發(fā)環(huán)境,其他開(kāi)發(fā)分支對(duì)應(yīng)的是測(cè)試環(huán)境,測(cè)試環(huán)境的動(dòng)態(tài)創(chuàng)建和銷(xiāo)毀、應(yīng)用再測(cè)試環(huán)境的部署發(fā)布是開(kāi)發(fā)測(cè)試人員自助的服務(wù),但應(yīng)用想要部署到預(yù)發(fā)環(huán)境和生產(chǎn)環(huán)境中的話是需要經(jīng)過(guò)管理員安全審批的。
普通開(kāi)發(fā)者的權(quán)限只有創(chuàng)建新代碼分支和創(chuàng)建合并請(qǐng)求的權(quán)限,除此之外,剩下其他的部分都是管理員才有權(quán)限做的,綠色區(qū)域是 Jenkins 的流水線任務(wù),當(dāng)然你也可以是使用其他 cicd 引擎來(lái)做這個(gè)流水線任務(wù)的構(gòu)建。普通開(kāi)發(fā)者沒(méi)有 Jenkins 環(huán)境的創(chuàng)建 Job 和構(gòu)建 Job 的權(quán)限,也沒(méi)有更改配置的權(quán)限,他有的只是構(gòu)建 Job 的日志查看權(quán)限。
最后是一個(gè)時(shí)序圖,演示一個(gè)應(yīng)用從開(kāi)發(fā)測(cè)試到業(yè)務(wù)上線迭代的一個(gè)完整流程:
GitOps 是一套方法論,所以其實(shí)是有多種實(shí)踐的方式的,會(huì)有多種多樣的好用的工具,比如使用 draft 可以幫助完成應(yīng)用編排模板的自動(dòng)化生成,skaffold 用來(lái)簡(jiǎn)化應(yīng)用構(gòu)建部署流程,kaniko 可以實(shí)現(xiàn)不依賴 docker daemon 的鏡像構(gòu)建和推送,helm 用作應(yīng)用的包管理工具,還有其他 cicd 引擎像 jenkins,tekton,argo 以及為云原生而生的 jenkinsx 等等。
后面,我們會(huì)單獨(dú)實(shí)戰(zhàn)演示 GitOps 安全發(fā)布模型的工作過(guò)程。
參考文獻(xiàn):https://pivotal.io/cn/cloud-native
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢(shì)、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開(kāi)發(fā)者的技術(shù)圈。”
總結(jié)
以上是生活随笔為你收集整理的架构师成长系列 | 云原生时代的 DevOps 之道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开发函数计算的正确姿势———为 PHP
- 下一篇: 架构师成长系列 | 从 2019 到 2