日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何基于 Kubernetes 构建完整的 DevOps 流水线

發(fā)布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何基于 Kubernetes 构建完整的 DevOps 流水线 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

關(guān)于 DevOps 是一個很大的話題,它可能既涉及到公司的技術(shù)文化構(gòu)建,也包括開發(fā)者技術(shù)能力的支持,這次技術(shù)干貨分享主要是側(cè)重于技術(shù)方面,就是如何用 Kubernetes 來服務(wù)好 DevOps 的流水線。本文從 4 個方面介紹:

  • 什么是 Kubernetes?為什么 Kubernetes 比較適合用來構(gòu)建 DevOps 的流水線?

  • 如何基于 Kubernetes 來構(gòu)建 DevOps 流水線?

  • 如何在 Azure 上面利用 AKS 去構(gòu)建 DevOps 流水線?

  • DevOps 中常見的一些挑戰(zhàn)。

  • 1. 什么是 Kubernetes?為什么 Kubernetes 比較適合用來構(gòu)建 DevOps 的流水線?

    Kubernetes 是目前最為廣泛且流行的容器編排調(diào)度系統(tǒng),它也是現(xiàn)在用來構(gòu)建云原生應(yīng)用編排的最佳平臺。目前所有云原生應(yīng)用基本上都會基于 Kubernetes? API 去構(gòu)建

    Kubernetes 給開發(fā)者帶來了很多實用的特性,比如一致性、可擴(kuò)展性、自我修復(fù)的功能。一致性是指在 Kubernetes 上構(gòu)建的應(yīng)用可以無縫的遷移到任何環(huán)境里,不論公有云、私有云還是跨云。可擴(kuò)展性是指把 Kubernetes 的插件機(jī)制運(yùn)用到任何環(huán)境里,通過 Kubernetes 這些插件都可以實現(xiàn)自定義化。Kubernetes 的自我修復(fù)功能,包括健康檢查、故障的自動恢復(fù)、自動擴(kuò)展等機(jī)制,這些對于系統(tǒng)運(yùn)行至關(guān)重要。

    Kubernetes 的架構(gòu)比較簡單,分為 Master 和 Node 兩部分。

    • Master 主要負(fù)責(zé)集群的狀態(tài)維護(hù),也給集群提供一個對外訪問的入口;

    • Node 負(fù)責(zé)運(yùn)行容器,為容器提供一些必要的環(huán)境,比如存儲、網(wǎng)絡(luò)等。

    Kubernetes 在 Master 上必備的組件只有四個,在 Node 上必備的組件,除了 Kubelet、Kube-proxy,還有 Docker 等。而其他所有的一切都是通過擴(kuò)展的方式部署到集群里,比如在部署一個集群時,DNS 是一個必需的功能,但這個功能是以一個容器的方式部署到集群里。

    由于 Kubernetes 架構(gòu)非常簡單。因此它有一些特別的好處,就是可以運(yùn)用到 DevOps 流水線里面來。以持續(xù)集成為例,在版本升級測試新的特性時,在 Kubernetes 之前可能要通過 IPM 包管理這些軟件,當(dāng)升級 IPM 包時,有可能產(chǎn)生沖突。而在 Kubernetes 中,通過把 IPM 包放到每一個容器里,避免軟件包的沖突問題。如果把每個應(yīng)用程序所依賴的東西都放到了容器里面,應(yīng)用程序在不同環(huán)境里就可以很容易保持一致。

    在 DevOps 里監(jiān)控系統(tǒng)很關(guān)鍵,而在 Kubernetes 中,通過一個 Pod 的方式運(yùn)行容器,應(yīng)用程序可以部署在 Pod 的一個容器里,其他的容器可以用在監(jiān)控里。

    在 DevOps 中經(jīng)常需要頻繁地發(fā)布、變更系統(tǒng),發(fā)現(xiàn)問題時需要回滾,而在頻繁的發(fā)布和回滾時,需要有一個系統(tǒng)去管理這些發(fā)布的歷史生命周期,在發(fā)現(xiàn)問題時才可以回滾回來。對于系統(tǒng)來說,要求它發(fā)布的過程中不能影響應(yīng)用程序?qū)ν庹TL問。在 Kubernetes 中已經(jīng)有了原生的機(jī)制,比如用 Service 和 Deployment 來完成這個功能,Service 可以提供一個對外訪問的入口,自動做好負(fù)載均衡;Deployment 負(fù)責(zé)管理好這些副本。如果需要升級,通過滾動升級的方式去部署。

    2. 基于 Kubernetes 的 DevOps

    DevOps 是把人員流程、產(chǎn)品進(jìn)行結(jié)合,給用戶提供持續(xù)價格的一個過程,這個過程既涉及到人員、過程,也涉及到產(chǎn)品。DevOps 最終目的是給客戶提供持續(xù)交付的價值,流程包括:產(chǎn)品的規(guī)劃跟蹤、軟件開發(fā)、構(gòu)建測試、產(chǎn)品部署、運(yùn)維、監(jiān)控和優(yōu)化,并通過一個流水線的方式串聯(lián)起來。因此通常把 DevOps 這些流程合并起來稱為一個 DevOps 的流水線。這個流水線的核心目標(biāo),就是持續(xù)給用戶交付有價值的產(chǎn)品。

    Kubernetes 如何服務(wù)好 DevOps 流水線?Kubernetes 的好處就是可以把不同的產(chǎn)品、工具串聯(lián)起來。以 CI/CD 里最常用的 Jenkins 為例:現(xiàn)在有一個 Jenkins-x 項目,實現(xiàn)了與 Kubernetes 的集成,利用 Kubernetes 的 CI/CD 實現(xiàn)了自定義的兌現(xiàn),有了這些資源兌現(xiàn),就可以通過 Kubernetes 的 API 來定義 CI/CD 的過程。

    另外如果使用 Kubernetes 構(gòu)建整個流水線,在監(jiān)控的時候就可以同樣選擇 Kubernetes 生態(tài)之中的項目,比如可以直接從 Prometheus 里獲得很多指標(biāo),去構(gòu)建想要的監(jiān)控告警,以及后續(xù)的對整個產(chǎn)品的優(yōu)化依據(jù)。基于這些工具,就可以構(gòu)建一個 DevOps 的流水線。

    一個比較典型的 DevOps 的流水線過程是:項目開始開發(fā)時,用 VS? Code 開發(fā)代碼,然后把代碼推送到 GitLab 里存儲,通過 GitLab 的 hook 使 Jenkins 執(zhí)行一些 CI 的過程,比如做一些單元測試,構(gòu)建 Docker? image,再把這個 Docker? image 調(diào)用 helm 部署到開發(fā)環(huán)境或測試環(huán)境中。在測試環(huán)境里通過 Jenkins 觸發(fā)一個集成測試的功能,完成后就可以把它部署到生產(chǎn)環(huán)境里,通過 Kubernetes addon 的方式,把 Prometheus、Grafana 等監(jiān)控組件部署到集群里,就實現(xiàn)了一整套從 CI 到 CD 的監(jiān)控過程。

    3. 基于 AKS 的 Devops

    AKS 是 Azure 提供的一個托管的 Kubernetes 服務(wù),因為很多人在接觸 Kubernetes 時發(fā)現(xiàn)它最大的痛點是 Kubernetes 的安裝部署和維護(hù)太麻煩。Kubernetes 發(fā)布特別快,在升級的過程中很容易出現(xiàn)各種問題,而 AKS 的出現(xiàn)可以解決這些問題。

    需要注意的是,AKS 只是提供了一個托管的 Kubernetes 服務(wù),也就是它只提供了一個 K8s 的集群,而為了運(yùn)行這個集群,還需要其他東西,比如要考慮 Docker? image 要存在哪里的問題。ACI 提供了跨地域自動復(fù)制的功能,因此 Docker? image 只要存到 ACI 里,就可以在不同的 Image 里使用。

    另外在 DevOps 的流水線里執(zhí)行任務(wù)時,這些任務(wù)都類似 Kubernetes 的一個 Job,比如在持續(xù)集成里做一個單元測試,這個單元測試可能運(yùn)行很短時間就結(jié)束了,但如果用 AKS,或者通過其他產(chǎn)品的 Kubernetes 集群來管理這套 DevOps 流程,要優(yōu)先保證最大的 Job 數(shù)量時,它才能夠正常的運(yùn)行。但是這會造成一定的資源浪費。

    ACI 是一種無服務(wù)器化的容器解決方案,用戶無需管理底層服務(wù)器,只需要調(diào)用它的 API 把一個容器運(yùn)行起來即可。另外如果運(yùn)行的程序還有一些數(shù)據(jù)要存儲,如果要訪問數(shù)據(jù)庫,就需要用 cosmosDB 等服務(wù),而它們已經(jīng)跟 AKS、Kubernetes 有了很好的集成,這些服務(wù)可以很方便地在 Azure 上使用。

    如何構(gòu)建一套比較完善的 DevOps 流水線呢?

    首先要創(chuàng)建項目,選擇最合適的產(chǎn)品來管理進(jìn)度,用 Azure? DevOps 把產(chǎn)品后面的代碼開發(fā)、單元測試和集成測試、持續(xù)部署等串聯(lián)起來。Azure? DevOps 提供了 Backlog 等工具來管理應(yīng)用程序。

    開發(fā)項目時,需要一套 Git 存儲倉庫,Azure? DevOps 也提供了這個功能。而項目開發(fā)完成之后,需要的本地測試可以使用 Draft,它的好處就是可以把進(jìn)項打包,再通過 Helm 部署到開發(fā)環(huán)境里,并且可以自動設(shè)置好應(yīng)用程序的遠(yuǎn)程調(diào)試。也就是讓應(yīng)用程序以容器的方式運(yùn)行在一個 Kubernetes 的環(huán)境中,但是可以通過 VS Code 在線調(diào)試程序。

    如果應(yīng)用程序在本地測試通過了,就需要推送到代碼倉庫里持續(xù)集成,然后需要部署到測試環(huán)境里做相應(yīng)的測試,最終再把它部署到生產(chǎn)環(huán)境里。當(dāng)這一切做完了以后,應(yīng)用程序就已經(jīng)在線上跑了,但這個時候 DevOps 流程并沒有結(jié)束,因為還需要運(yùn)維和監(jiān)控這個應(yīng)用程序。這個時候就可以 Azure monitor 監(jiān)控這個程序的狀態(tài)。

    4. DevOps 的挑戰(zhàn)

    DevOps 的挑戰(zhàn),首先就是自動化的測試不足。DevOps 流水線由于測試的投入不足,新發(fā)布的功能沒有測試到,這個時候發(fā)布到生產(chǎn)環(huán)境就容易出現(xiàn)各種各樣的問題。比如應(yīng)用程序部署之后,可用性降低了,資源使用率突然升的很高等。對于這個問題實際上可以通過一定的組織文化建設(shè)去解決。一個比較簡便的方式就是對這些過程提供適當(dāng)?shù)臏y試覆蓋率的要求。例如一個新的產(chǎn)品發(fā)布時,要求測試覆蓋率不能降低了,但是測試覆蓋率是比較難以控制的,可能要從組織文化上來解決。

    第二個問題就是DevOps 的工具鏈缺少鏈接,沒有鏈接就沒有辦法做到高度的自動化。比較推薦的做法是選用 Kubernetes 生態(tài)中的這些工具鏈,利用 Kubernetes? API 把應(yīng)用程序更好地串聯(lián)起來,形成完整的 DevOps 的流水線。

    第三個問題就是很難量化成果,以及很難協(xié)調(diào)團(tuán)隊之間的合作。比如用戶抱怨網(wǎng)站訪問速度慢了,由于當(dāng)下并不知道慢的問題在哪里,所以要到各個產(chǎn)品里去檢查。如果沒有一套完善的監(jiān)控系統(tǒng),就很難定位這個產(chǎn)品到底是該由誰去負(fù)責(zé)。針對這個問題可以使用 Kubernetes,在不改變應(yīng)用程序的情況下,跟蹤整個應(yīng)用程序的調(diào)用鏈,比如可以使用 ServiceMesh 監(jiān)控這些應(yīng)用程序,這樣可以減少發(fā)現(xiàn)問題之后沒法具體定位產(chǎn)品的瓶頸。

    最后一個問題就是在 DevOps 之中,雖然使用了 Kubernetes 的生態(tài)鏈工具,如果沒有遵循一些 Kubernetes/DevOps 的最佳實踐,會導(dǎo)致在實際操作中出現(xiàn)預(yù)想不到的問題。比如一個最簡單的問題,在升級的過程中可以用 Kubernetes 的 Deployment 來做滾動更新。按照正常的預(yù)期,在滾動更新的過程中,原來的副本還在正常運(yùn)行著,新副本也是逐步去創(chuàng)建著,Service 負(fù)載均衡也是正常運(yùn)行的。但問題是,Service 每次升級時總會時不時的斷一下,其可能用性在每次部署時,總會降低那么一點。產(chǎn)生這個問題就是因為沒有遵循 Kubernetes 最基本的最佳實踐,沒有給應(yīng)用程序部署健康檢查。對于最佳實踐的問題,實際上需要整個團(tuán)隊,不只是 DevOps 流水線的構(gòu)建團(tuán)隊,還需要應(yīng)用程序的團(tuán)隊共同把這些最佳實踐運(yùn)用到流水線和應(yīng)用程序的管理中。比如會出現(xiàn) Job 的失敗率非常高的問題,這時不僅要對應(yīng)用程序進(jìn)行資源的限制,另外對 DevOps 流水線里面的這些 Job 也要進(jìn)行一定的資源控制,不要把資源全部耗光。

    經(jīng)驗之談

    在 Kubernetes 中,不建議大家直接去管理一個 Pod,你之前創(chuàng)建了一個 Pod,而沒有使用控制器去管理它。在 Kubernetes 中,建議每一個 Pod 都有一個控制器來管理,比如你可以用 Deployment 來管理,或者使用副本控制器來管理。所有這些控制器都是用來保證 Pod 在預(yù)期的狀態(tài)。也可以使用自己的控制器去管理這些 Pod,通過開發(fā)一個 API 去管理生命周期。這樣容器最終在運(yùn)行狀態(tài)時,總是有一個控制器來管理,就不會出現(xiàn)一個容器在一直在運(yùn)行,卻不知道是誰在管理的問題。


    嘉賓簡介

    倪朋飛,就職于微軟 Azure,主要關(guān)注 Kubernetes 與微服務(wù),同時也是 Kubernetes 開源社區(qū) SIG Azure Tech Lead。作為 Kubernetes 項目維護(hù)者,同時負(fù)責(zé)維護(hù)開源書籍《Kubernetes 指南》。

    原文地址:https://www.infoq.cn/article/LtsomODk*whKEevGUhUp


    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


    總結(jié)

    以上是生活随笔為你收集整理的如何基于 Kubernetes 构建完整的 DevOps 流水线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。