一、概述
1、通過以往的學習應該可以了解到k8s 和以往提到的devops概念更容易落地了。比如我們說的CI,CD,CD
CI(Continuous Integration):持續集成
CD():持續交付
CD(Continuous Deployment):持續部署
2、早期作為運維手工來實現發布和部署來講我們一周發布一次就很頭疼了,如果是持續部署的話一天可能要部署好幾次甚至幾十次。即當我們應用程序的程序員寫完代碼以后從本地推送到gitlab或者github之上,而后由對應的監控工具資源監視着事件的發生,一旦發生提交了新代碼就自動的去做某些操作,比如用一些所謂的CI的工具從倉庫中拖下來后做靜態檢查,做預部署的測試,測試完后沒問題了就開始打包,打包后就發給測試,由測試部署到測試環境中,這時候就需要部署了,有些是不用部署就能測試,有些是需要部署到測試環境中來實現在線測試。所以我們做一些部署后測試。因此就有這些步驟。
3、一共大概有如下步驟:首先推送代碼到倉庫。然后使用CI或CD工具把代碼拖下來做靜態分析。然后做一些部署前測試,即不用打包就可以做的測試。比如掃描一下代碼的完整性等等。然后就開始打包發給QA,由QA手動或自動部署到QA環境中。然后做部署后測試,如果沒問題就可以發給我們的相關的安裝部署人員,就可以交付給我們的生產環境中的運維工程師開始發布到線上去了。所以這個時候如果從開始代碼推送到后面的靜態分析,打包前測試,打包后測試都是自動就稱之為CI,如果隨后交付給運維工程師這個過程也能通過一些工具自動實現我們通常就稱之為CD。運維工程師拿到后就開始發布,比如灰度,藍綠,金絲雀等,發布上去以后如果沒問題就可以跑起來了。即如果連部署也能自動執行,比如他們交付完以后由我們的發布系統自動實現將新版本通過灰度或金絲雀或藍綠的方式發布到線上去這種方式我們就稱之為CD即持續部署。這些動作到今天為止每一步都可以使用工具來實現,比如像版本控制系統,svn,vcs,git等。另外就是一些持續集成工具,比如像jenkins等。另外其還需要構建工具去實現我們代碼的構建,包括編譯,打包等,比如我們的make,cmake,maven,ant等。打包后的測試我們就需要相應的測試套件來實現,比如我們的單元測試,系統測試,回歸測試等等。
4、如果我們要結合我們k8s環境做一套CI CD的環境的話大概如下圖。我們的研發人員push代碼到git,然后我們使用jenkins用於做CI整合工具來做構建測試等,沒問題后就生成應用程序然后將應用程序打包成docker鏡像。然后推到docker registry即harbor上,然后就可以被k8s從中拖下來進行部署了。如果我們把這一整套流程集中起來能用一個一整套的自動化功能來完成的話那就是所謂的CD即持續部署。我們從推送代碼到git倉庫上然后用jenkins自動把其pull下來進行構建,構建完了以后他就是一個應用程序包了,然后我們接下來讓想辦法給其生成dockerfile,只有結合dockerfile和application 才能build成鏡像文件。第二步,我們開發人員還要開發第二套組件,即為我們的應用程序寫一個配套的dockerfile,dockerfile開發完成后需要Push到另外一套git倉庫上,當我們提供完以后把應用程序構建完了結合dockerfile利用docker build把對應的dockerfile拖下來,應用程序也有了,可直接打包為docker鏡像。打包完以后我們給其推送到harbor上去就完了。我們要想把應用程序部署到k8s之上k8s怎么才能完成部署呢?因此我們要有配置清單,如果我們寫好了配置清單,比如寫了helm,我們把其定義成chart,把應用程序打包成鏡像以后我們再開發好一個chart模板放在那里,這個chart不變,在傳遞時把chart版本換上就行了。或者把鏡像文件版本換了就行。![img]
5、還有一種簡單的方式,我們程序員也可以寫好我們的manifests,部署時這個manifests模板用ansible或者用其它工具或Go,此處他要做的有兩重作用,第一,做模板引擎渲染,即把模板中那些代碼替換成他應該替換的對應的值,比如我們這個manifests為了能夠做到部署多種不同的應用程序,比如我這里推到一個dockerfile中鏡像標簽什么的都換了,因此我們把這個信息結合manifests和ansible模板引擎對manifests完成渲染而后就可以用ansible再指揮着我們k8s拖鏡像來更新了。這個過程一系列文件都要准備好,而后才會觸發這些組件自動工作,而我們ansible去渲染我們manifests這個組件可能不會,默認他自己都做不了。如果可以的話可以把此段結合python 實現CI CD進行發布。
二、生產環境部署k8s,接下來我們描述一下在真正生產環境中我們部署k8s應該部署成什么樣子
1、我們要部署k8s要么是在裸機上要么是在虛擬機或公有雲私有雲等都是支持的。這就是基礎架構(Core Infrastructure),在基礎架構上我們要有網絡工程師幫我們去部署好基礎網絡環境和存儲工程師幫我們部署好存儲環境(Network和Storage),一般來說這種架構不會讓我們一個人去部署。在有了基礎環境和網絡環境之上我們就可以構建我們的k8s了。有了k8s集群之后我們還需要一個容器化的工作流系統。即確保我們的工作負載能運行起來。即有一個正常的容器運行環境(Containized Worload)。但是不管怎么講這一套環境中我們還需要用到另外的兩個服務。比如鏡像服務(images registry)。另外為了管理我們的集群,我們還需要編排服務(provisioning Configuration)。接着對整個集群來講我們都需要做監控,都要記錄日志,即還需要監控系統((monitoring))和日志系統(logging)。如果可以的話k8s服務發布后還要有外置的負載均衡器(Load balancer)。另外我們還需要公建倉庫(Artifact factory)。另外我們還需要自動化工具(Build Automation)。並且還有自動化發布工具(Rlease Automation )等。如果這個一整套環境組合完成了叫Paas,即平台即服務的環境。Openshit就是這一整套的解決方案。
2、PaaS實際生產使用時的注意事項,本k8s集群學習博客未進行記錄的知識點,后續需進行深入了解
master 節點高可用
kubernetes Federation (k8s集群聯合,類似於雙機房效果,通過Federation Api進行聯合 )
priorityClass 優先級類別,定義哪些pod應該優先被啟動等
limitRange 資源限制范圍
PSP :pod 安全策略
SecurityContext 安全上下文