版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
摘要本文深入分析了在Kubernetes環(huán)境中實(shí)施持續(xù)集成(CI)與持續(xù)部署(CD)的具體流程和實(shí)際操作。首先,文章介紹了如何利用GitLab、Jenkins、SonarQube和Harbor等工具來(lái)搭建一個(gè)自動(dòng)化的持續(xù)集成系統(tǒng)。這些工具的整合使得代碼構(gòu)建、測(cè)試和質(zhì)量評(píng)估能夠自動(dòng)進(jìn)行,顯著提升了開(kāi)發(fā)的效率和軟件的品質(zhì)。在討論持續(xù)部署的章節(jié)中,本文詳細(xì)說(shuō)明了如何使用JenkinsPipeline與Kubernetes配合,實(shí)現(xiàn)軟件的自動(dòng)部署。文章特別指出,通過(guò)采用灰度發(fā)布的策略,可以分階段在生產(chǎn)環(huán)境中部署新版本,有效地降低風(fēng)險(xiǎn)并確保系統(tǒng)的穩(wěn)定運(yùn)行。此外,還探討了如何利用Prometheus和Grafana進(jìn)行持續(xù)的性能監(jiān)控與管理,確保應(yīng)用在部署后的表現(xiàn)得到持續(xù)監(jiān)督。綜合這些方法和流程,文章不僅呈現(xiàn)了一套基于前沿技術(shù)的解決策略,還展示了通過(guò)融合多種工具與技術(shù)來(lái)構(gòu)建一個(gè)高效且可靠的自動(dòng)化軟件交付系統(tǒng)的過(guò)程。這些策略和實(shí)踐將協(xié)助軟件開(kāi)發(fā)團(tuán)隊(duì)提高產(chǎn)品的質(zhì)量與穩(wěn)定性,加快開(kāi)發(fā)周期,以更迅速地適應(yīng)市場(chǎng)的需求變化。關(guān)鍵字:Kubernetes;持續(xù)集成;持續(xù)部署;灰度發(fā)布ABSTRACTThisarticleprovidesanin-depthanalysisoftheprocessesandpracticesofimplementingcontinuousintegration(CI)andcontinuousdeployment(CD)inaKubernetesenvironment.First,thispaperintroduceshowtobuildanautomatedcontinuousintegrationsystemusingGitLab,Jenkins,SonarQube,Harborandothertools.Theintegrationofthesetoolsenablescodebuild,testing,andqualityassessmenttobeautomated,significantlyimprovingdevelopmentefficiencyandsoftwarequality.Inthechapteroncontinuousdeployment,thisarticledetailshowtouseJenkinsPipelineinconjunctionwithKubernetestoautomatesoftwaredeployment.Inparticular,thepaperpointsoutthatbyadoptingagrayscalereleasestrategy,thenewversioncanbedeployedinproductioninstages,effectivelyreducingriskandensuringstableoperationofthesystem.Inaddition,wediscussedhowtoleveragePrometheusandGrafanaforcontinuousperformancemonitoringandmanagementtoensurethatapplicationperformanceiscontinuouslymonitoredafterdeployment.Combiningthesemethodsandprocesses,thepapernotonlypresentsasolutionstrategybasedoncutting-edgetechnologies,butalsodemonstratestheprocessofbuildinganefficientandreliableautomatedsoftwaredeliverysystembyintegratingmultipletoolsandtechnologies.Thesestrategiesandpracticeswillhelpsoftwaredevelopmentteamsimproveproductqualityandstability,acceleratedevelopmentcycles,andadaptmorequicklytochangingmarketneeds.KEYWORDS:Kubernetes;Continuousintegration;Continuousdeployment;GrayRelease目錄第1章緒論 11.1 背景 11.2 目的和意義 1第2章相關(guān)技術(shù)介紹 11.1持續(xù)集成 12.1.1Gitlab代碼托管倉(cāng)庫(kù) 12.1.2SonarQube代碼質(zhì)量檢測(cè) 22.1.3Harbor本地倉(cāng)庫(kù) 22.1.4Jenkins 32.2持續(xù)部署 32.2.1Kubernetes應(yīng)用編排工具 32.2.2Docker容器技術(shù) 42.2.3Argorollouts灰度發(fā)布 42.3持續(xù)監(jiān)控 52.3.1Prometheus監(jiān)控工具 52.3.2Grafana可視化展示 5第3章系統(tǒng)設(shè)計(jì) 53.1設(shè)計(jì)目標(biāo) 53.2系統(tǒng)模塊 6第4章實(shí)現(xiàn)過(guò)程 74.1前置工作 74.1.1修改節(jié)點(diǎn)默認(rèn)主機(jī)名 74.1.2禁用Swap設(shè)備 74.1.3時(shí)間同步 84.1.4主機(jī)名稱地址解析 84.1.5禁用默認(rèn)的防火墻服務(wù) 94.2基于kubeadm部署K8s集群 94.2.1安裝容器運(yùn)行時(shí)(CRI)及其依賴 94.2.2安裝kubelet、kubeadm、kubectl 124.2.3初始化主節(jié)點(diǎn)master01 134.2.4加入其他控制平面節(jié)點(diǎn) 194.2.5加入work節(jié)點(diǎn) 204.2.6部署Addons 204.2.7搭建后端存儲(chǔ) 254.3部署工具 264.3.1部署gitlab 264.3.2部署jenkins自動(dòng)化工具 374.3.3部署SonarQube代碼質(zhì)量檢測(cè)工具 454.3.4部署Harbor本地鏡像倉(cāng)庫(kù) 554.3.5部署prometheus等監(jiān)控工具 564.3.6部署argorollouts 584.4持續(xù)集成 604.4.1項(xiàng)目初始化 604.4.2Gitlab對(duì)接Jenkins 614.4.3Jenkins對(duì)接SonarQube 624.4.4Harbor倉(cāng)庫(kù)初始化 644.4.5添加認(rèn)證憑據(jù) 654.5持續(xù)部署 674.5.1使用分布式構(gòu)建Pipeline流水線 674.5.2流程復(fù)現(xiàn) 724.5.3實(shí)現(xiàn)灰度發(fā)布 74第5章結(jié)論 815.1主要成果 815.2遇到的挑戰(zhàn)與解決方案 815.3未來(lái)發(fā)展方向 81[參考文獻(xiàn)] 82致謝 83PAGE19緒論背景在云計(jì)算和微服務(wù)架構(gòu)日益普及的今天,傳統(tǒng)的軟件開(kāi)發(fā)及運(yùn)維方式遭遇了前所未有的挑戰(zhàn)。市場(chǎng)的迅猛變化要求開(kāi)發(fā)流程更加靈活與高效。隨著敏捷開(kāi)發(fā)方法和DevOps文化的廣泛接受,持續(xù)集成和持續(xù)部署(CI/CD)已經(jīng)成為了軟件生命周期管理的核心。通過(guò)自動(dòng)化的構(gòu)建、測(cè)試和部署,CI/CD不僅提升了軟件交付的效率,還顯著提高了產(chǎn)品的質(zhì)量與穩(wěn)定性。在此背景下,一個(gè)穩(wěn)固的基礎(chǔ)平臺(tái)對(duì)于支持這些自動(dòng)化操作至關(guān)重要。作為當(dāng)下最先進(jìn)的容器編排工具,Kubernetes為搭建高效且可靠的CI/CD流程提供了完美的支撐。目的和意義本文旨在探討如何在Kubernetes環(huán)境中有效實(shí)施CI/CD流程。文中詳細(xì)闡述了利用Kubernetes及其配套工具(包括Docker、GitLab、Jenkins等)來(lái)構(gòu)建一個(gè)CI/CD系統(tǒng)的具體方法和步驟。本實(shí)踐提供了一個(gè)實(shí)用的框架,旨在幫助軟件開(kāi)發(fā)和運(yùn)維團(tuán)隊(duì)在構(gòu)建、測(cè)試和部署階段采用自動(dòng)化技術(shù),從而提升自動(dòng)化操作的效率。此外,本實(shí)踐的意義在于展示了一套基于最新技術(shù)的解決方案,這不僅優(yōu)化了軟件的開(kāi)發(fā)與交付流程,還通過(guò)深入分析Kubernetes在CI/CD應(yīng)用中的效益,使讀者了解如何整合多種工具和技術(shù)構(gòu)建出一個(gè)既高效又可靠的自動(dòng)化軟件交付系統(tǒng)。這將極大提高軟件的質(zhì)量與穩(wěn)定性,加速開(kāi)發(fā)流程,使企業(yè)更迅速地適應(yīng)市場(chǎng)的變動(dòng)。相關(guān)技術(shù)介紹持續(xù)集成Gitlab代碼托管倉(cāng)庫(kù)GitLab是一個(gè)開(kāi)源的協(xié)作平臺(tái),基于Git版本控制系統(tǒng),允許用戶進(jìn)行代碼倉(cāng)庫(kù)管理和項(xiàng)目協(xié)同工作。該平臺(tái)不僅涵蓋了從項(xiàng)目管理到代碼發(fā)布的全部軟件開(kāi)發(fā)階段,還包括代碼托管、審查、持續(xù)集成/部署(CI/CD)以及監(jiān)控和安全性評(píng)估等多方面功能。用戶在GitLab中可以輕松創(chuàng)建、查看和管理Git倉(cāng)庫(kù),存儲(chǔ)源代碼及項(xiàng)目相關(guān)文件,同時(shí)支持團(tuán)隊(duì)成員間的廣泛協(xié)作,包括處理合并請(qǐng)求、進(jìn)行代碼審查和展開(kāi)討論。此外,GitLab內(nèi)置的CI/CD工具集可以自動(dòng)化完成軟件構(gòu)建、測(cè)試和部署等關(guān)鍵任務(wù)。核心功能詳解:版本控制:GitLab使用Git進(jìn)行精細(xì)的版本管理,支持多種核心Git操作,如分支管理、合并、打標(biāo)簽等。項(xiàng)目管理:平臺(tái)提供多種工具支持項(xiàng)目管理,如看板系統(tǒng)、議題跟蹤、里程碑設(shè)置和時(shí)間線功能,以增強(qiáng)項(xiàng)目可視化和追蹤能力。自動(dòng)化DevOps流程:GitLab為DevOps實(shí)踐提供了從代碼提交至生產(chǎn)部署的完整自動(dòng)化管道,減少手動(dòng)干預(yù),加速交付周期。安全與合規(guī)性:內(nèi)置工具進(jìn)行代碼質(zhì)量檢測(cè)、安全漏洞掃描,并生成合規(guī)性報(bào)告,幫助團(tuán)隊(duì)提前發(fā)現(xiàn)并解決潛在安全問(wèn)題。廣泛集成:GitLab能夠與多種第三方應(yīng)用和服務(wù)集成,如JIRA、Jenkins、Kubernetes等,提升工作流的靈活性和效率。SonarQube代碼質(zhì)量檢測(cè)SonarQube是一個(gè)開(kāi)放源代碼平臺(tái),專門用于分析代碼質(zhì)量并執(zhí)行自動(dòng)化代碼審查。該平臺(tái)利用靜態(tài)分析技術(shù),來(lái)識(shí)別代碼中的錯(cuò)誤、安全漏洞及所謂的代碼異味(即不良的設(shè)計(jì)或編程實(shí)踐)。SonarQube支持多種流行編程語(yǔ)言,如Java、C#、C++、Python和JavaScript等。通過(guò)部署SonarQube,開(kāi)發(fā)團(tuán)隊(duì)能夠發(fā)現(xiàn)并修正代碼缺陷,從而提升代碼的可維護(hù)性和穩(wěn)定性。它可以無(wú)縫集成至CI/CD工作流中,自動(dòng)進(jìn)行源代碼質(zhì)量分析并即時(shí)反饋結(jié)果。SonarQube提供的用戶友好儀表盤展示了全面的代碼質(zhì)量報(bào)告,詳細(xì)包括代碼覆蓋率、代碼復(fù)雜度、重復(fù)代碼比例以及潛在的安全漏洞和代碼異味。這使得開(kāi)發(fā)者能夠有效地優(yōu)化代碼架構(gòu),顯著提高代碼的整體質(zhì)量。代碼質(zhì)量檢查自動(dòng)化:SonarQube可以在代碼提交到版本控制系統(tǒng)后自動(dòng)運(yùn)行,檢查每次提交的代碼質(zhì)量。可以設(shè)置SonarQube的質(zhì)量閾(QualityGates),只有當(dāng)代碼通過(guò)這些質(zhì)量檢查時(shí),才允許代碼進(jìn)入下一階段。這確保了只有質(zhì)量足夠高的代碼才能被部署。早期發(fā)現(xiàn)問(wèn)題:通過(guò)在CI流程中集成SonarQube,可以在開(kāi)發(fā)過(guò)程的早期階段發(fā)現(xiàn)潛在的代碼問(wèn)題,比如漏洞、代碼異味或復(fù)雜度過(guò)高的代碼塊,從而降低修復(fù)成本和時(shí)間。代碼審查輔助:SonarQube可以提供詳細(xì)的代碼質(zhì)量報(bào)告和改進(jìn)建議,幫助代碼審查者評(píng)估代碼的可維護(hù)性和性能,從而提高代碼審查的效率和效果。Harbor本地倉(cāng)庫(kù)Harbor是一個(gè)開(kāi)源的容器鏡像倉(cāng)庫(kù),用于存儲(chǔ)、管理、簽名和掃描Docker鏡像和Helmchart。為容器鏡像提供了一個(gè)集中的存儲(chǔ)和管理位置,可以與現(xiàn)有的CI/CD工具鏈集成,如Jenkins、GitLabCI/CD和docker等,以自動(dòng)化鏡像的構(gòu)建、測(cè)試和部署流程。通過(guò)使用harbor,有效地管理和分發(fā)容器鏡像,提高開(kāi)發(fā)和部署流程的效率,同時(shí)確保鏡像的安全性和合規(guī)性。JenkinsJenkins是一款開(kāi)源的自動(dòng)化服務(wù)器,專注于持續(xù)集成和持續(xù)部署(CI/CD)流程。這個(gè)平臺(tái)能夠自動(dòng)化執(zhí)行軟件開(kāi)發(fā)中的構(gòu)建、測(cè)試和部署工作,極大地幫助開(kāi)發(fā)團(tuán)隊(duì)及時(shí)發(fā)現(xiàn)并修復(fù)問(wèn)題,從而縮短開(kāi)發(fā)周期。Jenkins通過(guò)其廣泛的插件支持,可以與多種開(kāi)發(fā)、測(cè)試和部署工具無(wú)縫集成,滿足多樣化的軟件開(kāi)發(fā)需求。它提供了一個(gè)易于使用的界面,用戶可以輕松配置和管理自動(dòng)化工作流,且支持多平臺(tái)操作。得益于其強(qiáng)大的社區(qū)支持,Jenkins擁有一個(gè)龐大而活躍的插件生態(tài)系統(tǒng),使得它能夠不斷增強(qiáng)功能和提升適應(yīng)不同環(huán)境的能力。目前Jenkins具有兩種不同的自動(dòng)化流水線風(fēng)格,傳統(tǒng)的Freestyle項(xiàng)目和Pipeline。Freestyle項(xiàng)目是Jenkins的基本形式,允許用戶通過(guò)圖形界面來(lái)配置簡(jiǎn)單的構(gòu)建任務(wù),適合不需要復(fù)雜邏輯的簡(jiǎn)單自動(dòng)化過(guò)程。而Pipeline提供了一種復(fù)雜且強(qiáng)大的方式來(lái)定義整個(gè)構(gòu)建和部署過(guò)程,通過(guò)編寫代碼來(lái)管理流水線的各個(gè)階段。這種方法支持更復(fù)雜的持續(xù)交付需求,如并行執(zhí)行、多環(huán)境部署和流程控制。Pipeline通過(guò)“配置即代碼”的方式,將流水線定義存儲(chǔ)在版本控制系統(tǒng)中,從而實(shí)現(xiàn)了流水線的版本化和復(fù)用。這使Pipeline成為適合復(fù)雜項(xiàng)目自動(dòng)化的首選方式。持續(xù)部署Kubernetes應(yīng)用編排工具Kubernetes是一個(gè)開(kāi)源的容器應(yīng)用編排工具,用于自動(dòng)部署、擴(kuò)展和管理容器化應(yīng)用程序。它使得容器化應(yīng)用的部署和管理變得更加高效和自動(dòng)化,支持在物理或虛擬機(jī)上運(yùn)行的容器。Kubernetes的基本功能包括容器的部署、負(fù)載均衡、服務(wù)發(fā)現(xiàn)、自動(dòng)擴(kuò)縮容、自我修復(fù)和配置管理。它允許用戶通過(guò)聲明式的配置文件定義應(yīng)用的狀態(tài),然后Kubernetes會(huì)自動(dòng)將系統(tǒng)的實(shí)際狀態(tài)調(diào)整到用戶定義的期望狀態(tài)。在Kubernetes中,核心組件包括控制平面(包含API服務(wù)器、調(diào)度器、控制器管理器、etcd等)和工作節(jié)點(diǎn)(包含kubelet、kube-proxy、容器運(yùn)行時(shí)等)??刂破矫尕?fù)責(zé)維護(hù)整個(gè)集群的狀態(tài),調(diào)度應(yīng)用,處理事件等;工作節(jié)點(diǎn)則是運(yùn)行容器應(yīng)用的機(jī)器。用戶給出聲明式的資源定義,通過(guò)YAML或JSON配置文件來(lái)實(shí)現(xiàn),這些文件描述了應(yīng)用的期望狀態(tài),包括需要運(yùn)行的容器鏡像、所需資源數(shù)量、網(wǎng)絡(luò)策略等。當(dāng)這些配置文件被應(yīng)用到Kubernetes時(shí),API服務(wù)器會(huì)接收這些定義并保存到etcd中??刂破鲿?huì)監(jiān)視這些定義,并確保集群的當(dāng)前狀態(tài)與用戶定義的期望狀態(tài)相匹配。例如,如果定義了一個(gè)包含多個(gè)副本的Pod資源,調(diào)度器會(huì)啟動(dòng)相應(yīng)數(shù)量的Pod副本,kubelet會(huì)在工作節(jié)點(diǎn)上啟動(dòng)和管理這些Pod的容器。通過(guò)這種方式,Kubernetes將用戶的聲明性定義轉(zhuǎn)化為實(shí)際運(yùn)行的Pods,實(shí)現(xiàn)了應(yīng)用的自動(dòng)化管理和編排。這個(gè)過(guò)程包括調(diào)度、資源分配、健康檢查和自動(dòng)恢復(fù)等,使得應(yīng)用的部署和運(yùn)維更為高效和可靠。Docker容器技術(shù)Docker技術(shù)是一種容器化解決方案,它允許開(kāi)發(fā)者將應(yīng)用及其依賴打包到一個(gè)隔離的容器中,這個(gè)容器可以在任何支持Docker的環(huán)境中運(yùn)行。這種打包方式確保了應(yīng)用在不同環(huán)境中的一致性和可移植性,因?yàn)槿萜鲀?nèi)的軟件配置相同,無(wú)論它運(yùn)行在本地機(jī)器、測(cè)試環(huán)境還是生產(chǎn)環(huán)境。將Docker與Kubernetes(k8s)結(jié)合使用,可以實(shí)現(xiàn)強(qiáng)大的CI/CD流程。Docker用于創(chuàng)建和管理應(yīng)用的容器鏡像,而Kubernetes用于部署和管理這些容器。在CI/CD流程中,開(kāi)發(fā)人員首先將代碼更改提交到版本控制系統(tǒng),觸發(fā)自動(dòng)構(gòu)建過(guò)程,這時(shí)CI工具(如Jenkins)會(huì)啟動(dòng)構(gòu)建,并生成新的Docker鏡像。然后,這個(gè)鏡像被推送到Docker注冊(cè)中心。Kubernetes通過(guò)聲明式的配置來(lái)管理容器的部署和更新。在CI/CD流程中,一旦Docker鏡像被更新,Kubernetes可以自動(dòng)檢測(cè)到鏡像的新版本,并啟動(dòng)一個(gè)更新流程來(lái)部署新鏡像,這通常通過(guò)滾動(dòng)更新來(lái)完成,以確保應(yīng)用的持續(xù)可用性。在這個(gè)過(guò)程中,Kubernetes會(huì)逐步替換舊的容器實(shí)例為新的鏡像版本,如果新的容器實(shí)例正常運(yùn)行,更新會(huì)繼續(xù),直到所有容器都更新到新版本。這樣,結(jié)合Docker和Kubernetes可以實(shí)現(xiàn)應(yīng)用的自動(dòng)化構(gòu)建、測(cè)試、部署和監(jiān)控,使得整個(gè)軟件開(kāi)發(fā)和部署過(guò)程更加高效、可靠和可控。開(kāi)發(fā)團(tuán)隊(duì)可以更快地迭代和發(fā)布新版本,同時(shí)運(yùn)維團(tuán)隊(duì)也能保持應(yīng)用的穩(wěn)定性和可靠性。Argorollouts灰度發(fā)布ArgoRollouts是一個(gè)Kubernetes控制器,它提供了更高級(jí)的部署策略,如藍(lán)綠部署和灰度發(fā)布(也稱為金絲雀發(fā)布)。灰度發(fā)布是一種部署方法,它允許你逐漸向一小部分用戶推出新版本的應(yīng)用,而不是一次性向所有用戶發(fā)布。這樣可以降低每次發(fā)布帶來(lái)的風(fēng)險(xiǎn),因?yàn)槿绻掳姹境霈F(xiàn)問(wèn)題,只會(huì)影響到少數(shù)用戶,并且可以快速回滾。在結(jié)合Kubernetes和Docker的CI/CD流程中,ArgoRollouts可以這樣工作:構(gòu)建和容器化:開(kāi)發(fā)人員提交代碼更改后,CI工具(如Jenkins)觸發(fā)構(gòu)建過(guò)程,構(gòu)建應(yīng)用的Docker鏡像。鏡像倉(cāng)庫(kù):構(gòu)建完成后,將新的Docker鏡像推送到鏡像倉(cāng)庫(kù)。部署管理:在Kubernetes中使用ArgoRollouts來(lái)管理應(yīng)用部署。定義Rollout配置,它指定了如何逐步推出新版本的容器,例如開(kāi)始時(shí)只有一小部分流量路由到新版本?;叶劝l(fā)布:通過(guò)增加指向新版本的流量比例,逐漸將流量遷移至新版本。在每個(gè)階段,都可以監(jiān)控應(yīng)用的性能和健康狀態(tài),以確保新版本的穩(wěn)定性。評(píng)估和擴(kuò)展:如果新版本運(yùn)行良好,繼續(xù)增加流量直至完全切換到新版本。如果新版本出現(xiàn)問(wèn)題,可以快速回滾到舊版本,最小化對(duì)用戶的影響。通過(guò)ArgoRollouts,可以在Kubernetes環(huán)境中實(shí)現(xiàn)高級(jí)的部署策略,如灰度發(fā)布和藍(lán)綠部署,這樣做可以讓軟件發(fā)布更加安全,同時(shí)結(jié)合Docker和Kubernetes的CI/CD流程,可以實(shí)現(xiàn)自動(dòng)化的構(gòu)建、測(cè)試和部署,加快開(kāi)發(fā)周期,減少發(fā)布風(fēng)險(xiǎn)。持續(xù)監(jiān)控Prometheus監(jiān)控工具Prometheus是一個(gè)開(kāi)源的監(jiān)控系統(tǒng),它最初由SoundCloud開(kāi)發(fā),后來(lái)成為云原生計(jì)算基金會(huì)(CNCF)的一部分。用于收集和存儲(chǔ)在時(shí)間序列數(shù)據(jù)庫(kù)中的度量指標(biāo)數(shù)據(jù)。它通過(guò)拉取(pull)方式定期從配置的目標(biāo)(target)服務(wù)獲取指標(biāo)數(shù)據(jù),然后根據(jù)定義的規(guī)則評(píng)估這些數(shù)據(jù)以生成警報(bào)。Prometheus的核心特性包括支持多維度數(shù)據(jù)收集、提供強(qiáng)大的查詢語(yǔ)言PromQL來(lái)查詢和處理時(shí)間序列數(shù)據(jù),以及自動(dòng)服務(wù)發(fā)現(xiàn)機(jī)制,這使其特別適合用于監(jiān)控動(dòng)態(tài)的云環(huán)境和微服務(wù)架構(gòu)。此外,Prometheus可以與Alertmanager配合使用來(lái)處理警報(bào),還常與Grafana集成來(lái)提供數(shù)據(jù)的圖形化展示。在云原生生態(tài)系統(tǒng)中,特別是與Kubernetes集成時(shí),Prometheus可以有效地監(jiān)控集群資源使用情況、應(yīng)用性能和系統(tǒng)健康狀況,成為現(xiàn)代云基礎(chǔ)設(shè)施監(jiān)控的重要組成部分。Grafana可視化展示Grafana是一個(gè)開(kāi)源的度量分析和可視化工具,廣泛用于顯示和分析時(shí)間序列數(shù)據(jù)。它支持多種數(shù)據(jù)源,如Prometheus、InfluxDB、Graphite、Elasticsearch等,提供了豐富的圖形儀表板用于數(shù)據(jù)展示和監(jiān)控。Grafana與Prometheus結(jié)合使用時(shí),Prometheus充當(dāng)數(shù)據(jù)源角色,收集并存儲(chǔ)度量數(shù)據(jù),而Grafana用于查詢這些數(shù)據(jù)并將其以圖形的形式展示。這種組合使得用戶可以創(chuàng)建動(dòng)態(tài)的、實(shí)時(shí)更新的儀表板,以圖表、圖形或表格的形式直觀展示監(jiān)控?cái)?shù)據(jù),如系統(tǒng)的CPU、內(nèi)存使用率,網(wǎng)絡(luò)流量,或者應(yīng)用的請(qǐng)求響應(yīng)時(shí)間等。系統(tǒng)設(shè)計(jì)設(shè)計(jì)目標(biāo)本系統(tǒng)旨在實(shí)現(xiàn)一個(gè)基于Kubernetes的CI/CD流程,以提高軟件開(kāi)發(fā)和部署的效率和質(zhì)量。設(shè)計(jì)目標(biāo)主要包括以下幾點(diǎn):自動(dòng)化構(gòu)建與部署:通過(guò)集成GitLab、Jenkins等工具,實(shí)現(xiàn)代碼從提交到部署的全流程自動(dòng)化,縮短軟件的交付周期。質(zhì)量保障:集成SonarQube代碼質(zhì)量檢測(cè)工具,確保代碼質(zhì)量符合預(yù)定標(biāo)準(zhǔn),及時(shí)發(fā)現(xiàn)并修復(fù)代碼缺陷。持續(xù)監(jiān)控:利用Prometheus和Grafana進(jìn)行系統(tǒng)監(jiān)控,實(shí)現(xiàn)對(duì)部署后應(yīng)用性能的實(shí)時(shí)監(jiān)控和可視化,確保系統(tǒng)穩(wěn)定運(yùn)行。靈活的擴(kuò)展性:設(shè)計(jì)中考慮到系統(tǒng)的可擴(kuò)展性,比如監(jiān)控部分可以結(jié)合實(shí)際添加告警功能等,便于后續(xù)集成更多工具和優(yōu)化現(xiàn)有流程系統(tǒng)模塊圖STYLEREF1\s3SEQ圖\*ARABIC\s11流程架構(gòu)圖代碼倉(cāng)庫(kù)利用GitLab作為代碼倉(cāng)庫(kù)管理工具,支持代碼托管、代碼審查、項(xiàng)目管理等功能,為CI/CD流程提供基礎(chǔ)代碼管理。代碼質(zhì)量檢測(cè)集成SonarQube工具,自動(dòng)進(jìn)行代碼質(zhì)量檢測(cè),包括靜態(tài)代碼分析、代碼覆蓋率統(tǒng)計(jì)等,提高代碼質(zhì)量。容器鏡像倉(cāng)庫(kù)使用Harbor作為本地容器鏡像倉(cāng)庫(kù),提供鏡像存儲(chǔ)、管理、掃描和簽名等功能,確保鏡像的安全可靠。持續(xù)集成與持續(xù)部署采用Jenkins作為CI/CD的核心工具,結(jié)合Kubernetes動(dòng)態(tài)調(diào)度和容器化技術(shù),實(shí)現(xiàn)應(yīng)用的自動(dòng)化構(gòu)建、測(cè)試和部署。灰度發(fā)布與回滾通過(guò)ArgoRollouts工具支持灰度發(fā)布策略,可實(shí)現(xiàn)按比例逐步替換舊版本,及時(shí)回滾至穩(wěn)定版本以減少風(fēng)險(xiǎn)。監(jiān)控與告警利用Prometheus進(jìn)行系統(tǒng)和應(yīng)用的性能監(jiān)控,通過(guò)Grafana進(jìn)行數(shù)據(jù)可視化,結(jié)合Alertmanager實(shí)現(xiàn)告警機(jī)制,確保系統(tǒng)穩(wěn)定性。實(shí)現(xiàn)過(guò)程前置工作使用Vmware軟件,提前安裝好6臺(tái)linux主機(jī),OS基于Rocky8.7系統(tǒng)。k8s集群使用三主三從搭建,其中控制節(jié)點(diǎn)需要進(jìn)行高可用部署,而因?yàn)閞aft算法的特性,etcd數(shù)據(jù)庫(kù)需要奇數(shù)個(gè)節(jié)點(diǎn)配置,從而避免腦裂等相關(guān)問(wèn)題。所以綜合考慮下,控制平面(master)使用三個(gè)節(jié)點(diǎn),工作平面(node)使用三個(gè)節(jié)點(diǎn)(資源有限),所有主機(jī)位于同一個(gè)網(wǎng)段內(nèi),網(wǎng)段地址:/24?;九渲萌缦拢褐鳈C(jī)名稱IP地址CPU內(nèi)存硬盤系統(tǒng)k8s-master0123g200gRocky8.7k8s-master02823gk8s-master03823gk8s-node018416gk8s-node028416gk8s-node038416g圖表STYLEREF1\s4SEQ圖表\*ARABIC\s11虛擬機(jī)基本配置表修改節(jié)點(diǎn)默認(rèn)主機(jī)名為了便于管理集群中的各個(gè)節(jié)點(diǎn),保證每個(gè)節(jié)點(diǎn)的主機(jī)名稱具有唯一性,并且節(jié)點(diǎn)之間通信和主機(jī)名也有一定的關(guān)聯(lián)關(guān)系,因此這里將各個(gè)節(jié)點(diǎn)的hostname設(shè)置為表4.1的對(duì)應(yīng)名稱,對(duì)應(yīng)命令如下:hostnamectlset-hostnamek8s-masterxxx圖STYLEREF1\s4SEQ圖\*ARABIC\s11修改主機(jī)名禁用Swap設(shè)備部署集群時(shí),默認(rèn)kubeadm會(huì)先檢查當(dāng)前部署機(jī)器是否禁用了Swap設(shè)備,并在未禁用時(shí)會(huì)終止部署過(guò)程。因此,在主機(jī)內(nèi)存資源充裕的條件下,需要禁用所有的Swap設(shè)備。命令如下:[root@k8s-master01~]#sed-Ei"s/(.*)swap/#\1swap/g"/etc/fstab&&reboot修改完成之后重新啟動(dòng)系統(tǒng)圖STYLEREF1\s4SEQ圖\*ARABIC\s12禁用swap設(shè)備時(shí)間同步集群的時(shí)間需要高度一致,避免由此產(chǎn)生問(wèn)題。借助于chronyd服務(wù)設(shè)定各節(jié)點(diǎn)的時(shí)間精確同步。安裝chrony程序包并啟動(dòng)chronyd系統(tǒng)服務(wù),設(shè)定其隨系統(tǒng)引導(dǎo)自動(dòng)啟動(dòng)運(yùn)行。chronyd服務(wù)即能從默認(rèn)的時(shí)間服務(wù)器同步時(shí)間。命令如下:yuminstall-ychrony&&systemctlenable--nowchronyd圖STYLEREF1\s4SEQ圖\*ARABIC\s13安裝chronyd服務(wù)主機(jī)名稱地址解析出于簡(jiǎn)化配置步驟的目的,本實(shí)踐環(huán)境使用節(jié)點(diǎn)級(jí)hosts文件進(jìn)行各節(jié)點(diǎn)名稱解析,需要在每個(gè)節(jié)點(diǎn)上面修改/etc/hosts文件如下圖所示,其中為api-server的外部接入地址。/etc/hosts文件內(nèi)容如下所示:圖STYLEREF1\s4SEQ圖\*ARABIC\s14域名解析文件禁用默認(rèn)的防火墻服務(wù)默認(rèn)的防火墻規(guī)則會(huì)干擾各個(gè)節(jié)點(diǎn)之間相互通信,為了部署方便,這里對(duì)防火墻做禁用處理systemctldisable--nowfirewalld圖STYLEREF1\s4SEQ圖\*ARABIC\s15禁用防火墻服務(wù)至此部署集群的前置工作已經(jīng)準(zhǔn)備完成?;趉ubeadm部署K8s集群k8s的安裝有幾種,基于二進(jìn)制安裝、云端容器引擎、kubeadm安裝等方式,其中kubeadm是一個(gè)k8s官方提供的工具,它簡(jiǎn)化了Kubernetes集群的搭建和管理過(guò)程。它被設(shè)計(jì)用于快速部署Kubernetes集群,處理節(jié)點(diǎn)的引導(dǎo)和配置等任務(wù),而二進(jìn)制安裝過(guò)于復(fù)雜和繁瑣,基于云的安裝在這里本地環(huán)境下不適合,因此本環(huán)境使用kubeadm來(lái)簡(jiǎn)化安裝過(guò)程,重點(diǎn)在于探討持續(xù)集成和持續(xù)部署的實(shí)踐過(guò)程。安裝容器運(yùn)行時(shí)(CRI)及其依賴在Kubernetes1.20之前,kubelet使用名為dockershim的內(nèi)置組件直接與Docker通信。從Kubernetes1.20開(kāi)始,dockershim被棄用并計(jì)劃在未來(lái)的版本中移除,這就需要一個(gè)獨(dú)立的橋接程序來(lái)繼續(xù)支持Docker,這就是cri-dockerd的用途。Docker前文已經(jīng)介紹過(guò)了,這里不再贅述,而cri-dockerd是對(duì)接到docker和kubelet之間的一個(gè)中間層,主要功能如下:充當(dāng)CRI服務(wù)端:它實(shí)現(xiàn)了Kubernetes定義的CRI(容器運(yùn)行時(shí)接口),使得kubelet可以通過(guò)這個(gè)標(biāo)準(zhǔn)接口來(lái)管理Docker容器的生命周期。轉(zhuǎn)發(fā)請(qǐng)求到Docker:cri-dockerd接收來(lái)自kubelet的CRI調(diào)用并將這些請(qǐng)求轉(zhuǎn)發(fā)到Docker引擎,實(shí)現(xiàn)容器的創(chuàng)建、啟動(dòng)、停止、刪除等操作。安裝Docker-CE首先需要安裝docker-ce,步驟如下:Step1:安裝必要的一些系統(tǒng)依賴工具yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2Step2:添加軟件源信息,這里使用阿里云鏡像倉(cāng)庫(kù)來(lái)簡(jiǎn)短倉(cāng)庫(kù)文件下載時(shí)間yum-config-manager--add-repo/docker-ce/linux/centos/docker-ce.repoStep3:更改官方鏡像地址為阿里云的鏡像站點(diǎn)地址sudosed-I's++/docker-ce+'/etc/yum.repos.d/docker-ce.repoStep4:更新yum緩存并安裝Docker-CEyummakecachefast&&yum-yinstalldocker-ceStep5:開(kāi)啟Docker服務(wù)并設(shè)置為開(kāi)機(jī)自啟sudosystemctlenable--nowdocker安裝完成之后可以打印信息檢查一下Dockerinfo圖STYLEREF1\s4SEQ圖\*ARABIC\s16安裝docker配置阿里云鏡像加速Docker安裝完成后,由于默認(rèn)情況下都是去dockerHub官方鏡像倉(cāng)庫(kù)上去拉取鏡像,這里可以配置阿里云的鏡像加速地址:/etc/docker/daemon.json文件,添加如下行:圖STYLEREF1\s4SEQ圖\*ARABIC\s17配置鏡像加速添加完成之后重載配置并重啟docker:systemctldaemon-reload&&systemctlrestartdocker安裝cri-dockerd將github上官方的cro-dockerd包文件下載安裝即可,命令如下:curl-LO/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd-0.3.12-3.el8.x86_64.rpmrpm-icri-dockerd-0.3.12-3.el8.x86_64.rpm#啟動(dòng)cri-dockerdsystemctlenable--nowcri-docker安裝kubelet、kubeadm、kubectl在所有節(jié)點(diǎn)添加k8s鏡像源編輯/etc/yum.repos.d/kubernetes.repo文件圖STYLEREF1\s4SEQ圖\*ARABIC\s18添加鏡像源接著關(guān)閉selinuxsetenforce0#安裝組件,設(shè)置kubelet為開(kāi)機(jī)自啟yuminstall-ykubeletkubeadmkubectlsystemctlenablekubelet&&systemctlstartkubelet整合cri-dockerd配置cri-dockerd,確保其能正確加載到CNI插件編輯/usr/lib/systemd/system/cri-docker.service文件:sed-i"s@^ExecStart.*@ExecStart=/usr/bin/cri-dockerd--container-runtime-endpointfd://--network-plugin=cni--cni-bin-dir=/opt/cni/bin--cni-cache-dir=/var/lib/cni/cache--cni-conf-dir=/etc/cni/net.d--pod-infra-container-image=/google_containers/pause:3.9@g"/usr/lib/systemd/system/cri-docker.service重載配置文件并重啟cri-docker:systemctldaemon-reload&&systemctlrestartcri-docker初始化主節(jié)點(diǎn)master01該步驟開(kāi)始嘗試構(gòu)建Kubernetes集群的master節(jié)點(diǎn),配置完成后,各worker節(jié)點(diǎn)直接加入到集群中的即可。在運(yùn)行初始化命令之前先單獨(dú)獲取相關(guān)的鏡像文件,而后再運(yùn)行后面的kubeadminit命令,以便于觀察到鏡像文件的下載過(guò)程。命令如下:kubeadmconfigimageslist需要注意的是,這里默認(rèn)的官方鏡像倉(cāng)庫(kù)地址訪問(wèn)不到,需要指定國(guó)內(nèi)的鏡像地址圖STYLEREF1\s4SEQ圖\*ARABIC\s19指定國(guó)內(nèi)鏡像地址下載鏡像文件,cri-dockerd和docker-ce都提供了unixsock類型的socket地址,這會(huì)導(dǎo)致kubeadm在自動(dòng)掃描和加載該類文件時(shí)無(wú)法自動(dòng)判定要使用哪個(gè)文件。需要為kubeadm指定,命令如下:kubeadmconfigimagespull--cri-socketunix:///run/cri-dockerd.sock--image-repository=/google_containers圖STYLEREF1\s4SEQ圖\*ARABIC\s110拉取鏡像到此即可進(jìn)行master節(jié)點(diǎn)初始化。kubeadminit命令支持兩種初始化方式,一是通過(guò)命令行選項(xiàng)傳遞關(guān)鍵的部署設(shè)定,另一個(gè)是基于yaml格式的專用配置文件,后一種允許用戶自定義各個(gè)部署參數(shù),在配置上更為靈活和便捷。這里使用第二種基于init-kubeadm-kubernetes.yaml配置文件初始化。文件內(nèi)容如下:kubeadmconfigprintinit-defaults>init-kubeadm-kubenetes.yaml圖STYLEREF1\s4SEQ圖\*ARABIC\s111配置文件初始化初始化成功后打印如下信息:圖STYLEREF1\s4SEQ圖\*ARABIC\s112控制臺(tái)顯示信息設(shè)定kubectlkubectl是Kubernetes的主要命令行工具,它支持執(zhí)行系統(tǒng)部署以外的絕大多數(shù)管理任務(wù),是最頻繁使用的命令之一。要運(yùn)行kubectl,用戶必須通過(guò)API服務(wù)器進(jìn)行身份認(rèn)證和授權(quán)。當(dāng)使用kubeadm部署集群時(shí),它會(huì)生成一個(gè)具有管理員權(quán)限的配置文件位于/etc/kubernetes/admin.conf文件中。這個(gè)配置文件可以通過(guò)kubectl默認(rèn)的配置路徑$HOME/.kube/config被加載。此外,用戶還可以通過(guò)--kubeconfig選項(xiàng)在kubectl命令中指定配置文件的不同存放路徑。下面將管理員的認(rèn)證配置文件復(fù)制到root用戶的家目錄下,以便使用:圖STYLEREF1\s4SEQ圖\*ARABIC\s113提供配置文件部署網(wǎng)絡(luò)插件Flannel在Kubernetes環(huán)境中,Pod網(wǎng)絡(luò)的設(shè)置通常依賴于多種第三方插件。這些網(wǎng)絡(luò)插件的種類繁多,包括但不限于flannel、calico、canal和kube-router等。其中,flannel是由CoreOS開(kāi)發(fā)的一個(gè)簡(jiǎn)潔且易于使用的網(wǎng)絡(luò)解決方案。為了在Kubernetes集群中啟用Pod間通信,必須部署相應(yīng)的網(wǎng)絡(luò)插件。命令如下:kubectlapply-f/flannel-io/flannel/releases/latest/download/kube-flannel.yml此時(shí)查看kube-flannel查看資源是否完成部署kubectlgetpods-nkube-flannel圖STYLEREF1\s4SEQ圖\*ARABIC\s114部署flannel網(wǎng)絡(luò)插件可以看到pod已經(jīng)Running了,表示kube-flannel已經(jīng)正常運(yùn)行。加入其他控制平面節(jié)點(diǎn)為了構(gòu)建高可用的控制平面,可按照初始化控制平面第一個(gè)節(jié)點(diǎn)時(shí)輸出的信息,在額外的master02及master03節(jié)點(diǎn)上運(yùn)行添加命令,以完成控制平面其它節(jié)點(diǎn)的添加。命令如下:kubeadmjoin:6443--tokenxhofvi.ppooujaowh4u3bul--discovery-token-ca-cert-hashsha256:7aa56a9b12ddba37eaf639a89648e2ef045cceb35455dd20fd3d12696609c69f--control-plane--certificate-key61935952717882ef2656f24226579d308e8856badd824c1ee11be086e4e2c47b--cri-socketunix:///var/run/cri-dockerd.sock加入完成后打印以下信息即說(shuō)明成功加入集群圖STYLEREF1\s4SEQ圖\*ARABIC\s115控制臺(tái)顯示信息分別在master02和03上配置好kubectl到api-server的認(rèn)證信息,此時(shí)在master01查看kubectlgetnodes:圖STYLEREF1\s4SEQ圖\*ARABIC\s116檢查控制節(jié)點(diǎn)狀態(tài)可以看到另外兩個(gè)節(jié)點(diǎn)已經(jīng)成功加入加入work節(jié)點(diǎn)將work節(jié)點(diǎn)加入到集群中,需要使用主節(jié)點(diǎn)初始化后打印出來(lái)的token等信息加入,分別在node01-03上完成如下命令:kubeadmjoin:6443--tokenxhofvi.ppooujaowh4u3bul\ --discovery-token-ca-cert-hashsha256:7aa56a9b12ddba37eaf639a89648e2ef045cceb35455dd20fd3d12696609c69f#加入完成后打印以下信息圖STYLEREF1\s4SEQ圖\*ARABIC\s117控制臺(tái)顯示信息再次在任一master節(jié)點(diǎn)上使用kubectlgetnodes-owide,顯示如下:圖STYLEREF1\s4SEQ圖\*ARABIC\s118檢查集群狀態(tài)至此集群初始化完成部署AddonsMetalLBMetalLB是一款開(kāi)源的云原生負(fù)載均衡器實(shí)現(xiàn),可以在基于裸金屬服務(wù)器或虛擬機(jī)的Kubernetes環(huán)境中使用LoadBalancer類型的Service對(duì)外暴露服務(wù)。MetalLB核心功能的實(shí)現(xiàn)依賴于兩種機(jī)制:地址分配:基于指定的地址池進(jìn)行分配;對(duì)外公告:讓集群外部的網(wǎng)絡(luò)了解新分配的IP地址,MetalLB使用ARP、NDP或BGP實(shí)現(xiàn)kube-proxy工作于ipvs模式時(shí),必須要使用嚴(yán)格ARP(StrictARP)模式,因此,部署MetalLB之前,需要事先運(yùn)行如下命令,配置kube-proxy。kubectlgetconfigmapkube-proxy-nkube-system-oyaml|sed-e"s/strictARP:false/strictARP:true/"|kubectlapply-f--nkube-system隨后,部署MetalLB至Kubernetes集群,命令如下:kubectlapply-f/metallb/metallb/v0.14.4/config/manifests/metallb-native.yaml創(chuàng)建地址池MetalLB提供了名為IPAddressPool的自定義資源類型,它允許用戶以聲明式方式定義用于分給LoadBalancer的IP地址范圍。下面是一個(gè)IPAddressPool資源示例,它所選定的地址范圍是當(dāng)前集群節(jié)點(diǎn)網(wǎng)絡(luò)中的一個(gè)空閑地址空間。這里選擇本集群的00-10給其分配圖STYLEREF1\s4SEQ圖\*ARABIC\s119地址池配置創(chuàng)建二層公告機(jī)制將地址池中的某地址配置在某節(jié)點(diǎn)上,并以externalIP的形式分配給某LoadBalancer使用之前,需要向整個(gè)本地網(wǎng)絡(luò)通告該地址相關(guān)的ARP地址信息。將如下yaml的interfaces修改為集群中各節(jié)點(diǎn)上實(shí)際使用的接口名稱eth0圖STYLEREF1\s4SEQ圖\*ARABIC\s120arp通告IngressNginx在Kubernetes中,Ingress和IngressController(如ingress-nginx)是管理外部訪問(wèn)集群內(nèi)服務(wù)的關(guān)鍵組件。Ingress是Kubernetes的一個(gè)資源對(duì)象,它定義了外部請(qǐng)求如何訪問(wèn)集群內(nèi)的服務(wù)。Ingress為Kubernetes服務(wù)配置HTTP和HTTPS路由規(guī)則,使得從外部網(wǎng)絡(luò)訪問(wèn)集群內(nèi)部服務(wù)變得可能,并且可以配置復(fù)雜的路由規(guī)則。IngressController是實(shí)現(xiàn)Ingress規(guī)則的組件。它負(fù)責(zé)監(jiān)聽(tīng)KubernetesAPI服務(wù)器上的Ingress資源變化,并根據(jù)Ingress資源的定義來(lái)更新路由規(guī)則,以控制外部訪問(wèn)集群內(nèi)服務(wù)的流量。IngressController是作為集群中的Pod運(yùn)行。ingress-nginx是實(shí)現(xiàn)Ingress功能的一個(gè)常見(jiàn)的IngressController。它使用NGINX作為反向代理和負(fù)載均衡器來(lái)處理入站流量并根據(jù)定義的Ingress規(guī)則將流量路由到集群中的服務(wù)。總的來(lái)說(shuō),Ingress提供了一種從外部網(wǎng)絡(luò)到Kubernetes集群內(nèi)服務(wù)的訪問(wèn)機(jī)制,而ingress-nginx是實(shí)現(xiàn)這一機(jī)制的具體工具,具體則通過(guò)NGINX來(lái)處理和路由流量。使用以下命令部署ingress-nginx:kubectlapply-f/kubernetes/ingress-nginx/controller-v1.9.6/deploy/static/provider/cloud/deploy.yaml使用kubectlgetpods-ningress-nginx查看圖STYLEREF1\s4SEQ圖\*ARABIC\s121ingress-nginx狀態(tài)至此即可透過(guò)Ingress向集群外部發(fā)布應(yīng)用。MetricsServerMetricsServer用于為Kubernetes集群提供核心指標(biāo)API。使用以下命令部署metricsserverkubectlapply-f/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml這里需要將鏡像修改為國(guó)內(nèi)的鏡像,第二是MetricsServer基于https協(xié)議從各節(jié)點(diǎn)收集指標(biāo),同各節(jié)點(diǎn)的10250端口建立通信連接之前,它會(huì)驗(yàn)證各節(jié)點(diǎn)的數(shù)字證書。需要添加上一行---kubelet-insecure-tls跳過(guò)認(rèn)證運(yùn)行完成之后即可查看集群資源使用狀態(tài)信息圖STYLEREF1\s4SEQ圖\*ARABIC\s122集群資源使用狀態(tài)信息KuboardKuboard是用于管理多Kubernetes集群的開(kāi)源UI,使用命令部署:kubectlapply-f/iKubernetes/learning-k8s/master/Kuboard/deploy.yaml使用上面部署的ingress-nginx,創(chuàng)建一個(gè)ingress,讓外界訪問(wèn)時(shí),能通過(guò)ingress-nginx調(diào)度給后端的kuboard。此時(shí)宿主機(jī)host文件解析指向ingress-nginx的負(fù)載ip,ingress-nginx再將請(qǐng)求轉(zhuǎn)發(fā)給kuboard的pod,就不需要經(jīng)過(guò)kuboard的svc,起到反向代理的作用。宿主機(jī)訪問(wèn),結(jié)合前面部署的metric-serveraddons,成功獲取到集群的狀態(tài)信息圖STYLEREF1\s4SEQ圖\*ARABIC\s123kuboard界面搭建后端存儲(chǔ)使用nfs服務(wù)作為k8s集群的持久化存儲(chǔ)kubernetes集群支持多種方式去生成存儲(chǔ)卷供pod使用,比如pod內(nèi)部直接定義一個(gè)Emptydir(Pod對(duì)象上的一個(gè)臨時(shí)路徑)、hostpath(使用節(jié)點(diǎn)提供的路徑)、nfs(使用nfs服務(wù)提供的網(wǎng)絡(luò)存儲(chǔ)路徑)類型的儲(chǔ)存卷等,但是在pod內(nèi)部直接定義一個(gè)存儲(chǔ)卷有一些弊端,比如卷的生命周期只能跟隨pod的生命周期,不能持久化保存;用戶必須要足夠熟悉可用的存儲(chǔ)及其詳情才能在Pod上配置和使用卷等等。為此,k8s支持使用持久卷的方式去定義一個(gè)PersistentVolume(持久卷),然后在pod內(nèi)部直接定義一個(gè)PersistentVolumeClaim(持久卷申領(lǐng))就可以使用持久卷了,不再需要關(guān)注卷內(nèi)部的構(gòu)建細(xì)節(jié),但是pvc的定義多種多樣,不可能全部事先定義好pv。為此k8s還支持動(dòng)態(tài)制備pv的方式,事先創(chuàng)建好一個(gè)StorageClass(存儲(chǔ)類),里面保留著創(chuàng)建pv的模版,用戶只需要?jiǎng)?chuàng)建一個(gè)pvc定義好需要使用pv的規(guī)格(大小,性能等)綁定sc,sc就能動(dòng)態(tài)創(chuàng)建出一個(gè)pv并綁定到pvc,從而完成pod內(nèi)存儲(chǔ)卷的使用。這里使用nfs服務(wù)提供的路徑作為sc動(dòng)態(tài)制備pv時(shí)使用到的存儲(chǔ)路徑,在master01上搭建好nfs服務(wù),并對(duì)外暴露/data/nfs路徑圖STYLEREF1\s4SEQ圖\*ARABIC\s124部署配置nfs服務(wù)k8s原生不支持使用nfs動(dòng)態(tài)制備pv,要想使用nfs服務(wù)器作為后端存儲(chǔ),還需要安裝第三方的csi-nfs-driver驅(qū)動(dòng),去暴露給k8s集群csi-nfs的存儲(chǔ)調(diào)用接口。命令如下:kubectlapply-f/kubernetes-csi/csi-driver-nfs/tree/master/deploy/v4.6.0/隨后編寫nfs-storage-class.yaml文件并應(yīng)用:圖STYLEREF1\s4SEQ圖\*ARABIC\s125csi-nfs配置部署工具部署gitlab 將gitlab部署到k8s集群之中,需要編寫資源清單文件,這里將相關(guān)資源部署到gitlab命名空間下:01-namespace-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s12601-namespace-gitlab.yml文件內(nèi)容使用pvc申領(lǐng)三個(gè)存儲(chǔ)卷來(lái)分別對(duì)gitlab、postgresql、redis的數(shù)據(jù)進(jìn)行持久化存儲(chǔ):postgresql對(duì)gitlab中的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行存儲(chǔ),例如項(xiàng)目信息,元數(shù)據(jù),用戶數(shù)據(jù)等。Redis用來(lái)緩存部分熱點(diǎn)數(shù)據(jù),避免頻繁對(duì)后端數(shù)據(jù)庫(kù)IO操作,gitlab用來(lái)存儲(chǔ)git倉(cāng)庫(kù)里面的業(yè)務(wù)代碼數(shù)據(jù)等02-pvc-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s12702-pvc-gitlab.yml文件內(nèi)容創(chuàng)建一個(gè)secret,保存賬號(hào)密碼等敏感數(shù)據(jù),在接下來(lái)的deployment中直接引用此secret的值作為容器的環(huán)境變量03-secret-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s12803-secret-gitlab.yml文件內(nèi)容選定符合的工作負(fù)載型控制器對(duì)應(yīng)用進(jìn)行編排,使用deployment來(lái)編排,這里分別對(duì)三個(gè)應(yīng)用進(jìn)行編排:04-deployment-postgresql.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s12904-deployment-postgresql.yml文件內(nèi)容05-deployment-redis.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13005-deployment-redis.yml文件內(nèi)容06-deployment-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13106-deployment-gitlab.yml文件內(nèi)容并使用service關(guān)聯(lián)上具有g(shù)itlab、postgresql、redis標(biāo)簽的pod后端,可以提供一個(gè)訪問(wèn)的入口;07-service-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13207-service-gitlab.yml文件內(nèi)容使用ingress定義對(duì)外暴露gitlab,將域名綁定到gitlab-svc后端的pod,由ingress-nginx將此配置轉(zhuǎn)化成nginx的配置來(lái)實(shí)現(xiàn)此過(guò)程:08-ingress-gitlab.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13308-ingress-gitlab.yml文件內(nèi)容使用命令kubectlapply-f文件名,部署完成全部資源,隨后訪問(wèn),打開(kāi)gitlab:圖STYLEREF1\s4SEQ圖\*ARABIC\s134gitlab訪問(wèn)頁(yè)面部署jenkins自動(dòng)化工具將jenkins部署到k8s集群之中,需要編寫資源清單文件,這里將相關(guān)資源部署到j(luò)enkins命名空間下:01-namespace-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13501-namespace-jenkins.yaml文件內(nèi)容使用pvc申領(lǐng)兩個(gè)存儲(chǔ)卷來(lái)對(duì)配置數(shù)據(jù)和maven插件緩存進(jìn)行持久化存儲(chǔ),02-pvc-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13602-pvc-jenkins.yaml文件內(nèi)容storageClassName:nfs-csi賦權(quán)方面:遵循k8s的RBAC機(jī)制,創(chuàng)建一個(gè)clusterrole集群級(jí)別的角色,賦予該角色對(duì)應(yīng)的權(quán)限,并讓jenkins的pod使用jenkins服務(wù)賬號(hào),將集群角色和該服務(wù)賬號(hào)綁定,使得jenkins能在集群級(jí)別具有部署對(duì)應(yīng)資源的權(quán)限03-rbac-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13703-rbac-jenkins.yaml文件內(nèi)容選定符合的工作負(fù)載型控制器對(duì)應(yīng)用進(jìn)行編排,這里使用deployment來(lái)編排;04-deploy-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13804-deploy-jenkins.yaml文件內(nèi)容并使用service關(guān)聯(lián)上具有jenkins標(biāo)簽的pod后端,可以提供一個(gè)訪問(wèn)的入口;04-deploy-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s13904-deploy-jenkins.yaml文件內(nèi)容使用ingress定義對(duì)外暴露jenkins,將域名綁定到j(luò)enkins-svc后端的pod,由ingress-nginx將此配置轉(zhuǎn)化成nginx的配置來(lái)實(shí)現(xiàn)此過(guò)程:06-ingress-jenkins.yaml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14006-ingress-jenkins.yaml文件內(nèi)容使用命令kubectlapply-f文件名,部署完成全部資源,隨后訪問(wèn),打開(kāi)jenkins,添加一個(gè)pipeline自動(dòng)化流水線類型的項(xiàng)目:圖STYLEREF1\s4SEQ圖\*ARABIC\s141jenkins訪問(wèn)頁(yè)面部署SonarQube代碼質(zhì)量檢測(cè)工具將sonarqube部署到k8s集群之中,需要編寫資源清單文件,這里將相關(guān)資源部署到sonarqube命名空間下:01-namespace-sonarqube.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14201-namespace-sonarqube.yml文件內(nèi)容使用pvc申領(lǐng)兩個(gè)個(gè)存儲(chǔ)卷來(lái)分別對(duì)sonarqube、postgresql的數(shù)據(jù)進(jìn)行持久化存儲(chǔ):postgresql對(duì)sonarqube中的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行存儲(chǔ),例如項(xiàng)目信息,元數(shù)據(jù),用戶數(shù)據(jù)等。sonarqube用來(lái)存儲(chǔ)測(cè)試數(shù)據(jù)等02-pvc-sonarqube.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14302-pvc-sonarqube.yml文件內(nèi)容創(chuàng)建一個(gè)secret,保存賬號(hào)密碼等敏感數(shù)據(jù),在接下來(lái)的deployment中直接引用此secret的值作為容器的環(huán)境變量03-secret-sonarqube.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14403-secret-sonarqube.yml文件內(nèi)容選定符合的工作負(fù)載型控制器對(duì)應(yīng)用進(jìn)行編排,使用deployment來(lái)編排,這里分別對(duì)兩個(gè)應(yīng)用進(jìn)行編排:04-deployment-postgresql-sonar.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14504-deployment-postgresql-sonar.yml文件內(nèi)容05-deployment-sonarqube.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14604-deployment-postgresql-sonar.yml文件內(nèi)容并使用service關(guān)聯(lián)上具有sonarqube、postgresql、redis標(biāo)簽的pod后端,可以提供一個(gè)訪問(wèn)的入口;06-service-sonarqube-postgresql.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14706-service-sonarqube-postgresql.yml文件內(nèi)容使用ingress定義對(duì)外暴露sonarqube,將域名綁定到sonarqube-svc后端的pod,由ingress-nginx將此配置轉(zhuǎn)化成nginx的配置來(lái)實(shí)現(xiàn)此過(guò)程:07-ingress-sonarqube.yml文件內(nèi)容:圖STYLEREF1\s4SEQ圖\*ARABIC\s14807-ingress-sonarqube.yml文件內(nèi)容使用命令kubectlapply-f文件名,部署完成全部資源,隨后訪問(wèn),打開(kāi)sonarqube:圖STYLEREF1\s4SEQ圖\*ARABIC\s149sonarqube訪問(wèn)頁(yè)面部署Harbor本地鏡像倉(cāng)庫(kù)這里可以使用helm來(lái)安裝。Helm是Kubernetes的一個(gè)包管理工具,類似于Linux下的apt或yum。它允許用戶定義、安裝和升級(jí)運(yùn)行在Kubernetes中的應(yīng)用程序。Helm使用一種稱為“charts”的包格式,這些包含了運(yùn)行一個(gè)應(yīng)用所需的所有資源定義,如部署、服務(wù)、配置映射等。Helm讓部署和管理Kubernetes應(yīng)用變得更簡(jiǎn)單,用戶只需通過(guò)幾個(gè)命令就可以部署、更新和管理復(fù)雜的應(yīng)用。下載helm并解壓移動(dòng)至系統(tǒng)可執(zhí)行文件的目錄下,命令如下:curl-LOhttps://get.helm.sh/helm-v3.14.3-linux-amd64.tar.gztar-zxfhelm-v3.14.3-linux-amd64.tar.gzmvlinux-amd64/helm/usr/local/bin/helm添加harbor倉(cāng)庫(kù):helmrepoaddharborhttps://helm.goharbor.io指定安裝時(shí)自定義的一些配置信息,編寫harbor-values-yaml文件圖STYLEREF1\s4SEQ圖\*ARABIC\s150harbor-values-yaml文件內(nèi)容安裝harbor:helminstallharbor-fharbor-values.ymlharbor/harbor-nharbor安裝完成訪問(wèn),成功打開(kāi)harbor頁(yè)面:圖STYLEREF1\s4SEQ圖\*ARABIC\s151訪問(wèn)harbor頁(yè)面部署prometheus等監(jiān)控工具將prometheus部署到k8s集群之中,需要編寫資源清單文件,這里將相關(guān)資源部署到prometheus命名空間下:將下圖中的所有資源配置文件部署到k8s集群中即可,包含prometheus監(jiān)控,alertmanager告警,grafana展示,node-exporter采集節(jié)點(diǎn)指標(biāo),kube-state-metrics采集k8s集群指標(biāo):圖STYLEREF1\s4SEQ圖\*ARABIC\s152部署prometheus配置文件圖STYLEREF1\s4SEQ圖\*ARABIC\s153prom資源狀態(tài)部署完成后訪問(wèn),可以看到監(jiān)控的指標(biāo)數(shù)據(jù)正常抓取并展示出來(lái):圖STYLEREF1\s4SEQ圖\*ARABIC\s154訪問(wèn)grafana頁(yè)面部署argorollouts部署argorollouts直接使用官方提供好的資源清單:kubectlcreatenamespaceargo-rolloutskubectlapply-nargo-rollouts-f/argoproj/argo-rollouts/releases/latest/download/install.yaml會(huì)生成一個(gè)services/argo-rollouts-metrics、一個(gè)deployments/argo-rollouts,以及一組CRD,即自定義資源部署kubectlargorollout插件curl-LO/argoproj/argo-rollouts/releases/download/v1.6.6/kubectl-argo-rollouts-linux-amd64chmod+xkubectl-argo-rollouts-linux-amd64mv./kubectl-argo-rollouts-linux-amd64/usr/local/bin/kubectl-argo-rollouts圖STYLEREF1\s4SEQ圖\*ARABIC\s155部署argorollout部署dashboardkubectlapply-nargo-rollouts-f/argoproj/argo-rollouts/releases/latest/download/dashboard-install.yaml安裝生成的services/argo-rollouts-dashboard默認(rèn)監(jiān)聽(tīng)于TCP/3100端口圖STYLEREF1\s4SEQ圖\*ARABIC\s156部署dashboard自定義一個(gè)ingress,對(duì)外發(fā)布Dashboard的地址,即可使用對(duì)其進(jìn)行訪問(wèn)持續(xù)集成項(xiàng)目初始化Gitlab創(chuàng)建一個(gè)名為demoapp的空白項(xiàng)目,作為實(shí)驗(yàn)項(xiàng)目,把項(xiàng)目克隆地址記錄下來(lái)圖STYLEREF1\s4SEQ圖\*ARABIC\s157添加demoapp項(xiàng)目在idea創(chuàng)建一個(gè)簡(jiǎn)單的spring-boot項(xiàng)目,名為demoapp,作為實(shí)驗(yàn)項(xiàng)目,添加上述gitlab倉(cāng)庫(kù)為遠(yuǎn)程倉(cāng)庫(kù)。然后把代碼提交到本地的git倉(cāng)庫(kù),再推送到遠(yuǎn)程的gitlab倉(cāng)庫(kù),命令如下:gitremoteaddorigin/root/demoapp.gitgitadd.gitcommitgitbranch-Mmaingitpush-uforiginmain圖STYLEREF1\s4SEQ圖\*ARABIC\s158idea開(kāi)發(fā)demoapp項(xiàng)目推送完成可以發(fā)送一個(gè)合并請(qǐng)求(mergerequest)給項(xiàng)目管理者,請(qǐng)求合并分支,管理者同意合并請(qǐng)求之后推送上來(lái)的新分支和倉(cāng)庫(kù)原有的主分支合并在一起,推送上來(lái)的新分支刪除。Gitlab對(duì)接JenkinsGitlab添加一個(gè)合并請(qǐng)求事件的webhook對(duì)接到j(luò)enkins,當(dāng)有合并成功的事件發(fā)生時(shí),就會(huì)觸發(fā)webhook發(fā)送消息給jenkins,進(jìn)而結(jié)合jenkins端配置執(zhí)行拉取倉(cāng)庫(kù)源碼的操作圖STYLEREF1\s4SEQ圖\*ARABIC\s159webhook配置Jenkins對(duì)接SonarQube在sonarqube添加一個(gè)用戶,用于代碼質(zhì)量檢測(cè)環(huán)節(jié)SonarQubeScanner分析代碼,并將報(bào)告發(fā)送至SonarQubeServer;SonarQubeServer分析代碼檢測(cè)的結(jié)果是否符合預(yù)定義的質(zhì)量閾;通過(guò)(passed)或者失?。╢ailed)的結(jié)果發(fā)送回Jenkins上的SonarQubeScanner插件暴露的Webhook;質(zhì)量域相關(guān)的階段成功通過(guò)或可選地失敗時(shí),則Jenkinspipeline繼續(xù)后面的Stage;否則,pipeline將終止。在jenkins中配置sonarqube的地址和jenkins用戶的token:圖STYLEREF1\s4SEQ圖\*ARABIC\s160配置sonarqube服務(wù)地址在jenkins中還需要添加全局工具SonarQubeScanner,以便在構(gòu)建任務(wù)時(shí)自動(dòng)調(diào)用圖STYLEREF1\s4SEQ圖\*ARABIC\s161添加sonarqubescanner在SonarQube上添加webhook,以便于SonarQubeQualityGate回調(diào)鉤子告知jenkins檢測(cè)信息。Harbor倉(cāng)庫(kù)初始化在harbor倉(cāng)庫(kù)新增jenkins-dind用戶,添加到新建的mykubernetes項(xiàng)目倉(cāng)庫(kù)之中,角色為維護(hù)人員:圖STYLEREF1\s4SEQ圖\*ARABIC\s162harbor初始化添加認(rèn)證憑據(jù)Gitlab倉(cāng)庫(kù)拉取憑據(jù)由于demoapp倉(cāng)庫(kù)為私有庫(kù),Jenkins需要從遠(yuǎn)程庫(kù)拉取代碼則需要配置拉取憑據(jù)認(rèn)證到gitlab倉(cāng)庫(kù)之中圖STYLEREF1\s4SEQ圖\*ARABIC\s163jenkins配置gitlab倉(cāng)庫(kù)拉取憑據(jù)Harbor倉(cāng)庫(kù)推送憑據(jù)在jenkins中創(chuàng)建連接到harbor的憑據(jù),為賬號(hào)密碼類型,并在接下來(lái)的構(gòu)建過(guò)程中使用這個(gè)憑據(jù)完成鏡像的推送:圖STYLEREF1\s4SEQ圖\*ARABIC\s164Harbor倉(cāng)庫(kù)推送憑據(jù)KubernetesToken認(rèn)證憑據(jù)創(chuàng)建一個(gè)綁定了集群管理員角色的服務(wù)賬號(hào),并獲取到token添加到j(luò)enkins憑據(jù)之中,用于認(rèn)證到k8s之上部署應(yīng)用:[root@k8s-master01~]#kubectlcreateserviceaccountcicd-ndemoapp[root@k8s-master01~]#kubectlcreaterolebindingcicd--clusterrole=cluster-admin--serviceaccount=demoapp:cicd-ndemoapp[root@k8s-master01~]#cat>cicd.yml<<EOFapiVersion:v1kind:Podmetadata:name:cicdnamespace:demoappspec:containers:-image:ikubernetes/admin-box:v1.2name:sleepcommand:["/bin/sh","-c","sleep99999"]serviceAccountName:cicdEOF[root@k8s-master01~]#kubectlapply-fcicd.yml[root@k8s-master01~]#kubectlexec-itcicd-ndemoapp--cat/var/run/secrets/kubernetes.io/serviceaccount/token圖STYLEREF1\s4SEQ圖\*ARABIC\s165KubernetesToken認(rèn)證憑據(jù)持續(xù)部署使用分布式構(gòu)建Pipeline流水線在jenkins的demoapp項(xiàng)目中進(jìn)行自動(dòng)化的集成部署,需要定義一條流水線Pipeline來(lái)完成操作,一個(gè)流水線的實(shí)現(xiàn)過(guò)程可以分為若干階段stages,每個(gè)階段都包含若干步驟steps。Pipeline的執(zhí)行方式有很多種,比如jenkins單節(jié)點(diǎn)執(zhí)行,就是使用jenkins自己的pod內(nèi)部執(zhí)行完整個(gè)過(guò)程;jenkins分布式構(gòu)建,結(jié)合docker或者k8s集群,將構(gòu)建任務(wù)指派給agent來(lái)完成,流水線的每個(gè)階段都可以指定給不同的pod來(lái)完成,或者說(shuō)只定義一個(gè)pod,pod內(nèi)部包含若干個(gè)容器,每個(gè)階段由不同
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 庭院下水施工方案(3篇)
- 塔吊照明施工方案(3篇)
- 如何優(yōu)化志愿服務(wù)管理制度(3篇)
- 樓房夾層施工方案(3篇)
- 景區(qū)門票預(yù)訂系統(tǒng)管理制度
- 食品衛(wèi)生管理系列制度
- 2025云南臨滄市臨翔區(qū)委員會(huì)政策研究室城鎮(zhèn)公益性崗位人員招聘1人備考題庫(kù)及答案詳解(考點(diǎn)梳理)
- 罕見(jiàn)腫瘤的個(gè)體化治療藥物相互作用管理策略與優(yōu)化
- 2026江西九江市湖口縣第一批單位選調(diào)事業(yè)編制工作人員備考題庫(kù)及完整答案詳解一套
- 2025下半年四川內(nèi)江市威遠(yuǎn)縣緊密型縣域醫(yī)共體管理委員會(huì)招聘成員單位編外人員20人備考題庫(kù)及答案詳解一套
- 任捷臨床研究(基礎(chǔ)篇)
- 供應(yīng)鏈危機(jī)應(yīng)對(duì)預(yù)案
- DBJ41-T 263-2022 城市房屋建筑和市政基礎(chǔ)設(shè)施工程及道路揚(yáng)塵污染防治差異化評(píng)價(jià)標(biāo)準(zhǔn) 河南省工程建設(shè)標(biāo)準(zhǔn)(住建廳版)
- 砌筑工技能競(jìng)賽理論考試題庫(kù)(含答案)
- 水工鋼結(jié)構(gòu)平面鋼閘門設(shè)計(jì)計(jì)算書
- JJG 291-2018溶解氧測(cè)定儀
- 《抗體偶聯(lián)藥物》課件
- 《肺癌的診斷與治療》課件
- 音響質(zhì)量保證措施
- 神經(jīng)病學(xué)教學(xué)課件:腦梗死
- HY/T 055-2001折疊筒式微孔膜過(guò)濾芯
評(píng)論
0/150
提交評(píng)論